KEIL编译提示warning C188: 'parameter 1': value truncated
我用AI8051U-32Bit芯片指令,且头文件选择“AI8051U.H”编译时有些函数语句会始终提示warning C188: 'parameter 1': value truncated,
但用STC89C52RC芯片指令,头文件选择“REG51.h”编译则一切正常。
附上出现该提示时的语句,麻烦各位大佬帮忙分析一下,看该如何操作才能避免这样子的错误警告。
//u8已经宏定义
#defineu8 unsigned char
#defineu16 unsigned int
#defineu32 unsigned int
提示框:
USER\oled.c(101): warning C188: 'parameter 1': value truncated
定位到的语句:
void OLED_Set_Pos(u8 x, u8 y) //坐标设置
{
x+=2;
OLED_WR_Byte(0xb0+y,OLED_CMD); <<<<<<这里就是定位到的出错语句
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f),OLED_CMD);
}
和其相关的函数:
void OLED_WR_Byte(u8 dat,u8 cmd) //写入函数
{
u8 i;
if(cmd) //发送命令/数据
OLED_DC_Set(); //发送数据
else
OLED_DC_Clr(); //发送指令
OLED_CS_Clr(); //片选选中状态
for(i=0;i<8;i++) //发送8位一字节的数据
{
OLED_SCL_Clr(); //时钟线置0,准备写入数据
if(dat&0x80) //获得高位数据
{
OLED_SDA_Set(); //高位为1,数据线置1
}
else
{
OLED_SDA_Clr(); //高位不为1,数据线置0
}
OLED_SCL_Set(); //时钟线置1,写入数据
dat<<=1; //将数据左移至最高位
}
}
另外该程序一共出现了多处相同的警告,都是跟有运算的参数相关。最终也能正常下载运行
".\Objects\SPI-7-AI8051U-32Bit" - 0 Error(s), 9 Warning(s).
希望大家帮我解答下这个困惑的问题,谢谢
OLED_CMD 应该是个超过u8位宽的定义所以告警?
数据被截断了,OLED_CMD如果定义成了枚举,或是16位的 定义的变量存在超出范围的风险,改成16位就可以
void OLED_Set_Pos(u16 x, u16 y) //坐标设置 void OLED_WR_Byte(u8 dat,u8 cmd) //写入函数
函数定义 参数dat是u8类型。
调用是传入的是u16类型。
OLED_WR_Byte(0xb0+y,OLED_CMD);
0xb0+y默认是int类型。
如果确定不超范围的话,可以强制转换
OLED_WR_Byte((u8)0xb0+y,OLED_CMD); 它提示的是参数1,也就是语句“OLED_WR_Byte(0xb0+y,OLED_CMD)”中的“0xb0+y”这个变量有问题,
我只能揣测它是担心数据计算后溢出而出现问题,因为定义的“y”是8位的,而“0xb0”也是8位,相加结果确实有超过256的可能。
如果真的这样,这软件设计还真挺贴心的。
最后我按照楼上hea老师的方法,强制转换成了u8,
弄成这样“OLED_WR_Byte((u8)(0xb0+y),OLED_CMD);”彻底没有提示了。
最后,谢谢老师们的热心帮助。
还有几天就要跨年2026了,希望大家撸起袖子加油干!收获满满,完美收官。
页:
[1]