找回密码
 立即注册
查看: 1532|回复: 4

stc32编译警告是什么原因

[复制链接]

该用户从未签到

1

主题

1

回帖

251

积分

中级会员

积分
251
发表于 2023-3-3 11:11:02 | 显示全部楼层 |阅读模式
本帖最后由 jingboxu 于 2023-3-3 11:13 编辑


在官方演示程序中“37-2.4寸ILI9341驱动TFT显示屏实验程序“编译报告警告

..\GUI\gui.c(469): warning C188: 'parameter 2': value truncated
..\GUI\gui.c(479): warning C188: 'parameter 5': value truncated

请教这个是官方演示程序中的编译时警告是什么原因?

请教这个是官方演示程序中的编译时警告是什么原因?

请教这个是官方演示程序中的编译时警告是什么原因?
回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    13 小时前
  • 签到天数: 136 天

    [LV.7]常住居民III

    26

    主题

    1316

    回帖

    4101

    积分

    论坛元老

    积分
    4101
    发表于 2023-3-3 11:20:12 | 显示全部楼层
    提示传递参数类型跟函数定义不一致,参数内容可能会被截取。
    例如将16位变量传递给8位类型参数的函数,那么高8位数据被截取,只传递低8位数据到函数。

    该用户从未签到

    4

    主题

    27

    回帖

    116

    积分

    注册会员

    积分
    116
    发表于 2023-7-9 09:29:18 | 显示全部楼层
    关于C188警告的详细测试程序段, 按照指示添加并编译后就可以在KEIL C251中进行软件仿真测试(ctrl+F5):
    显示强制类型转换操作 可以消除 C188 告警,但是使用者需要自己当心转换中数据截断操作是否满足自己的要求!

    //将以下程序行添加到一个C251工程中的 main.c 中的 #include <xxx>之后,且是main()函数之外
    //变量定义
    u8        u8_i, u8_k;
    u16        u16_k;

    //函数声明
    u8        add_x_y(u8 x);
    u16        add1_x_y(u16 x);

    //函数代码
    u8        add_x_y(u8 x)
    {
            return(x+1);
    }

    u16        add1_x_y(u16 x)
    {
            return(x+1);
    }

    //将以下程序行添加到一个C251工程中的 main()函数中的 RSTFLAG |= 0x04; 之后
    //测试 L188 的程序段
            u8_i = 1;
            u8_k = add_x_y(u8_i+1);        //这里回产生 C188 编译警告, 是因为C251编译器默认是常数 1 为 双字节类型,而函数调用定义的参数类型是u8,存在数据截断,故产生警告!
                                                    //运行结果  u8_k =3 正确
           
            u8_k = add_x_y((u8)(u8_i+1));        //这里对(u8_i+1)先行进行显式强制类型转换,则不会产生 C188 编译警告
                                                    //运行结果  u8_k =3 正确
           
            u8_i = 1;
            u16_k = add1_x_y(u8_i+0x1234L);        //这里参数值相加后有效数值实际也是u16类型,不会产生数据字节的截断,则 不 会产生 C188 编译警告
                                                                    //运行结果  u16_k =0x1236 正确

            u16_k = add1_x_y(u8_i+0x12345678L);        //这里参数值相加后已经是4字节,而函数调用定义的参数类型是u16,存在数据截断,故产生 C188 警告!
                                                                    //运行结果  u16_k =0x567A 正确
                                                                                                   
            u16_k = add1_x_y((u16)(u8_i+0x12345678L));        //这里参数值相加后已经是4字节,而函数调用定义的参数类型是u16,由于存在显式强制类型转换,则不会产生 C188 编译警告
                                                                    //运行结果  u16_k =0x567A 正确
    ////

    //END OF ALL
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    19 小时前
  • 签到天数: 130 天

    [LV.7]常住居民III

    1

    主题

    106

    回帖

    1865

    积分

    金牌会员

    积分
    1865
    发表于 2023-11-24 14:31:49 | 显示全部楼层
    我也遇到了和UP同样的问题,按几位的方法,我也修改成功了。

    修改点

    修改点
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    19 小时前
  • 签到天数: 130 天

    [LV.7]常住居民III

    1

    主题

    106

    回帖

    1865

    积分

    金牌会员

    积分
    1865
    发表于 2023-11-24 14:34:43 | 显示全部楼层
    机灵小老鼠 发表于 2023-7-9 09:29
    关于C188警告的详细测试程序段, 按照指示添加并编译后就可以在KEIL C251中进行软件仿真测试(ctrl+F5):
    显 ...

    用实例证明:这样分析的非常仔细,点赞点赞
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-9 22:28 , Processed in 0.086974 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表