C语言碰到一个奇怪的问题了

[复制链接]
 楼主| hclwj181 发表于 2019-2-27 16:33 | 显示全部楼层 |阅读模式
void abc()
{
  u8 i,temp3,temp2;
       temp3= length1;
       temp2 = length2;
        for (i = 0; i < temp3; i++)
        {
                addrval[i] = P16BIT[addr2+i];
        }
        for (i = 0; i < temp3; i++)
        {
                P16BIT[addr2+temp2+i] = addrval[i];
        }
}
void abc()
{
  u8 i,temp3,temp2;
temp3= length1;
       temp2 = length2;
        for (i = 0; i < temp3; i++)
        {
                P16BIT[addr2+temp2+i] = P16BIT[addr2+i];
        }
}
请教下各位大侠,上面两个简单的函数有什么区别了,addrval和P16BIT都是16bit的全局变量数组,使用上面那个结果是正确的,下面那个老是不对,调试了N多次,思考了半天始终觉得两个程序结果应该是一样的,可是下面那个就是不对,用上面那种写法就可以,崩溃中
kingkits 发表于 2019-2-27 16:47 | 显示全部楼层
当length2<length1时,数组后面的数据会有一部分数据丢失了,原因是你执行时,那部分被之前的操作覆盖了
wono01 发表于 2019-2-27 16:50 | 显示全部楼层
提问都不会提问,你把你做了哪些测试,测试的输入输出是啥,这样才能帮你看
另外你觉得不对直接把每次循环打出来就是了
你瞅啥 发表于 2019-2-27 17:08 | 显示全部楼层
P16BIT[addr2+i]在循环中已经被改动了。
 楼主| hclwj181 发表于 2019-2-27 17:22 | 显示全部楼层
本帖最后由 hclwj181 于 2019-2-27 17:28 编辑

哦,是你说的这样,值在移动的时候给覆盖掉了,怪不得下面那种,每次都不对了,又犯了低级错误。有没有什么办法不覆盖又不用两次循环了
 楼主| hclwj181 发表于 2019-2-27 17:27 | 显示全部楼层
你瞅啥 发表于 2019-2-27 17:08
P16BIT[addr2+i]在循环中已经被改动了。

是啊,明白了,改动之后又赋值给了前面的了,加个中加变量,就没有。想问下有没有更好的办法不覆盖又不需要使用两次循环了
你瞅啥 发表于 2019-2-27 17:50 | 显示全部楼层
hclwj181 发表于 2019-2-27 17:27
是啊,明白了,改动之后又赋值给了前面的了,加个中加变量,就没有。想问下有没有更好的办法不覆盖又不需 ...

把 for (i = 0; i < temp3; i++)
改成 for (i = temp3; i >0; i--)
mcu5i51 发表于 2019-2-28 09:58 | 显示全部楼层
减法循环就可以了吧,只要定稿的位置是没用的“空位”就行
cjseng 发表于 2019-2-28 10:37 | 显示全部楼层
小狗转着圈咬自己的尾巴,把尾巴咬掉了
chenyong123 发表于 2019-2-28 10:50 | 显示全部楼层
本帖最后由 chenyong123 于 2019-2-28 13:22 编辑

把length2改成比length1大的值就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

721

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部