J'essaie de créer un simulateur de feu qui nécessite que j'imprime Ceci est ma tentative, mais je reçois une sortie qui imprime vert code> pour les 8 premières secondes à 1 seconde, jaune code> pour les 4 prochaines secondes à 1 Deuxièmes intervalles et rouge code> pour les 8 dernières secondes à 1 seconde intervalles. Comment puis-je utiliser temps.h code> pour implémenter ceci en C? vert code> sans escale à intervalles qui ne sont pas 1 seconde long. P>
3 Réponses :
Votre code imprimera simplement "vert" aussi vite que possible car edit: si (écoulé) code> se produira toujours parce que la condition est toujours vraie. Vous pouvez utiliser diffhtime code> mais devra réexécuter votre code un peu (je pense qu'il ajoute peut-être 2-3 lignes). Y a-t-il une raison pour laquelle vous ne pouvez pas simplement utiliser dormir code>? Il semble être une solution plus simple: imprimez "vert", appelez SLEEP (1) code>, répétez 7 fois plus, passez à l'impression "jaune", etc. J'espère que cela vous aidera! P>
si (écoulé) code> est vrai tant que la valeur écoulée code> n'est pas égale à 0, et simplement parce que les ordinateurs ne agissent pas instantanément, il y aura toujours Une différence de temps non nulle renvoyée par diffime code>. p>
Ou sommeil (1000) si sous Windows.
@Engineer J'ai essayé ce que vous avez dit et utilisé Sleep () code> seulement. Cela semble bien fonctionner. Merci.
@Engineer, j'ai effectivement erroné si (écoulé) code>, je voulais écrire si (écoulé == 1) code>. Cela devrait fonctionner alors, ne devrait-il pas?
ELAPSED == 1 code> est un flotteur / double comparaison. Cela ne fonctionne pas toujours très bien à cause de Le passage des points de flottement fonctionnent . Il est préférable d'utiliser > = code>.
Non parce que écoulé ne sera probablement jamais égal à 1 exactement.
Pour ces chronomètres tels que des codes, vous ne devriez pas demander "est la différence de temps 1 seconde?", Mais vous devriez demander que "a 1 seconde écoulé encore?". Sinon, alors le code fait quoi que ce soit, calcule une nouvelle valeur écoulée, puis demande à nouveau. Par exemple, si elle est écoulé = 0,8578, votre code continue, puis la prochaine itération suppose ELAPSED = 1.02343 afin que vous codez, indique "Yep, j'ai attendu 1 seconde..time à imprimer"
Ce qui suit semble fonctionner comme prévu: ici, nous gardons une trace du temps "actuel" écoulé et le moment où la tick antérieur d'une seconde était notée. Lorsque ce «courant» est écoulé diffère du "précédent" écoulé, nous savons qu'une seconde (ou plus probable, légèrement plus) est passée, et nous imprimons "Green". P> P>
Merci. C'était ce que j'essayais plus ou moins d'essayer de faire.
D'accord, j'ai donc compris ce qui se passe ici.
diff terne () code> renvoie Si vous voulez double code>. Cela signifie que les secondes fractionnaires peuvent être retournées. S'ils sont (ce qu'ils seront probablement), cela signifie que vous avez une certaine valeur dans écoulée code>, ce qui signifie qu'il n'évaluera pas à FALSE - même si une seconde complète n'a pas encore été adoptée. p> écoulé code> est supérieur à 1, alors vérifiez simplement: P> if (elapsed >= 1)
{
printf("green");
}
Ouais ça marche ... Je l'ai eu de la réponse de @bob Jarvis. Merci.
Vous êtes les bienvenus. N'hésitez pas à uplifier toutes les réponses qui vous ont aidé, et veuillez marquer votre question tel que résolu en sélectionnant la coche en regard de la réponse qui vous a le plus aidé. Cela accepte cette réponse et permet aux futurs lecteurs de savoir ce qui a finalement résolu votre problème.
Eh bien, NO i> une partie de votre code imprime jamais "jaune" ou "rouge", c'est pourquoi il imprime uniquement "vert". Je crois que cela imprimera "Green" pendant environ 9 secondes, mais il l'imprimera aussi vite que possible - vous verrez probablement de nombreuses écoles de "vert"! La raison en est que vous n'attendez jamais 1 seconde après avoir imprimé "vert". Un autre problème est que vous n'avez pas de nouvelle ligne (
\ n code>) après "vert". Donc, le programme charge le tampon terminal avec "Greengreengreengreen ..." et imprime un groupe (probablement 4096 lettres d'une valeur) chaque fois qu'il est plein.Je n'ai pas écrit la partie "jaune" ou "rouge" car je ne pouvais pas obtenir la partie "verte" au travail.
Assez juste. Vous pouvez faire des progrès en faisant deux choses: commencez par mettre un
\ n code> à la fin de votre chaîne "verte". Et deuxième,dormir (1) code> après avoir imprimé "vert". (dormir () code> n'est probablement pas exactement précis, donc si vous voulez exactement une seconde, vous devrez faire autre chose, mais au moins cela vous rapprochera de 9 copies de "vert" au lieu de 29 bazillions copies!)1) Merci d'avoir essayé de faire un exemple minimal. C'est grandement apprécié. 2) Avez-vous essayé d'imprimer la valeur de
élaspéd code>? 3) Avez-vous essayé d'utiliserSleep () code>?Pour causer des retards dans votre code en attente d'une heure, vous devez utiliser une fonction système d'exploitation, sinon votre programme a une incidence négative sur la performance des autres programmes d'exécution. Ce problème est parfois appelé "boucle serrée". La fonction OS saura qu'elle peut suspendre le fil de votre programme jusqu'au moment où vous attendez est atteint. Il y a une plate-forme standard standard thrd_sleep Bien que certains compilateurs puissent ne pas être en place à ce jour avec la norme
@ Chipster Nope Je n'ai pas essayé d'imprimer la valeur de
écoulée code>. Mais j'ai utilisédormir () code> après que je puisse lire une réponse @Engineer, et cela semble bien fonctionner.Suggérez en utilisant la fonction: Sétititimer