今天在写代码的时候把之前用在51上的按键代码移植过来,发现在调用数组的地方会出现标红并提示数组使用越界但是实际使用并没有出现越界,后面我改成变量后仍然出现数组越界的提示。标红出不能调试且代码效果貌似也无法顺利实现。
上面是数组的定义和后面修改成变量后的提示
今天在写代码的时候把之前用在51上的按键代码移植过来,发现在调用数组的地方会出现标红并提示数组使用越界但是实际使用并没有出现越界,后面我改成变量后仍然出现数组越界的提示。标红出不能调试且代码效果貌似也无法顺利实现。
上面是数组的定义和后面修改成变量后的提示
最后那个截图,254、255行语法应该是有问题没有用数组下标访问[3]而是_3?再说了[3]的数组上限是var[2]吧?
前面的截图也有问题的话,有没有可能数组没有初始化?有没有可能中括号不是ASCII的而是中文的中括号?
s.led也没有看到你是如何声明、定义、初始化的…
现在做modbus通讯一直用结构体数组,也没出现过类似问题,要不要关掉软件重新打开有可能又不报错了呢?
最后的那个截图是我为了确认去掉数组用变量代替做的,就是把数组用变量代替,前面两张是原来的数组的最后一张和前面两张不是一起的或者说最后一张是前面两张改的。数组的初始化的话结构体的数组初始化应该怎么做?本人小白还希望指点一下。最后结构体的声明和定义是我没有说清楚现在补发。目前这个问题出现了有两天了,因为没有影响到其他功能所以我都在调试其他的功能,中间也关过电脑但还是会出现。另外我也试过将数组移出来单独做全局但是还是提示越界。
typedef struct{ uint16_t colour_r; uint16_t colour_g; uint16_t colour_b; uint16_t colour_w; uint8_t diy_mode; uint8_t rainbow_x; uint8_t rainbow_flag; uint8_t menu_arrows; uint16_t colour_r_pre; uint16_t colour_g_pre; uint16_t colour_b_pre; uint16_t colour_w_pre; uint8_t num_show_mode; ) uint8_t menu_now_show; uint8_t m_save_progVal; uint8_t m_key_stat_flag; uint8_t m_key_long_flag; uint8_t rainbow_run_tick; uint8_t rainbow_run_speed; uint8_t led_refresh_flag; uint8_t oled_refresh_flag; uint8_t led_rainbow_count[3]; uint16_t m_key_long_count[3]; } LED_STRUCT; LED_STRUCT s_led;//led操作结构体
具体操作就是上面这样在声明了s_led后就直接使用了
后面实际测试没有影响程序,但是debug不了并且随着代码的编写换了一处地方。这个就没有办法避免吗它一直标红在那
您好,您按照下图清除一下,另外不能DEBUG应该和这个无关,详细的debug出错信息和工程方便的话可以发送到邮箱yangy@wch.cn这边来查找下问题。
typedef struct { uint8_t COIL[REG_COILS_SIZE / 8+1]; uint8_t DISC[REG_DISC_SIZE / 8+1]; uint16_t HOLD[REG_HOLDING_NREGS+1]; uint16_t INPT[REG_INPUT_NREGS+1]; }DB_Slave; volatile DB_Slave DB1={0};
我这边是这样用的,没发现有报错,使用过程中也没发现有啥问题。
因为曾经用过一个品牌的单片机在定义变量是没有初始化就直接使用,查了很久才查出来没有初始化的原因,现在定义变量都习惯直接初始化,安心放心舒心很多。
MRS有时候总是有些乱七八糟的问题很让人无语的...
比如有时候好好的打开项目就一堆报错,这时候关掉软件重启后再打开项目编译又没有报错了...
又比如仿真过程中如果突然卡死无响应,关掉软件再开发现仿真还是有问题,所以现在都是用串口输出log都尽量不用仿真....