【问题标题】:Serial.println changes return value of function (Arduino)Serial.println 改变函数的返回值(Arduino)
【发布时间】: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 调用导致返回值被更改。

有人知道这里可能出了什么问题吗?我做的其他事情也设法复制了这一点,但这是最简单的例子。几乎就好像,如果函数需要更长的时间才能完成,那么返回值会以某种方式被破坏。

任何帮助或想法将不胜感激。

【问题讨论】:

    标签: c++ function arduino


    【解决方案1】:

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

    【讨论】:

    • 如果无法先在函数内部构造值,您会如何建议我返回这些值?我将有相当多的可能返回的这些值,这就是为什么我将有一个函数来返回适当的值,这样它们就不会一次全部存储在内存中。例如,我可能有 30 个可能的返回值,但根据使用的上下文,只有一个需要存储在内存中。
    • @rastating 将数组传递给带有数组大小信息的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多