7 votes

Les boucles sans fin sont-elles mal vues ?

J'ai donc un code C++ pour le back-tracking des nœuds dans un algorithme BFS. Il ressemble un peu à ceci :

typedef std::map<int> MapType;
bool IsValuePresent(const MapType& myMap, int beginVal, int searchVal)
{
    int current_val = beginVal;
    while (true)
    {
        if (current_val == searchVal)
            return true;

        MapType::iterator it = myMap.find(current_val);
        assert(current_val != myMap.end());
        if (current_val == it->second) // end of the line
            return false;
        current_val = it->second;
    }
}

Toutefois, le while (true) me semble... suspect. Je sais que ce code fonctionne, et logiquement je sais qu'il devrait fonctionner. Cependant, je n'arrive pas à me débarrasser du sentiment qu'il devrait y avoir une condition dans l'élément while mais la seule solution possible est d'utiliser un bool variable juste pour dire si c'est fait. Dois-je cesser de m'inquiéter ? Ou est-ce que c'est vraiment une mauvaise forme.

EDITAR : Merci à tous ceux qui ont remarqué qu'il y avait un moyen de contourner ce problème. Cependant, j'aimerais savoir s'il existe d'autres cas valables.

4voto

too much php Points 27983

while(true) est utilisé dans les jeux pour la boucle principale du jeu - les jeux lisent continuellement les entrées du joueur, traitent les interactions entre les objets et peignent l'écran, puis recommencent. Cette boucle se poursuit à l'infini jusqu'à ce qu'une autre action sorte de cette boucle (quitter le jeu, terminer le niveau).

J'ai essayé de trouver rapidement cette boucle principale dans le code source de Quake 1 pour vous, mais il y avait au moins 50 occurrences de ' while(1) ', ainsi que certains écrits comme for(;;) et je n'ai pas tout de suite su laquelle était la boucle principale du jeu.

1voto

Bill K Points 32115

Bien que je l'aie déjà fait, je voterais pour que l'on essaie toujours de trouver la solution la plus claire en utilisant quelque chose de lisible, ce qui inclurait généralement une expression valide dans la boucle while - sinon vous scannez le code à la recherche d'une rupture.

Je n'en suis pas vraiment terrifié, mais je sais que certaines personnes le sont.

0voto

Zifre Points 14109

Un commentaire indiquant qu'il ne s'agit pas vraiment d'une boucle infinie serait utile :

    while (true) // Not really an infinite loop! Guaranteed to return.

Je suis d'accord pour dire qu'il devrait être assorti d'une condition, mais cela ne pose pas de problème dans certaines situations (et il n'est pas toujours possible ou facile d'imposer une condition).

0voto

Stephen Doyle Points 2505

Cessez de vous inquiéter. Ce n'est pas une mauvaise chose si cela permet de simplifier la logique du code et d'améliorer la maintenabilité et la lisibilité. Il vaut cependant la peine de documenter dans les commentaires les conditions de sortie attendues et les raisons pour lesquelles l'algorithme ne tombera pas dans une boucle infinie.

0voto

Electrons_Ahoy Points 6972

Bien, oui mais les deux pages de code que vous devez écrire si vous ne voulez pas que votre boucle principale soit quelque chose comme while(true) est même pire forme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X