【发布时间】:2014-03-22 19:10:49
【问题描述】:
我一直在经历一些非常奇怪的行为,这应该是一个非常简单的函数:一个整数被传递给函数,并且根据它的值将返回一个特定于该整数的无符号字符。
我一直遇到一个问题,它会返回与硬编码到函数中的值不同的值。我不得不多次重写代码才能让它停止发生,但我找到了一种每次都重新创建它的方法,以说明不应该改变返回值的事情是如何做的。
下面是一个示例草图来说明:
unsigned char* brokenFunction(int id)
{
switch (id)
{
case 0:
{
//Serial.println("Break it...");
unsigned char retval[8] = {
0b01110,
0b11011,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b11111
};
return retval;
}
break;
case 5:
{
unsigned char retval[8] = {
0b01110,
0b11011,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
return retval;
}
break;
}
}
void setup()
{
Serial.begin(9600);
unsigned char* array = brokenFunction(0);
Serial.println(*array);
}
void loop()
{
}
第 7 行是对 Serial.println 的调用,目前已被注释掉。如果您在 Arduino 上运行草图并注释掉这一行,setup 函数中的Serial.println 调用将返回值14(这是正确的)。
但是,如果取消注释第 7 行,setup 函数中的 Serial.println 调用现在将返回看似随机的值;对于我的最后一次测试,它的值是91;请参阅下面的串行窗口日志:
14
Break it...
91
如您所见,我的第一次尝试返回 14,但随后尝试使用额外的 Serial.println 调用导致返回值被更改。
有人知道这里可能出了什么问题吗?我做的其他事情也设法复制了这一点,但这是最简单的例子。几乎就好像,如果函数需要更长的时间才能完成,那么返回值会以某种方式被破坏。
任何帮助或想法将不胜感激。
【问题讨论】: