2016-04-20 9 views
1

だから、カウントダウンする関数を作ろうとしています。それは私がここで見たものに基づいています。変数は異なる関数から与えられます。時間がなくなると、変数finishは1に変わり、関数を終了します。 この関数は時々動作し、時にはうまくいきません。例えば、11秒の入力を与えてもうまく動作しますが、1分に与えると動作しません。誰かがコードに何が間違っているか教えてもらえますか?時間関数が時々動作しない場合

if (time1 == 0 && time2 == 0 && time3 == 0 && time4 == 0) 
//if all the time is 0 finish the sequence 
    finish = 1; 

if (time1 != 0) //Checking to see if the first digit is NOT at 0 
    time1 = time1 - 1; // subtract time 1 by 1 
else { 
    time2 = time2 - 1; //When time1 is 0 
    time1 = 9; 
} //Time1 going back to it's original value 

if (time2 == 0 && time1 == 0) { //if time1 and time2 are 0s 
    if (time3 != 0) { //The minute value (time3) 
     time2 = 5; //60 SECONDS 
     time3 = time3 - 1; 
     time1 = 9; 
    }    
} //Put time 1 to its original value 
if (time2 <= 0 && time1 <= 0 && time3 <= 0) { 
    if (time4 != 0) { //The minute value (time3) 
     time2 = 5; //60 SECONDS 
     time3 = 9; 
     time4 = time4 - 1; 
     time1 = 9; 
    } 
} //Put time 1 to its original value 

TIME4 = 3、Time3を= 2、タイム2 = 1、時間1 = 0。これは、時間はあなたがちょうどあなたが必要とする、非ゼロに対してチェックすることはできません32:10分

+9

うわー、これは読むためにかなり難しいです:oはそれWTFコーディングスタイルですか? – Boiethios

+0

私は普通のCで、本当に基本的なロジックでプログラミングしています –

+1

私はあなたのコードの書式について話しています。 1つの書式スタイルを選択します(例:https://www.kernel.org/doc/Documentation/CodingStyle)。あなたのコードははるかに読みやすくなります。ここでは、あなたのインデントはランダムであるようです。 – Boiethios

答えて

3

であることを意味します指定された時刻が正であるかどうかをチェックし、そうでない場合は負の値でカウントされ、カウンタがオーバーフローする可能性があります。

if (time1 > 0) 
    time1 -= 1; 
if (time3 > 0) 
    time3 -= 1; 

もう1つの考えは、分と秒の各桁でカウントダウンしています。なぜなら秒を秒単位で変換するだけではないからです。例えば、1:23にカウントダウンする:

int minutes = 1; 
int seconds = 23; 
int timer = minutes * 60 + seconds; 

// in your timer function 
if (seconds == 0) { 
    finish = 1; 
} else if (seconds > 0) { 
    seconds -= 1; 
} else { 
     // error 
} 

あなたが時間を処理したい場合は、単にsecondshours * 3600を追加し、何も拡張可能になります。この道を、あなたは日、月を処理するために簡単にこれを行うことができます均一。あなたのアプローチでは、それらの結果が多すぎるケースを追加します。正しく処理することはほとんど不可能です。

+0

時間を秒に変えることの提案に感謝します、私はその論理を適用して、それは完全に動作します。もう一度あなたの助けに感謝します。 –

+0

@Badprogrammerはそれが助けてくれたことをうれしく思います。 – fluter

+0

私は間違ったplsを行ったかもしれないところを指すことができます min =(time4 * 10)+ time3; 秒=(時間2 * 10)+時間1; total =(min * 60)+ sec; 合計=合計 - 1; // Totalは秒数を格納します if(合計== 0) finish = 1; // secondsを分と秒に変換する min =合計/ 60;time4 = min/10; time3 = min%10; temp1 =合計 - 分* 60;time2 = temp1/10; time3 = temp1%10; –

2

問題は、数値をゼロ以外に変更した後でゼロと比較していることです。

は、独自のロジックに従うことができ一時が

time1 = 0 
time2 = 0 
time3 = 1 

としてエンコードされると仮定すると:

if (time1 != 0) // Nope 
    time1 = time1 - 1; 
else { // Yes 
    time2 = time2 - 1; 
    time1 = 9; 
} 

は今、あなたは

time1 == 9 
time2 == 0 
time3 == 1 

if (time2 == 0 && time1 == 0) { // Nope, time1 is 9 
    if (time3 != 0) { 
     time2 = 5; 
     time3 = time3 - 1; 
     time1 = 9; 
    }    
} 

を持っているとあなたはまだ

を持っています
time1 == 9 
time2 == 0 
time3 == 1 

し、最終的に

if (time2 <= 0 && time1 <= 0 && time3 <= 0) { // Nope 
    if (time4 != 0) { 
     time2 = 5; 
     time3 = 9; 
     time4 = time4 - 1; 
     time1 = 9; 
    } 
} 

ので、あなたは、1:09である

time1 == 9 
time2 == 0 
time3 == 1 

で終わります。

時間 K-1がゼロに「交差」したときにあなたは時間 Kを変更したいだけの時間があります。
これは、条件文の巣を行うことができます。

if (time1 > 0 || time2 > 0 || time3 > 0 || time4 > 0) 
{  
    time1 -= 1; 
    if (time1 < 0) 
    { 
     time1 = 9; 
     time2 -= 1; 
     if (time2 < 0) 
     { 
      time2 = 5; 
      time3 -= 1; 
      if (time3 < 0) 
      { 
       // ... 
      } 
     } 
    } 
} 
+0

アハハ、それは理にかなっています。私はそれを自分でデバッグしようとしたでしょうが、残念ながらMikroCのデバッガはVisual Studioのデバッガほど良くありません。もう一度あなたの助けをありがとう –

+0

@Badprogrammerこのような問題のデバッガは必要ありません。プログラムフローの基本的な理解と思考が必要なだけです。 – molbdnilo

関連する問題