功能相同的代码,不同的结果
Functionally identical code, different results
我有 2 段代码,它们做完全相同的事情,但其中一段实际上不起作用。 谁能解释为什么?
该代码通过spi将数据发送到运行显示器的FPGA。 我几乎用完了芯片上的代码存储,所以我试图尽可能多地减少。 由于某种原因,下面的更改最终中断了,程序的其余部分与它完全相同。
//Looping to execute code twice doesnt work
for (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 does
for (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
可能会更改外循环的计时。 例如,如果byte
是比int
小的类型,则对字节的操作可能涉及与int
之间的转换)。 - 实质上,您已经将重复的语句序列替换为内部循环。根据优化设置,编译器可能会展开循环(实际上生成与第一个代码示例相同的行为),也可能不会。 如果编译器不展开循环,循环构造本身的开销(初始化变量
k
,在每次迭代时检查和递增它等)会影响代码的计时。
如果依赖于满足特定时序约束的此代码,则需要在某处记录。 如果没有记录需求,我建议您记录它(例如,将其作为特定需求输入),然后记录派生的需求(例如,一个使用int
来控制外部循环的要求 [如果需要]和另一个要求在代码中展开内部循环而不是依赖于编译器优化)。
...由于某种原因打破...
从来都不是好事,如果有什么东西"坏了",它会对不同的草图产生不同的影响。
reg[j] -= 1;
例如,如果这很痛苦,因为 j 是越界的,无论是否存在变量 k,它都可能产生不同的效果。
尝试隔离问题并使其可重现... 我敢打赌问题不在于发布的部分。 ;)
在您的原始帖子中:"...我几乎用完了芯片上的代码存储......"。 你的内存怎么样? 我有一次在自己的代码中看到类似的东西是当我用完 RAM 并且我的变量损坏堆栈或堆栈损坏我的变量时。 请记住,C/C++需要一些"工作"内存来跟踪所有内容。 变量从可用 RAM 的一端分配,堆栈从另一端分配。当您使用过多的 RAM 或函数嵌套得太深时,两者会相互碰撞并相互干扰/损坏。
|************ Available RAM ************|
| Variables >>>>>>>>>>>>>>>>!!<<< Stack |
Variables grow >
Stack grow <
Problem !!
相关文章:
- 这两个代码片段相似,但显示的结果不同
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- RapidXML - 代码创建意外结果
- 代码未在联机编译器上显示结果
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- C++位移位在相反方向上具有相同的常量,结果不同,代码更改很小
- 我的代码厨师提交显示错误的结果
- 如何查找导致结果不一致的代码
- 如何使用 c++ 将股票代码的结果添加到 poloniex 中的数组中?
- 我无法弄清楚我的代码未显示预期结果的问题
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- 为什么这两个相似的代码计算行列式的结果不同?
- 为什么这个C++程序在代码::块和在线 IDE 之间返回不同的结果?
- C++:汇编代码包含断言结果
- 有人可以解释一下'sizeof'在此代码中返回的结果吗
- 相同的代码在联机 IDE 和本地 IDE 中给出不同的结果
- 来自 open() 的返回结果代码之间的差异:25 与 3
- 我不小心没有使用std::ref——结果代码做了什么?
- Typename给出了奇怪的输入结果代码块
- 用c++运行一个进程,过滤输出,获取结果代码,同时获取系统错误