ESP32 C++开发中结构体数组赋值出现operator=不匹配报错如何解决
报错根因
你使用的Arduino ESP32编译环境默认遵循的C++标准,不支持已完成初始化的局部聚合结构体直接用大括号初始化列表赋值。你当前是先声明了Station Stats[2]数组(这一步已经完成了数组元素的默认初始化),后续再用大括号给已存在的元素赋值,不符合语法要求。
另外你代码里还有电台切换相关的逻辑错误,后面会同步修复。
修复方案
推荐采用「声明数组时直接初始化」的方式修改setup内的代码,不需要改动其他逻辑,兼容性最好:
void setup() { Serial.begin(9600); //初始化电台结构体数组 struct Station{ char name[15]; char URL[130]; }; // 声明数组的同时完成初始化,不需要后续单独赋值 Station Stats[2] = { {"BBC 6Music", "http://stream.live.vc.bbcmedia.co.uk/bbc_6music"}, {"BBC Rad4", "http://stream.live.vc.bbcmedia.co.uk/bbc_radio_fourlw"} }; connectToWiFi(); audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); audio.setVolume(5); audio.connecttohost(Stats[statIndex].URL); }
如果确实需要后续单独给数组元素赋值,可把Station结构体的定义移动到setup函数外部作为全局类型,即可支持大括号赋值操作。
其他逻辑问题修复
你当前的电台切换功能存在两个错误,无法正常使用:
statIndex是setup内的局部变量,changeStat函数无法访问,需要把statIndex的定义移动到全局作用域changeStat函数内部重复定义了局部变量statIndex,修改的是临时变量,不会生效
修复后的对应代码如下:
// 把statIndex定义为全局变量 int statIndex = 0; //切换电台函数 void changeStat() { statIndex = (statIndex+1)%2; // 切换后要重新连接新电台,你可以根据自己的触发逻辑加这行 // audio.connecttohost(Stats[statIndex].URL); };
如果要让changeStat能访问到Stats数组,也需要把Stats数组或者Station类型移到全局,根据自己的代码结构调整即可。
内容的提问来源于stack exchange,提问作者FinSmy
相关产品推荐
相关产品推荐

