c – 功能相同的代码,不同的结果

c – 功能相同的代码,不同的结果,第1张

概述我有两段代码,完全相同,但实际上并没有.有谁能解释为什么? 代码通过spi将数据发送到运行显示器的FPGA.我几乎没有代码存储在芯片上,所以我试图尽可能地减少.由于某种原因,下面的变化最终破裂了,程序的其余部分与它完全相同. //Looping to execute code twice doesnt workfor (byte i = 0; i < 3; i++) { 我有两段代码,完全相同,但实际上并没有.有谁能解释为什么?

代码通过spi将数据发送到运行显示器的FPGA.我几乎没有代码存储在芯片上,所以我试图尽可能地减少.由于某种原因,下面的变化最终破裂了,程序的其余部分与它完全相同.

//LooPing to execute code twice doesnt workfor (byte i = 0; i < 3; i++)      {        temp2 = temp % 10;        temp /= 10;        temp2 |= 0x40;        for (byte k = 0; k < 2; k++)        {          SPI.transfer(reg[j]);          delayMicroseconds(10);          SPI.transfer(temp2);          delayMicroseconds(10);        }        reg[j] -= 1;      }

.

//But copy-paste doesfor (int i = 0; i < 3; i++)          {            temp2 = temp % 10;            temp /= 10;            temp2 |= 0x40;            SPI.transfer(reg[j]);            delayMicroseconds(10);            SPI.transfer(temp2);            delayMicroseconds(10);            SPI.transfer(reg[j]);            delayMicroseconds(10);            SPI.transfer(temp2);            delayMicroseconds(10);            reg[j] -= 1;          }
解决方法 最可能的解释是,其他一些代码依赖于满足特定时序约束的循环,如果不满足则失败.

您引入的可能影响时间安排的变化包括:

>将i更改为byte类型而不是int类型.这可能会影响计时 – int通常是“本机”类型,通过各种措施可以使 *** 作更有效.使用字节可能会改变外部循环的时序.例如,如果byte是比int小的类型,则对字节的 *** 作可能涉及到int的转换和从int转换.
>基本上你已经用内循环替换了重复的语句序列.根据优化设置,编译器可能会展开循环(实际上产生与第一个代码示例相同的行为),或者它可能不会.如果编译器没有展开循环,则循环结构本身的开销(初始化变量k,在每次迭代时检查和递增它等)可能会影响代码的时序.

如果对符合特定时序约束的代码有所依赖,则需要在某处记录.如果没有记录要求,我建议你记录它(例如输入它作为特定要求),然后记录派生的要求(例如,一个要求使用int来控制外部循环[如果需要],另一个要求是内循环在代码中展开而不是依赖于编译器优化).

总结

以上是内存溢出为你收集整理的c – 功能相同的代码,不同的结果全部内容,希望文章能够帮你解决c – 功能相同的代码,不同的结果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225007.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存