Arduino 的奇怪输出

Bizzare output from Arduinio

我正在尝试用 Arduino 做一些相对简单的事情(试图让一些灯像 Simon 说的游戏一样点亮)但是我得到了一些非常奇怪的输出

我在引脚上得到了一些非常奇怪的输出,所以我把代码的这些部分拿出来在串行监视器上查看它,看看保存灯(颜色)序列的数组的内容是什么。这对我来说真的没有意义。

我的代码应该做的是将 1-4 的随机数附加到颜色[]上,然后将它们读回串行监视器

bool lightValue[4] = { 0 };
  // stores whether each LED is lit or not
int buttonPressed;
  // 0 - no button pressed / nothing
  // 1 - red
  // 2 - yellow
  // 3 - green
  // 4 - blue
int colors[] = { 0 };
  // probably not the best name for this variable but oh well
  // stores all the colors displayed for the simon says
  // refer above to see what each number means
int colorNum = 0;
  // again not the best name, stores the number of colors displayed so far
  // AKA the length of colors[]
int randomNum;
  // will store a random number
// variables

void setup() {
  randomSeed(analogRead(0));
  Serial.begin(9600);
  Serial.println();
  Serial.println("PROGRAM START");
}
// pinModes. Lots of pinModes.

void loop() {
  randomNum = random(1,5);
  colors[colorNum] = randomNum;
  Serial.println();
  Serial.print(colorNum);
  Serial.print(" ");
  colorNum++;
  // adds another random color onto the end of the color sequence
  
  for (int i = 0; i < colorNum; i++) {
    Serial.print(colors[i]);
    delay(500);
  }
}

我得到的一些输出示例:

0 3
0 1
2 13520
3 145202
4 1552024
5 16520241
6 175202414
7 1852024141
8 19520241414
9 1105202414141
10 11152024141414

0 1
2 13520
3 145202
4 1552024
5 16520241
6 175202414
7 1852024141
8 19520241414
9 1105202414141
10 11152024141414

colorNum,由于某种原因,此循环的主要增量跳过了一个。第一个和第二个输出不匹配,数组中的第三个项目是 520,由于某种原因,第二个项目每一步递增 1。此外,由于某种原因它停在 10。

我唯一可以归咎于这种不一致行为的原因是访问了一些不应该访问的内存,但我无法在我的生活中彻底搞砸了。

int colors[] = { 0 };

定义了一个只有一个元素的整数数组0.

这里 colors[colorNum] = randomNum; 您要为 colorNum > 0 的数组之外的索引分配数字。您不应该这样做。此内存区域未保留给 colors!

那么谁会阻止您的编译器在颜色之后立即存储 colorNum?

因此,当您为 colors[1] 赋值时,您可以很好地更改 colorNum 的值。与您的循环控制变量 i.

相同

所以第二个值增加了,因为你增加了 colorNum,它与 colorNum[1].

位于相同的内存位置

缺少 colorNum == 1 的打印,因为您将 5 分配给 colors[2],它与循环控制变量 i 位于同一内存位置。由于 5 > colorNum 循环不 运行.

我刚刚在 32 位 C++ 编译器上做了这个: int 颜色[] = {0}; int 颜色数 = 0; int i = 0;

并打印地址:

colors[0] @ 0x7fff029a5ac4
colorNum  @ 0x7fff029a5ac8
colors[1] @ 0x7fff029a5ac8
i         @ 0x7fff029a5acc
colors[2] @ 0x7fff029a5acc

请注意,colorNum 仅在 colors[0] 之后的 4 个字节,与 colors[1]!

的地址相同

无论如何,你不应该首先在无限循环中填充内存。 您使用的是内存是有限资源的微控制器