Arduino,将数组 pointer/reference(?) 传递到函数中,但得到了错误的数据?

Arduino, Passing array pointer/reference(?) into function, but getting bad data?

TL;DR 我想我错误地将数组传递给函数,因此从中读取的数据不正确,导致它可能破坏 Arduino 内存。

可以找到完整代码>here<


经过一些阅读,我仍然有点困惑将数组传递给函数并在该函数中修改其数据的最佳方法。

到目前为止,这 2 个问题有点帮助,因此允许我的代码编译;但经过一些测试后,我遇到了一些问题,即当我在函数中时,我期望看到的数据没有被正确读回。

Array/pointer/reference confusion

Passing an array by reference in C?

基本程序...

它点亮了 3 个基色为紫色的 LED 灯带(在初始淡化后,每个灯一个一个地亮起),然后沿着灯带制作一种颜色拖尾效果(7 像素长),然后从重新开始。

效果视频可以看这里https://www.youtube.com/watch?v=S8tVfFfsiqI

我打算做同样的效果,但我已经尝试重构我的代码,以便每个人都可以更轻松地调整颜色参数。

原始源代码可以在这里找到>Click to View< (随意copy/modify/use代码,任何人都可以使用,真的很有趣)

我现在想做什么...

所以现在的目标是重构上面的代码,以便更容易根据用户的喜好设置Trail效果颜色。因此,我想在别处定义轨迹的颜色,然后将轨迹的每个实例都传递给处理更新它的函数(这是在不使用 类 的情况下完成的,只是结构和数组,因为这对非此代码针对的编程类型)

//Setting up Trail effect length
#define TRAIL_LENGTH 7

typedef struct Color {
byte r;
byte g;
byte b;
};

typedef struct TrailPixel {
uint16_t position;
Color color;
};

//Function Prototypes
void trailEffectForward (Adafruit_NeoPixel &strip, struct TrailPixel (*trailArray)[TRAIL_LENGTH] );

//Make the arrays
TrailPixel trailLeft[TRAIL_LENGTH];
TrailPixel trailBottom[TRAIL_LENGTH];
TrailPixel trailRight[TRAIL_LENGTH];

因此,正如您从上面看到的,我创建了两个结构体,然后为这些结构体创建了 3 个数组。然后,我用...

填充每个轨迹效果的 "position" 值
for (int i = 0; i < TRAIL_LENGTH; i++) {
    trailLeft[i].position = i + 5; //start just off the strip
    trailBottom[i].position = 15 - i; //start off screen, but timed in a way so to look like the Left and Right trails converge onto the bottom at the same time
    trailRight[i].position = i + 5; //start just off strip
}

稍后在代码中,我调用了我想要处理效果的函数,并将数组的细节交给它。我想在这个函数里面,命令更新灯带上的像素颜色,然后更新位置以供下次使用。

但是事情变得非常快,以至于我的 Arduino 每隔几秒就会重新启动一次,并且颜色没有按预期表现。

这里是我目前调用trail effect函数的方式...

trailEffectForward  ( stripBottom , &trailBottom );

为了弄清楚发生了什么,我添加了一些串行输出来检查值。

void trailEffectForward(Adafruit_NeoPixel &strip, TrailPixel (*trailArray)[TRAIL_LENGTH]) {

Serial.println("---------------------");
Serial.println(trailArray[0]->position);
Serial.println(trailArray[1]->position);
Serial.println(trailArray[2]->position);
Serial.println(trailArray[3]->position);
Serial.println(trailArray[4]->position);
Serial.println(trailArray[5]->position);
Serial.println(trailArray[6]->position);

我希望如果事情按计划进行,我会看到数字

---------------------
15
14
13
12
11
10
9

但我最终得到的是这个:(

---------------------
15
5
5
43
1000
0
0

可以找到当前处于 Work In Progress 状态的完整代码 http://chiggenwingz.com/quads/ledcode/quad_leds_v0.2workinprogress.ino

注意:我已经注释掉了很多将颜色应用于像素的内容,因为我试图缩小出现问题的范围。基本上我希望上面列出的输出停止发生。

再次随意在您自己的项目中使用任何代码:)

好的,看来我从这里找到了答案[Passing an array of structs in C]

所以之前的功能是这样的...

void trailEffectForward(Adafruit_NeoPixel &strip, TrailPixel (*trailArray)[TRAIL_LENGTH])

现在是这个

void trailEffectForward(Adafruit_NeoPixel &strip, struct TrailPixel trailArray[TRAIL_LENGTH] )

摆脱了整个 pointer/reference 有趣的东西。我相信必须把 "struct" 这个词放在那里。

所以当我调用函数时,我之前使用...

trailEffectForward  ( stripBottom , &trailBottom );

但现在我用这个

trailEffectForward  ( stripBottom , trailBottom );

我不再有损坏的数据,一切似乎又在愉快地工作了。

希望这对未来几年的人有所帮助:)