Serial.println更改函数的返回值(Arduino)

时间:2014-03-22 19:10:49

标签: c++ function arduino

我从一个非常简单的函数中经历了一些非常奇怪的行为:一个整数传递给函数,并且根据它的值将返回一个特定于该整数的unsigned char。

我一直遇到一个问题,它会向那些硬编码到函数中的值返回一个不同的值。我已经多次重写代码以使其停止发生,但我已经找到了一种方法来重新创建它,以便说明不应该改变返回值的事情。< / p>

下面是一个示例草图来说明:

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上运行草图并注释掉此行,则Serial.println函数中的setup调用将返回值14(这是正确的)。

但是,如果您取消注释第7行,Serial.println函数中的setup调用现在将返回看似随机值的内容;对于我的上一次测试,它是值91;请参阅下面的串行窗口日志:

14 Break it... 91

正如您所看到的,我的第一次尝试返回14,但随后使用额外Serial.println调用的尝试导致返回值被更改。

有谁知道这里可能出现的问题?还有其他我设法复制过的东西,但这是最简单的一个例子。它几乎就好像,如果函数花费的时间稍长一些,那么返回值会被损坏一些。

非常感谢任何帮助或想法。

1 个答案:

答案 0 :(得分:2)

您正在从函数brokenFunction(int id)返回一个本地数组,该函数在您返回时停止存在,从而导致从该点开始的未定义行为。