0

我正在为我的 Arduino 编写一个 C++ 程序库。该库用于 DTMF 解码器。在将两个检测到和验证的音调一起添加以返回相应的按钮时,我遇到了问题。

我两次调用下面的函数(它还没有完全完成,但你会希望得到我的逻辑)。如果我将值 R1 和 R2 初始化为 0,那么它们会在第二次调用时相互覆盖。如果我根本不初始化它们,我会收到运行时检查错误。

我花了 40 多个小时试图弄清楚这一点(我是一个非常基础的程序员!)。任何帮助将不胜感激!

    int DTMF::validate(void)
    {
        int threshhold = 9000;
        int i;
        int x;
        int y;
    //  int high[7];

        for(i=0; i<7; i++)
        {
            if(magnitude[i] > threshhold)
            {
                return(i);  
            }
        }
    }

unsigned char DTMF::buttonPressed(void)
{
    int validatedFreq = validate();
    cout << "valid is returning: " << validatedFreq << endl;
    int R1;
    int R2;

    switch(validatedFreq)
    {

        case 0:
            R1=1;
            cout << "DEBUG:This is case 1 R1 output: " << R1 << endl;
            break;

        case 1:
            R1=2;
            break;

        case 2:
            R1=3;
            break;

        case 3:
            R2=4;
            cout << "DEBUG:This is case 3 R2 output: " << R2 << endl;
            break;

        case 4:
            R2=5;
            break;

        case 5:
            R2=6;
            break;

        case 6:
            R2=7;
            break;
    }

    if(R1==1 && R2==4)
    {
        cout << "DEBUG:The value of R1 is " << R1 << " and the value of R2 is " << R2 << endl;
        return(button[0]);
    }
}
4

3 回答 3

0

R1 和 R2 是局部变量,因为您在函数内部声明了它们。这意味着每次调用函数时都会初始化它们,并且每次调用时,R1 和 R2 都是两个新的 int 变量。

如果您希望它们的值在函数的不同调用之间保持不变,您可以将它们声明为static. 这使得它们每次运行程序时只初始化一次。你用

static int R2;

于 2013-04-20T16:56:18.517 回答
0

R1 和 R2 是 DTMF::buttonPressed 函数的本地和自动的,因此它们不会在调用之间持续存在。

如果您不初始化它们,则必须先分配它们,然后才能假定它们具有任何有意义的值。但是您的交换机只分配其中一个。但是您稍后会在下面假装同时使用它们if

在那一点上,您可以观察到的任何行为都是未定义的。

于 2013-04-20T16:58:59.607 回答
0

您应该更改R1R2进入班级DTMF成员(将它们移动到标题)。然后你应该在构造函数中将它们初始化为零,并检查两者是否都非零if(R1==1 && R2==4)。像这样:

// header:
class DTMF {
...
int R1;
int R2;
}
// cpp
DTMF::DTMF() : R1( 0 ), R2( 0 ) { ... }

unsigned char DTMF::buttonPressed(void)
{
    int validatedFreq = validate();
    cout << "valid is returning: " << validatedFreq << endl;
    //int R1;
    //int R2;

    // fill R1 or R2 exactly as you did

    if ( R1 != 0 && R2 != 0 && R1==1 && R2==4 ) {
        ...
        R1 = R2 = 0;
    }
于 2013-04-20T16:59:13.483 回答