C++ 尝试验证代码([-waggresive循环优化])时出现一些错误(仅覆盖相关通道)
我试图用这个代码制作平衡机器人,我看到了很多关于这个项目的教程视频和相同的代码,但是没有人在Arduino IDE中验证代码时遇到这个错误,所以我认为问题不在代码中,而在我身上 我尝试了一个旧版本的ArduinoIDE(1.6.12),但仍然出现了相同的错误C++ 尝试验证代码([-waggresive循环优化])时出现一些错误(仅覆盖相关通道),c++,arduino,arduino-ide,arduino-nano,C++,Arduino,Arduino Ide,Arduino Nano,我试图用这个代码制作平衡机器人,我看到了很多关于这个项目的教程视频和相同的代码,但是没有人在Arduino IDE中验证代码时遇到这个错误,所以我认为问题不在代码中,而在我身上 我尝试了一个旧版本的ArduinoIDE(1.6.12),但仍然出现了相同的错误 sketch\RX.cpp: In function 'computeRC()': sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Wa
sketch\RX.cpp: In function 'computeRC()':
sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Waggressive-loop-optimizations]
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
~~~~~~~~~~~~~^
sketch\RX.cpp:412:25: note: within this loop
for (chan = 0; chan < RC_CHANS; chan++) {
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
sketch\RX.cpp:435:26: warning: iteration 8 invokes undefined behavior [-Waggressive-loop-optimizations]
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
^
sketch\RX.cpp:412:25: note: within this loop
for (chan = 0; chan < RC_CHANS; chan++) {
^
Sketch uses 14300 bytes (46%) of program storage space. Maximum is 30720 bytes.
Global variables use 1022 bytes (49%) of dynamic memory, leaving 1026 bytes for local variables. Maximum is 2048 bytes.
sketch\RX.cpp:在函数“computeRC()”中:
sketch\RX.cpp:435:26:警告:迭代8调用未定义的行为[-waggresive循环优化]
如果(rcSerial[chan]>900){rcData[chan]=rcSerial[chan];}//仅覆盖相关通道
~~~~~~~~~~~~~^
草图\RX.cpp:412:25:注意:在此循环内
对于(chan=0;chan900){rcData[chan]=rcSerial[chan];}//仅覆盖相关通道
^
草图\RX.cpp:412:25:注意:在此循环内
对于(chan=0;chan
代码中有许多to文件,因此我将从错误中删除该部分
/**************************************************************************************/
/*************** compute and Filter the RX data ********************/
/**************************************************************************************/
void computeRC() {
static uint16_t rcData4Values[RC_CHANS][4], rcDataMean[RC_CHANS];
static uint8_t rc4ValuesIndex = 0;
uint8_t chan,a;
#if !defined(OPENLRSv2MULTI) // dont know if this is right here
#if defined(SBUS)
readSBus();
#endif
rc4ValuesIndex++;
if (rc4ValuesIndex == 4) rc4ValuesIndex = 0;
for (chan = 0; chan < RC_CHANS; chan++) {
#if defined(FAILSAFE)
uint16_t rcval = readRawRC(chan);
if(rcval>FAILSAFE_DETECT_TRESHOLD || chan > 3 || !f.ARMED) { // update controls channel only if pulse is above FAILSAFE_DETECT_TRESHOLD
rcData4Values[chan][rc4ValuesIndex] = rcval; // In disarmed state allow always update for easer configuration.
}
#else
rcData4Values[chan][rc4ValuesIndex] = readRawRC(chan);
#endif
#if defined(SPEKTRUM) || defined(SBUS) // no averaging for Spektrum & SBUS signal
rcData[chan] = rcData4Values[chan][rc4ValuesIndex];
#else
rcDataMean[chan] = 0;
for (a=0;a<4;a++) rcDataMean[chan] += rcData4Values[chan][a];
rcDataMean[chan]= (rcDataMean[chan]+2)>>2;
if ( rcDataMean[chan] < (uint16_t)rcData[chan] -3) rcData[chan] = rcDataMean[chan]+2;
if ( rcDataMean[chan] > (uint16_t)rcData[chan] +3) rcData[chan] = rcDataMean[chan]-2;
#endif
//if (chan<8 && rcSerialCount > 0) { // rcData comes from MSP and overrides RX Data until rcSerialCount reaches 0
//rcSerialCount --;
#if defined(FAILSAFE)
failsafeCnt = 0;
#endif
if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
//}
}
#endif
}
/**************************************************************************************/
/***************计算并过滤接收数据********************/
/**************************************************************************************/
void computeRC(){
静态uint16_t rcdata4值[RC_CHANS][4],rcDataMean[RC_CHANS];
静态uint8_t RC4值索引=0;
陈宇庭,a;
#if!defined(OPENLRSv2MULTI)//不知道是否在这里
#如果定义(SBU)
readSBus();
#恩迪夫
rc4ValuesIndex++;
如果(rc4ValuesIndex==4)rc4ValuesIndex=0;
对于(chan=0;chanFAILSAFE_-DETECT_-TRESHOLD | | chan>3 | | |!f.ARMED){//仅当脉冲高于FAILSAFE_-DETECT_-TRESHOLD时更新控制通道
rcData4Values[chan][rc4ValuesIndex]=rcval;//处于解除防护状态时,允许始终更新easer配置。
}
#否则
rcData4Values[chan][rc4ValuesIndex]=readRawRC(chan);
#恩迪夫
#如果定义(SPEKTRUM)| |定义(SBUS)//SPEKTRUM和SBUS信号无平均值
rcData[chan]=rcData4Values[chan][rc4ValuesIndex];
#否则
rcDataMean[chan]=0;
对于(a=0;a>2;
如果(rcDataMean[chan]<(uint16_t)rcData[chan]-3)rcData[chan]=rcDataMean[chan]+2;
如果(rcDataMean[chan]>(uint16_t)rcData[chan]+3)rcData[chan]=rcDataMean[chan]-2;
#恩迪夫
//如果(chan 0){//rcData来自MSP并覆盖RX数据,直到rcSerialCount达到0
//连续计数--;
#如果已定义(故障保护)
failsafeCnt=0;
#恩迪夫
如果(rcSerial[chan]>900){rcData[chan]=rcSerial[chan];}//仅覆盖相关通道
//}
}
#恩迪夫
}
发生此错误是因为索引chan
(运行到RC\u CHANS
)大于数组rcSerial
(8)的大小
错误行周围的部分检查
if(chanthanks..错误消失了。但是你认为它是否会在项目的后期导致问题?@avtar550似乎开发人员仍然活跃在GitHub中,你应该用你的发现提出一个问题,他会发现为什么它被注释掉。