health 发表于 2026-1-30 18:23:45

i用无符号类型可以避免此类问题。
但是本例中for (i = 15; i >= 0; i--)这个表达式不能用无符号数。

自己写C51程序可以只使用基础语法,避免搞那些花活。
如果移植别的平台上成熟的软件库就得注意了,很多时候得逐字逐句斟酌。
简单移植一下能跑起来了,但时不时的内存漏一下,程序崩一下。


杨为民 发表于 2026-1-30 19:03:17

楼主的标题是“C251又出bug了,有关数组下标减法计算”:

(1)如果你的标题不是说C251出BUG,而是来论坛请教,那我会为你解惑答疑。
(2)既然你自认为有水平指责C251,那么我只能对你说:你真无知!你真狂妄!
(3)自信不需要用狂妄来证明,无知不可耻,因为可以学习,而且是每个学者必经的阶段,但无知还狂妄就是井底之蛙了!

杨为民 发表于 2026-1-30 19:05:17

Ayb_ice 发表于 2026-1-30 16:44
这是完整的汇编,应该没有问题的
; line 695: void write(u16 *dst, u16 dat)
      MOV      WR30,WR6


方法正确,看完整程序,不断章取义

health 发表于 2026-1-30 22:14:42

杨为民 发表于 2026-1-30 19:03
楼主的标题是“C251又出bug了,有关数组下标减法计算”:

(1)如果你的标题不是说C251出BUG,而是来论坛 ...

抱歉,我实在想不出来有什么可以向你请教的,如果以后有的话再请教。

health 发表于 2026-1-30 22:26:01

本来是实际项目中遇到的问题,在别的平台运行良好的代码,移植到C251后出现未预料的结果。
看C源程序没毛病,调试手段又不足,不断改程序,一行一行分析汇编代码,耗费几天才弄清楚原因。
论坛分享这个问题,提醒用户注意,尽量用别的写法代替,这也不算多狂妄吧。

health 发表于 2026-1-30 22:44:00

简化后的完整演示代码

uint16_t xdata buf;
void write(uint16_t *dst, uint16_t dat)
{
    int i;       
       
    for (i = 15; i >= 0; i--)
    {
        dst = dat;
    }
}
void main()
{
        int i;       
        write(buf, 0x1234);       
        while(1);
}

本意是向buf~buf写入固定数据0x1234,实际写到其它地址了。
dst不等于dst,dst不等于dst,,

杨为民 发表于 2026-1-30 22:45:24

health 发表于 2026-1-30 22:14
抱歉,我实在想不出来有什么可以向你请教的,如果以后有的话再请教。

你觉得你的水平比Keil这个大公司的C251编译器开发团队还高吗?

health 发表于 2026-1-30 22:47:12

杨为民 发表于 2026-1-30 22:45
你觉得你的水平比Keil这个大公司的C251编译器开发团队还高吗?

说话别这么阴阳怪气行吗?

杨为民 发表于 2026-1-30 22:54:28

health 发表于 2026-1-30 22:47
说话别这么阴阳怪气行吗?
比起你的狂妄自大,这算很有礼貌了!你敢回答这个问题吗?你自己心里有底吗?

health 发表于 2026-1-31 00:47:26

杨为民 发表于 2026-1-30 22:54
比起你的狂妄自大,这算很有礼貌了!你敢回答这个问题吗?你自己心里有底吗? ...

哪个问题?我的技术水平和keil公司谁高吗?
这个问题有点幼稚,我一点没有与keil公司比较水平高低的意思,也毫无与你比较水平高低的意思。
keil是编译器开发公司,我只是用户之一。在软件行业,从来没有要求测试人员和用户一定要比研发人员水平高。我们同时作为研发人员,也从来没有这种想法。

当然,对于这个问题,我可以给你一个满意的答复,在编译器开发水平上,我的水平完全不能和keil比,可以说是0和100的区别。
页: 1 [2] 3
查看完整版本: C251又出bug了,有关数组下标减法计算 | 这段程序对于C251来说是错误的程序 ?