我正在尝试用一个由5个对象组成的数组替换5个"Adafruit_NeoPixel“对象。换句话说,就是转换成这个:
Adafruit_NeoPixel strips_0 (LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_1 (LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_2 (LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_3 (LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_4 (LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800);如下所示:
Adafruit_NeoPixel strips[]
{
(LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800)
};当然,我已经修改了:
strips_0.begin();
strips_0.show();
(...)出自:
strips[0].begin();
strips[0].show();
(...)(到目前为止还好吗?)
问题出现在主循环中:
我已经更换了这个(效果很好)
for(int i=0; i <60 ; i++)
{
strips_0.setPixelColor (i,colors[0]);
strips_0.show();
strips_1.setPixelColor (i,colors[0]);
strips_1.show();
strips_2.setPixelColor (i,colors[0]);
strips_2.show();
strips_3.setPixelColor (i,colors[0]);
strips_3.show();
strips_4.setPixelColor (i,colors[0]);
strips_4.show();
delay(20);
shiftFirstNumbers(1); // modifies the value of colors[0]
}通过这个(它不再起作用):
for(int i=0; i <60 ; i++)
{ for(int j = 0;j<=4;j++)
{
strips[j].setPixelColor (i,colors[0]); strips[j].show();
}
delay(20); shiftFirstNumbers(1);
}这将使ESP32重新启动(并重新启动)
以下是我在控制台中看到的内容
99
Guru Meditation Error: Core 1 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x800de840 PS : 0x00060a30 A0 : 0x800de840 A1 : 0x3ffb1ee0
A2 : 0x00000007 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
A6 : 0x3ff56000 A7 : 0x00000000 A8 : 0x3ffc4348 A9 : 0x3ffb1ec0
A10 : 0x3ffbb208 A11 : 0x40085474 A12 : 0x00000006 A13 : 0x00000001
A14 : 0x00060420 A15 : 0x00000000 SAR : 0x0000001a EXCCAUSE: 0x00000014
EXCVADDR: 0x800de840 LBEG : 0x400de7ed LEND : 0x400de7fe LCOUNT : 0x00000000
Backtrace: 0x400de840:0x3ffb1ee0 0x400de83d:0x3ffb1f10 0x400de658:0x3ffb1f70 0x400d1d74:0x3ffb1f90 0x400e0c3d:0x3ffb1fb0 0x40089c61:0x3ffb1fd0
Rebooting...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5828
entry 0x400806ac(99是循环开始时的Serial.print(99) )
你知道我的代码出了什么问题吗?对不起,我是C++的新手,希望你能帮忙!
问候
发布于 2021-10-10 18:33:58
问得好。与C++对象混合在一起的C风格的数组非常棘手。这里使用的语法没有使用指定的三个参数调用类Adafruit_NeoPixel的构造函数:
Adafruit_NeoPixel strips[] {
(LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800),
(LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800)
};创建C++对象的C数组的正确方法是这样(请注意大括号,它强制初始化和调用构造函数):
Adafruit_NeoPixel strips[] {
{LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800},
{LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800},
{LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800},
{LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800},
{LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800}
};或者这样(显式调用构造函数):
Adafruit_NeoPixel strips[] {
Adafruit_NeoPixel(LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800)
};如果你对问题的根源感兴趣,那就是表达式(LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800)。这被视为一个逗号操作符,它按顺序计算所有逗号分隔的语句,并返回最后一个语句的值。因此,您的Adafruit_NeoPixel类是通过调用Adafruit_NeoPixel(NEO_GRB + NEO_KHZ800)来构造的,这可能会破坏它内部的一些重要内容。
考虑下面这段代码:
#include <iostream>
class Foo {
public:
Foo(int m, int n = -1): _m(m), _n(n) {}
int _m, _n;
};
int main() {
Foo farr[] {
(1, 2),
{3, 4}
};
for (int i = 0; i < 2; i++) {
printf("%d %d\n", farr[i]._m, farr[i]._n);
}
}你会期望它打印出来
1 2
3 4但它没有。相反,它会打印出来
2 -1
3 4这是因为第一个对象实际上是用Foo(2)构造的
https://stackoverflow.com/questions/69517393
复制相似问题