Arduino - 用 for 循环编写 int 数组不起作用

标签 arduino

我是一名大学生,所以我仍然在学习很多东西。我在做项目时遇到了一些有趣的事情。我有这段代码,当它没有放在 for 循环中时可以工作,但当它放在循环中时不起作用。我只是想了解为什么。这是我的代码:

void setup() {
  Serial.begin(9600);
  int a[8];
  for(int i=0;i<8;i++) {
    a[i]=pow(2,i);
  }

  for(int i=0;i<8;i++) {
    Serial.print(a[i]);
  }
}

void loop() {
}

下面是没有第一个 for 循环(数据被写入数组的地方)的相同代码:

void setup() {
  Serial.begin(9600);
  int a[8];
  a[0]=pow(2,0);
  a[1]=pow(2,1);
  a[2]=pow(2,2);
  a[3]=pow(2,3);
  a[4]=pow(2,4);
  a[5]=pow(2,5);
  a[6]=pow(2,6);
  a[7]=pow(2,7);
  for(int i=0;i<8;i++) {
    Serial.print(a[i]);
  }
}

void loop() {
}

第一段代码输出:

1
2
3
7
15
31
63
127

第二个代码输出:

1
2
4
8
16
32
64
128

有人知道吗?我真的很想知道为什么。

最佳答案

您正在经历浮点舍入。 2^4 实际上会给你一个接近 15.9999 的值,当它被分配给一个 int 时,它会将小数截断为 15。我建议在使用 2 的幂时进行移位操作,这样:

  for(int i=0;i<8;i++)
  {
    a[i]=(1 << i);
  }

如果您想了解位移位,请查看 here . 如果您想了解更多关于浮点舍入的信息,请查看here .

此外,如果您只想快速修复您的代码,使其更接近您所拥有的代码,我相信这也会起作用:

  for(int i=0;i<8;i++)
  {
    a[i]= (int) round( pow(2, i) );
  }

这将在将 float 结果转换为 int 之前对其进行适当舍入。

关于Arduino - 用 for 循环编写 int 数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44662193/

相关文章:

c++ - 使用STM32Cube IDE将代码从Arduino移植到stm32f100

c++ - Tinkercad 编写 Arduino C++ 代码时出现无用的错误

c - 最简单的桥接示例不起作用 - Arduino Yun

javascript - Socket.io - 旧版本的 app.js 到新版本的 socket.io

java - 莫尔斯电码解码器处理适应问题

c++ - Arduino与C++串口通信同步

将日期指针与日期进行比较

string - Arduino:连接字符串时崩溃和错误

c# - 使用 .Net 写入 COM 端口

c++ - 从 arduino 读取到 c++ 程序时保持接收 NULL