ввод операторов if без инициализации

Я пишу C ++ библиотеку программ для моего Arduino. Библиотека для 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

Решение

R1 и R2 являются локальные переменные, так как вы объявили их внутри функции. Это означает, что они инициализируются каждый раз, когда вы вызываете функцию, и каждый раз, когда вы это делаете, R1 и R2 — две новые переменные типа int.

Если вы хотите, чтобы их значения оставались неизменными между различными вызовами функции, вы можете объявить их как static, Это позволяет инициализировать их только один раз при каждом запуске программы. Вы делаете это с

static int R2;

0

Другие решения

R1 и R2 являются локальными и автоматически для функции DTMF :: buttonPressed, поэтому они не сохраняются между вызовами.

Если вы не инициализируете их, вы должны назначить их, прежде чем предположить, что они имеют какое-либо значимое значение. Но ваш переключатель назначить только один из них. Но позже вы притворяетесь использовать их обоих в следующем if,

Какое бы поведение вы не наблюдали в этот момент, оно не определено.

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;
}
0
По вопросам рекламы [email protected]