2016-04-20 5 views
1

Donc j'essaye de faire une fonction de temps qui compte à rebours. C'est basé sur quelque chose que j'ai vu ici. Les variables sont données à partir d'une fonction différente. Une fois le temps écoulé, la variable finit à 1 et quitte la fonction. Cette fonction fonctionne parfois et parfois elle ne fonctionne pas, par exemple si je lui donne une entrée de 11sec cela fonctionne bien mais si je lui donne 1:00 min cela ne fonctionne pas. Quelqu'un peut-il me dire ce qui ne va pas avec le code?Fonction de temps fonctionne parfois parfois pas

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, Période1 = 0. Cela signifie que le temps est 32:10 min

+9

Wow, cela est assez difficile à lire: o Est-ce un codage de type WTF? – Boiethios

+0

Je programme en C normal, logique de base –

+1

Je parle de la mise en forme de votre code. Choisissez un style de mise en forme (par exemple https://www.kernel.org/doc/Documentation/CodingStyle); votre code sera beaucoup plus lisible. Ici, il semble que votre indentation soit aléatoire. – Boiethios

Répondre

3

Vous ne pouvez pas simplement vérifier contre les non-zéro, vous avez besoin pour vérifier si le temps donné est positif, sinon vous risquez de compter avec des valeurs négatives, et les compteurs pourraient déborder.

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

Une autre pensée, vous êtes décomptage chaque chiffre de minutes et secondes, pourquoi ne pas simplement utiliser secondes, en convertissant votre temps en secondes. Par exemple, le compte à rebours sur 1h23:

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 
} 

De cette façon, il serait également extensible, si vous voulez gérer les heures, il suffit d'ajouter hours * 3600-seconds, vous pouvez le faire facilement gérer des jours, des mois même. Dans votre approche, ajoutez ceux qui résulteraient trop de cas, ils sont presque impossibles à gérer correctement.

+0

merci pour la suggestion de tourner le temps en secondes, j'ai appliqué cette logique et cela fonctionne parfaitement. Encore une fois, votre aide est très appréciée. –

+0

@Badprogrammer heureux de savoir que cela a aidé. – fluter

+0

pouvez-vous pointer vers où je pourrais avoir mal tourné pls min = (temps4 * 10) + temps3; sec = (temps2 * 10) + temps1; total = (min * 60) + sec; total = total - 1; // Total stocke le nombre de secondes if (total == 0) finish = 1; // convertir les secondes en min et en secondes min = total/60; temps4 = min/10; temps3 = min% 10; temp1 = total - min * 60; time2 = temp1/10; time3 = temp1% 10; –

2

Le problème est que vous comparez à zéro après avoir changé un nombre pour être différent de zéro.

En supposant que 01h00 est codé comme

time1 = 0 
time2 = 0 
time3 = 1 

vous pouvez suivre votre propre logique:

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

Maintenant vous avez

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

et vous avez encore

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

et enfin

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

vous finissez donc avec

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

qui est, 01h09.

La seule fois où vous voulez changer le temps k est lorsque le temps k-1 a « franchi » le zéro.
Cela peut être fait avec un nid de conditionals:

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, cela a du sens. J'aurais essayé de le déboguer moi-même mais malheureusement le débogueur sur MikroC n'est pas aussi bon que le débogueur sur les studios Visual. Encore une fois merci de votre aide –

+0

@Badprogrammer Vous n'avez pas besoin d'un débogueur pour des problèmes comme celui-ci. Vous n'avez besoin que d'une compréhension de base du déroulement du programme et de quelques minutes de réflexion. – molbdnilo