我正在尝试将一些代码从Python转换为C.我已经完成了以下部分以外的所有工作。所有变量都被定义为int
s。我认为这个问题与指针和地址有关但我无法解决。
for(j=0; j<12; j++)
{
digitalWrite(CLOCK, 1);
sleep(0.001);
bit = digitalRead(DATA_IN);
sleep(0.001);
digitalWrite(CLOCK, 0);
value = bit * 2 ** (12-j-1); // error
anip = anip + value;
printf("j:%i bit:%i value:%i anip:%i", j, bit, value, anip);
}
错误为invalid type argument of unary ‘*’ (have ‘int’)
答案 0 :(得分:7)
C没有取幂运算符,我猜你做**
。
您可以使用例如pow
如果可以将浮点值的结果转换为整数。
答案 1 :(得分:7)
在C中,1<<i
是将i
提升为2的力量的最佳方法。
不使用ints
进行位操作,因为它们的大小因平台而异。使用uint32_t
中的/usr/include/stdint.h
。
答案 2 :(得分:2)
sleep()函数采用整数参数并等待指定的秒数。参数0.001
变为0
,这可能不是您想要的。相反,请尝试usleep(),它接受一个代表毫秒的参数。
其他答案将解决将任意数字提升为幂或2的幂的一般问题,但这是一个非常具体的案例。
循环的目的是从MSB到LSB串行读取11位并将它们转换为整数。您已经展示的实现尝试通过读取一点,将其移动到正确的位置并将结果累积到anip
来实现此目的。但是有一种更简单的方法:
anip = 0;
for (j=0; j<12; ++j) {
// Pulse the CLOCK line and read one bit, MSB first.
digitalWrite(CLOCK, 1);
usleep(1);
bit = digitalRead(DATA_IN);
usleep(1);
digitalWrite(CLOCK, 0);
// Accumulate the bits.
anip <<= 1; // Shift to make room for the new bit.
anip += bit; // Add the new bit.
printf("j:%i bit:%i anip:%i", j, bit, anip);
}
例如,假设前4位是1
,0
,0
,1
。然后输出
j:0 bit:1 anip:1
j:1 bit:0 anip:10
j:2 bit:0 anip:100
j:3 bit:1 anip:1001
当循环完成时,anip
将包含整个位序列的值。这是用于连续读取数据的相当标准的习惯用法。
虽然使用uint32_t
的建议通常是合适的,但C standard将int
定义为至少 16位,这超过了你的12位需要(包括符号位,如果anip
已签名)。此外,您可能正在为特定平台编写此内容,因此不担心可移植性。