1

我正在尝试将一些代码从 Python 转换为 C。除了下面的部分之外,我已经完成了所有工作。所有变量都定义为ints。我相信问题与指针和地址有关,但我无法解决。

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’)

4

3 回答 3

7

C没有指数运算符,我猜你就是这样做**的。

pow如果可以将结果从浮点值类型转换回整数,您可以使用例如。

于 2013-05-11T14:07:44.360 回答
7

在 C 中,1<<i是提高i到 2 次方的最佳方法。

不要用于位操作,因为它们的大小因平台而异ints使用uint32_t/usr/include/stdint.h.

于 2013-05-11T14:26:11.167 回答
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 标准定义int至少16 位,这比您需要的 12 位多(包括符号位,如果anip是有符号的)。此外,您可能正在为特定平台编写此代码,因此不必担心可移植性。

于 2013-05-11T15:02:18.487 回答