2013-07-05 3 views
0

Весь код моего кода слишком много, чтобы публиковать его здесь, поэтому я постараюсь показать суть.C/C++ объявленная и определенная переменная превращается в невидимую

Я кодирую простые графически представленные аналоговые часы (12 часов с тремя руками). В настоящее время мой код работает, если я позволяю часам работать от значения по умолчанию, т.е. все руки начинаются с 12. Однако я добавил функцию, которая позволяет редактировать показанное время и присущее этому независимо от начальной позиции руки, когда она попадает 12, более крупная соответствующая рука должна затем указывать один раз. Мой код ниже.

for (psi = 0; psi<6.28318530718-0.5236; psi+=0.5235987756) { 
     float xply = sin(psi); 
     float yply = cos(psi); 
     int hhx = x0 + (circleRad-100)*xply; 
     int hhy = y0 - (circleRad-100)*yply; 
     float phi; 

     for (phi = 0; phi<6.28318530718-0.10472; phi+=0.1047197551) { 
      float Multx = sin(phi); 
      float Multy = cos(phi); 
      int mhx = x0 + (circleRad-50)*Multx; 
      int mhy = y0 - (circleRad-50)*Multy; 
      float theta; 

      for (theta= 0; theta<6.28318530718-0.104720; theta+=0.1047197551) { 
       // If seconds are given then the if condition is tested 

       if (secPhase > 0) { 
        float angle = theta+secPhase; 

        // If second hand reach top, for loop breaks and enters a new loop       for next minute, secphase is erased as new minute start from 0 secs. 

        if (angle > 6.28318530718-0.104720) { 
         plotHands(angle, x0, y0, circleRad, a, mhx, mhy, hhx, hhy, bytes); 
         capture.replaceOverlay(true, (const unsigned char*)a); 
         sleep(1); 
         secPhase = 0; 
         break; 
        } 

        // if second hand has not reached top yet, then plotting continues 

        plotHands(angle, x0, y0, circleRad, a, mhx, mhy, hhx, hhy, bytes); 
        capture.replaceOverlay(true, (const unsigned char*)a); 
        sleep(1); 
       } 

       // if there were no seconds given, plotting begins at 12. 

       else { 
        plotHands(theta, x0, y0, circleRad, a, mhx, mhy, hhx, hhy, bytes); 
        capture.replaceOverlay(true, (const unsigned char*)a); 
        sleep(1); 
       } 
      } 
     } 
    } 

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

В этом проблема. Логично, что я мог бы применить ту же концепцию, что и для секундной стрелки, но перенести ее на минутную стрелку и изменить соответствующие имена переменных, чтобы, когда минутная стрелка наносит 12, часовой стрелок будет двигаться. Это код, который нарушает:

for (phi = 0; phi<6.28318530718-0.10472; phi+=0.1047197551) { 
    if (minPhase > 0) { 
     float minAngle = phi + minPhase; 
     if (minAngle > 6.28318530718-0.10472) { 
      minPhase = 0; 
      break; 
     } 
     float Multx = sin(minAngle); 
     float Multy = cos(minAngle); 
     int mhx = x0 + (circleRad-50)*Multx; 
     int mhy = y0 - (circleRad-50)*Multy; 
    } 
    else { 
     float Multx = sin(phi); 
     float Multy = cos(phi); 
     int mhx = x0 + (circleRad-50)*Multx; 
     int mhy = y0 - (circleRad-50)*Multy; 
    } 
} 

Я взял только среднюю петлю с участием минутной стрелки. Эти циклы и утверждения гарантируют, что если нет заданной начальной точки минутной стрелки, будет выполняться инструкция else, но если есть начальная точка, стартовая точка будет галочкой до тех пор, пока она не ударит двенадцать, и которая указывает, что она ломается до часа для цикл, галочки один раз, очищая начальную точку минутной стрелки, чтобы начать заново в новый час.

Однако, как только я пытаюсь скомпилировать код, компилятор говорит мне:

ошибку: «MHX» не был объявлен в этой области
ошибка: «mhy» был не объявлен в этой области

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

Я также обнаружил, что если я удалил оператор 'else', код был скомпилирован и запущен, но был сломан, т. Е. Минутная стрелка не была в предполагаемой позиции.

Может ли кто-нибудь просветить меня, пожалуйста? Я все еще очень новичок в C и C++.
Спасибо заранее.

+3

Они выходят за пределы видимости в закрывающей скобке блока. – chris

ответ

3

Переменные выходят за пределы области действия, когда они нажимают на закрывающую фигуру либо if, либо else. Объявите их за пределами области действия и назначьте их значения внутри блоков if/else.

for (phi = 0; phi<6.28318530718-0.10472; phi+=0.1047197551) { 
    if (minPhase > 0) { 
     float minAngle = phi + minPhase; 
     if (minAngle > 6.28318530718-0.10472) { 
      minPhase = 0; 
      break; 
     } 
     float Multx = sin(minAngle); 
     float Multy = cos(minAngle); 
     int mhx = x0 + (circleRad-50)*Multx; 
     int mhy = y0 - (circleRad-50)*Multy; 
     // Multx, Multy, mhx, mhy will go out of scope when the following brace is reached 
    } 
    else { 
     float Multx = sin(phi); 
     float Multy = cos(phi); 
     int mhx = x0 + (circleRad-50)*Multx; 
     int mhy = y0 - (circleRad-50)*Multy; 
     // Multx, Multy, mhx, mhy will go out of scope when the following brace is reached 
    } 
} 

Вы должны вместо этого:

for (phi = 0; phi<6.28318530718-0.10472; phi+=0.1047197551) { 
    float Multyx, Multy; 
    int mhx, mhy; 
    // These variables will now be visible in the entire for loop's scope not just the if or else statement they were declared into. 
    if (minPhase > 0) { 
     float minAngle = phi + minPhase; 
     if (minAngle > 6.28318530718-0.10472) { 
      minPhase = 0; 
      break; 
     } 
     Multx = sin(minAngle); 
     Multy = cos(minAngle); 
     mhx = x0 + (circleRad-50)*Multx; 
     mhy = y0 - (circleRad-50)*Multy; 
    } 
    else { 
     Multx = sin(phi); 
     Multy = cos(phi); 
     mhx = x0 + (circleRad-50)*Multx; 
     mhy = y0 - (circleRad-50)*Multy; 
    } 
} 
+0

спасибо большое :) – Shiri

0

Вы должны переместить mhx и mhy в объеме выше if заявление, чтобы быть видимым снаружи, если/иначе.

for (phi = 0; phi<6.28318530718-0.10472; phi+=0.1047197551) { 
    int mhx, mhy; // move declaration here 
    if (minPhase > 0) { 
     float minAngle = phi + minPhase; 
     if (minAngle > 6.28318530718-0.10472) { 
       minPhase = 0; 
      break; 
     } 
     float Multx = sin(minAngle); 
     float Multy = cos(minAngle); 
     mhx = x0 + (circleRad-50)*Multx; // no longer a declaration, just assignment 
     mhy = y0 - (circleRad-50)*Multy; 
    } 
    else { 
     float Multx = sin(phi); 
     float Multy = cos(phi); 
     mhx = x0 + (circleRad-50)*Multx; // no longer a declaration, just assignment 
     mhy = y0 - (circleRad-50)*Multy; 
    } 
} 

Я предполагаю, что у вас есть другой код в теле вашего for цикла после этого if утверждения, что вы не показали.

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