0

私のコード全体は、ここに投稿するには多すぎるので、要点を示してみます。

私は単純なグラフィカルに表現されたアナログ時計 (3 つの針で 12 時間計) をコーディングしています。現在、私のコードは、クロックをデフォルト、つまりすべての針が 12 から始まるようにすれば機能します。ただし、12 に達したときに、針の開始位置に関係なく、表示され、これに固有の時間を編集できる機能を追加しました。次に、それぞれの大きな手が 1 回ティックする必要があります。私のコードは以下です。

    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 に達すると分針が 1 回カチカチ音をたてます。

これが問題です。論理的には、秒針に使用したのと同じ概念を適用して分針に移行し、関連するそれぞれの変数名を変更して、分針が 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 ステートメントが実行されますが、開始点がある場合は、開始点が 12 時まで刻み、その時点で時を区切ります。ループし、分針の開始点をクリアして新しい時間に新たに開始する間、1 回ティックします。

ただし、コードをコンパイルしようとすると、コンパイラから次のように通知されます。

エラー: 'mhx' はこのスコープで宣言されていません
エラー: 'mhy' はこのスコープで宣言されていません

分針を描画する関数でこの変数が呼び出されるたびにこれが表示され、これらの変数が単純に消えたかのようになります。それらは、その下の for ループで呼び出されようとしたときに、私のコードで明確に宣言および定義されており、これらの変数が欠落していると主張しています。

また、'else' ステートメントを削除すると、コードはコンパイルおよび実行されますが、壊れていることもわかりました。つまり、分針が本来の位置にありませんでした。

誰か教えてください。私はまだ C と C++ の初心者です。
前もって感謝します。

4

2 に答える 2