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