2016-04-20 7 views
1

So versuche ich eine Zeitfunktion zu machen, die herunter zählt. Es basiert auf etwas, das ich hier gesehen habe. Die Variablen sind von einer anderen Funktion gegeben. Wenn die Zeit abgelaufen ist, wird das variable Finish auf 1 gesetzt und es verlässt die Funktion. Diese Funktion funktioniert manchmal und manchmal funktioniert es nicht, zum Beispiel, wenn ich es eine Eingabe von 11sec geben, funktioniert es gut, aber wenn ich es 1:00 min geben, funktioniert es nicht. Kann mir jemand sagen, was mit dem Code nicht stimmt?Zeit funktioniert manchmal manchmal nicht

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, Time2 = 1, Zeit 1 = 0. Dies bedeutet, dass die Zeit bei 32:10 min

+9

Wow, das ist ziemlich schwer zu lesen:
Dies kann mit einem Nest von conditionals erfolgen o ein WTF Codierung Stil Ist es das? – Boiethios

+0

Ich programmiere in normalen C, wirklich grundlegende Logik –

+1

Ich spreche über Ihre Code-Formatierung. Wählen Sie einen Formatierungsstil (z. B. https://www.kernel.org/doc/Documentation/CodingStyle); Ihr Code wird viel besser lesbar sein. Hier scheint es, dass Ihre Einrückung zufällig ist. – Boiethios

Antwort

3

Sie können nicht nur prüfen, gegen nicht-Null, müssen Sie um zu überprüfen, ob die angegebene Zeit positiv ist, andernfalls werden negative Werte gezählt, und die Zähler können überlaufen.

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

Ein anderer Gedanke, zählen Sie mit jeder Ziffer von Minuten nach unten und Sekunden, warum, nicht nur Sekunden verwenden, indem Sie Ihre Zeit in Sekunden konvertieren. Zum Beispiel auf 1.23 abzulaufen:

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 
} 

diese Weise ist es auch erweiterbar sein würde, was, wenn Sie Stunden behandeln möchten, fügen Sie einfach hours * 3600-seconds, können Sie dies einfach Tage, Monate zu handhaben sogar. In Ihrem Ansatz fügen Sie hinzu, dass dies zu viele Fälle ergeben würde, sie sind fast unmöglich korrekt zu handhaben.

+0

danke für den Vorschlag, die Zeit in Sekunden zu verwandeln, habe ich diese Logik angewendet und es funktioniert perfekt. Noch einmal wird Ihre Hilfe sehr geschätzt. –

+0

@Badprogrammer froh zu wissen, dass es geholfen hat. – fluter

+0

können Sie zeigen, wo ich möglicherweise falsch gegangen wäre pls min = (time4 * 10) + time3; sec = (Zeit2 * 10) + Zeit1; gesamt = (min * 60) + sek; gesamt = gesamt - 1; // Total speichert die Anzahl der Sekunden if (total == 0) finish = 1; // Umwandlung von Sekunden zurück in Minuten und Sekunden min = total/60; Zeit4 = min/10; time3 = min% 10; temp1 = gesamt - min * 60; time2 = temp1/10; time3 = temp1% 10; –

2

Das Problem besteht darin, dass Sie mit Null vergleichen, nachdem Sie eine Zahl geändert haben, die nicht Null ist.

dass 01.00 Unter der Annahme ist codiert als

time1 = 0 
time2 = 0 
time3 = 1 

Sie Ihre eigene Logik folgen:

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

Jetzt haben Sie

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; 
    }    
} 

und Sie haben noch

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

und schließlich

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

so am Ende mit

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

up, das heißt, 01.09.

Das einzige Mal, wenn Sie Zeit ändern k ist, wenn die Zeit k-1 hat „gekreuzt“, um die Null wollen.

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

Ahahah, das macht Sinn. Ich hätte versucht, es selbst zu debuggen, aber leider ist der Debugger auf MikroC nicht so gut wie der Debugger auf Visual Studios. Nochmals vielen Dank für Ihre Hilfe –

+0

@Badprogrammer Sie brauchen keinen Debugger für solche Probleme. Sie brauchen nur ein grundlegendes Verständnis des Programmablaufs und ein paar Minuten Nachdenken. – molbdnilo