2013-04-20 4 views
0

Я пишу библиотеку программ на 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

что вы имеете в виду с _they переписываете друг друга_? этот код выглядит нормально на первый взгляд ... каков ожидаемый результат и какой результат вы получаете? – blue

ответ

0

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

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

static int R2;

+0

Да, это сработало отлично! Если бы только я попросил о помощи раньше, я был бы намного меньше в этом проекте. – user2302586

+0

Вы должны действительно принять один из этих ответов. – blue

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

Спасибо за помощь всем. Было предложено статическое предложение int. Однако мой вывод просто показывает какой-то странный символ вместо символа '1'. – user2302586

+0

Это похоже на хороший подход, хотя статический int, похоже, сработал для меня. – user2302586

+0

Если вы будете использовать static, вы не сможете создать два экземпляра класса DTMF – borisbn

Смежные вопросы