我正在为我的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]);
}
}
答案 0 :(得分:0)
R1和R2是局部变量,因为您在函数内声明了它们。这意味着每次调用函数时都会初始化它们,每次执行时,R1和R2都是两个新的int变量。
如果您希望它们的值在函数的不同调用之间保持不变,您可以将它们声明为static
。这使得它们只在每次运行程序时初始化一次。你用
static int R2;
答案 1 :(得分:0)
R1和R2是DTMF :: buttonPressed函数的本地和自动,因此它们不会在调用之间保持不变。
如果你没有初始化它们,你必须在它们假设它们具有任何有意义的值之前分配它们。但是你的开关只分配其中一个。但是你后来假装在以下if
中使用它们。
无论你观察到什么行为,都是未定义的。
答案 2 :(得分:0)
您应该将R1
和R2
更改为类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;
}