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

0

Решение

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

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

Вы должны двигаться 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 заявление, которое вы не показали.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector