小编Lun*_*din的帖子

C/C++:通过值将带有成员数组的struct /类传递给函数

struct A{
  int V[100];
};


void f(A a)
{

  a.V[0]=30;
}

int main()
{
  A a;
  a.V[0]=10;
  f(a);
  cout<<a.V[0];
}
Run Code Online (Sandbox Code Playgroud)

我期望30作为输出,而不是我获得10.我知道,如果参数是通过值传递的,数组(也可以是类/结构的成员)通过引用传递.相反,当成员,他们通过副本传递.是真的?

c++ struct pass-by-reference pass-by-value

3
推荐指数
2
解决办法
1898
查看次数

K&R书籍练习4-2

我正在学习K&R书.我目前在第4章.我正在阅读第71页的atof()函数.函数atof(s)将字符串转换为其双精度浮点等效值.

atof()的代码如下:
// atof:将string s转换为double

double atof2(char s[])
{
   double val, power;
   int i, sign;

   for (i = 0; isspace(s[i]); ++i) //skip white space
       ;
   sign = (s[i] == '-') ? -1: 1;
   if (s[i] == '-' || s[i] == '-')
       ++i;

   for (val = 0.0; isdigit(s[i]); i++)
       val = 10.0 * val + (s[i] - '0');

   if (s[i] == '.')
       ++i;
   for (power = 1.0; isdigit(s[i]); i++) {
       val = 10.0 * val + (s[i] - '0');
       power *= …
Run Code Online (Sandbox Code Playgroud)

c kernighan-and-ritchie

3
推荐指数
1
解决办法
146
查看次数

具有相同索引的for循环的性能

在编码时我遇到了一个问题:

当我必须使用大量for循环时,所有迭代都在不同的范围内.如果我只将一个变量声明为索引(示例I)或者它根本不重要(示例II),那么性能(即运行时)会更好吗?

例I:

int ind;
for(ind=0; ind < a; ind++) { /*do something*/ }
for(ind=0; ind < b; ind++) { /*to something*/ }
...
for(ind=0; ind < z; ind++) { /*to something*/ }
Run Code Online (Sandbox Code Playgroud)

例二:

for(int ind=0; ind < a; ind++) { /*do something*/ }
...
for(int ind=0; ind < z; ind++) { /*do something*/ }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

c c++ indexing performance for-loop

3
推荐指数
1
解决办法
192
查看次数

是不同对齐指针UB之间的memcpy?

据我所知,以下代码在C11中表现出未定义的行为:

#include <string.h>

struct aaaa { char bbbb; int cccc; };

int main(void) {
    unsigned char buffer[sizeof(struct aaaa)] = { 0 };
    struct aaaa *pointer = &buffer[0];

    return (*pointer).cccc;
}
Run Code Online (Sandbox Code Playgroud)

根据N1570第6.5.3.2节第4条,

如果为指针分配了无效值,*则未定义一元运算符的行为.

附有一个澄清的脚注

在由一元运算*符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址.

它不太可能struct aaaa *并且unsigned char *具有相同的对齐,因此我们为其分配了无效值pointer,*pointer因此使用UB.

但是,我可以复制结构吗?

#include <string.h>

struct aaaa { char bbbb; int cccc; };

int main(void) {
    unsigned char buffer[sizeof(struct aaaa)] = { 0 };
    struct aaaa target;

    memcpy(&target, buffer, …
Run Code Online (Sandbox Code Playgroud)

c memcpy language-lawyer c11

3
推荐指数
1
解决办法
384
查看次数

C++:宏参数中可以有空格吗?

如果我定义一个带有参数的宏,如下所示。

#define define_int(a) int a;
Run Code Online (Sandbox Code Playgroud)

并提供一个参数,中间有空格,如下所示

define_int(* a)
Run Code Online (Sandbox Code Playgroud)

并得到输出?

int * a;
Run Code Online (Sandbox Code Playgroud)

有可能的使用

#define ASSIGN(A,B) B=A;
Run Code Online (Sandbox Code Playgroud)

我想直接使用这个宏从函数返回

ASSIGN(A, return B)
Run Code Online (Sandbox Code Playgroud)

这样它就会输出,

return B = A;
Run Code Online (Sandbox Code Playgroud)

c++ macros preprocessor

3
推荐指数
1
解决办法
5583
查看次数

EMV 读取 PAN 代码

我需要通过芯片读取每张可能卡的 PAN 代码。在我的工作中,我必须只使用 C,而且我没有可以帮助我完成这项无聊任务的例程。这就是我使用的 APDU 步骤:

1) 选择 1PAY.SYS.DDF01

00 A4 0400 0E 315041592E5359532E4444463031    
Run Code Online (Sandbox Code Playgroud)

然后00 C0 0000 22 315041592E5359532E4444463031从响应中读取所有数据。完整回复:

6f 20 e 84 31 50 41 59 2e 53 59 53 2e 44 44 46 30 31 a5 e 88 1 1 5f 2d 69 8 74 65 6e 66 72 65 73 90

2) READ RECORD 获取特定的 AID

00 B2 010C 00 
Run Code Online (Sandbox Code Playgroud)

完整回复:

70 17 61 15 4f 7 a0 0 0 0 4 30 60 50 …
Run Code Online (Sandbox Code Playgroud)

apdu emv

3
推荐指数
1
解决办法
3457
查看次数

PIC 18F45K42:如何将4个字节组合为Int?

我正在为 PIC 18F45K42 编写代码,以从 HCSD 卡读取 .wav 文件。我正在使用 MPLAB X IDE v5.20 和 XC v2.05。我正在使用 FATF 库从卡上读取数据。

我可以从卡上读取数据并获得良好的结果,直到组合代表 .wav 文件大小的 4 个字节。

#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte)  \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? …
Run Code Online (Sandbox Code Playgroud)

c embedded wav microchip pic18

3
推荐指数
1
解决办法
1053
查看次数

使用 &lt;stdatomic.h&gt; 在 C11 GCC 中使数据读/写原子化?

我从此处此处的 SO 线程等了解到,假设多线程应用程序中的数据读/写在操作系统/硬件级别是原子的是不安全的,并且可能会导致数据损坏。我想知道在 Linux 上使用 C11 库和 GCC 编译器来实现int变量原子读写的最简单方法。<stdatomic.h>

如果我当前int在线程中有一个分配:messageBox[i] = 2,如何使该分配原子化?同样适用于阅读测试,例如if (messageBox[i] == 2).

c multithreading atomic c11

3
推荐指数
1
解决办法
1422
查看次数

可以使用 C 将函数的存储位置存储到 RAM 中吗?

我一直在玩 C 语言的 Game Boy Advance 编码。为了使中断正常工作,必须将中断处理程序例程的地址手动复制到 RAM 位置 0x03007FFC。我知道如何在 ARM Assembly 中执行此操作,但不知道如何在 C 中执行此操作。我正在尝试这样的操作:

#define REG_INTERRUPT *(vu32*)0x03007FFC
void irqhandler()
{
    while(1){}
}

int main()
{
    REG_INTERRUPT = &irqhandler();

    while(1){}
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

但这不起作用。根据我对 C 函数的理解,C 似乎认为我正在尝试获取返回值的地址irqhandler(因为它是空的,所以没有返回值),这就是错误的来源。我如何告诉 C 我想要函数本身的内存位置?

c embedded arm game-boy-advance

3
推荐指数
1
解决办法
335
查看次数

为什么一行代码性能会下降 10 倍?

代码行

\n
next += val;\n
Run Code Online (Sandbox Code Playgroud)\n

性能下降到 10 倍,我检查了 ASM 代码,而不是结果。

\n

为什么这行代码会使性能下降 10 倍?

\n

结果如下:

\n
\xe2\x9e\x9c  ~ clang-13 1.c -O3\n\xe2\x9e\x9c  ~ ./a.out\nrand_read_1\nsum = 2624b18779c40, time = 0.19s\nrand_read_2\nsum = 2624b18779c40, time = 1.24s\n
Run Code Online (Sandbox Code Playgroud)\n

CPU:Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz

\n

这是代码:

\n
#include <stdio.h>\n#include <time.h>\n#include <stdint.h>\n#include <unistd.h>\n#include <string.h>\n#include <assert.h>\n#include <stdlib.h>\n\n#define CCR_MULTIPLY_64           6364136223846793005\n#define CCR_ADD_64                1\nstatic inline uint64_t my_rand64(uint64_t *r)\n{\n    *r = *r * CCR_MULTIPLY_64 + CCR_ADD_64;\n    return *r;\n}\n\n#define NUM 10000000UL\n\nuint64_t rand_read_1(uint64_t *ptr, uint64_t nr_words)\n{\n    uint64_t i, next, …
Run Code Online (Sandbox Code Playgroud)

c performance x86 clang

3
推荐指数
1
解决办法
192
查看次数