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++.
Заранее спасибо.

Лучший ответ:

Переменные выходят за пределы области действия, когда они нажимают на заключительную фигуру либо 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 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;
    }
}

Ответ №1

Вам нужно переместить mhx и mhy в область над выражением if которая будет видна вне if/else.

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 который вы не указали.

Оцените статью
TechArks.Ru
Добавить комментарий