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.

0voto

Demi Points 3547

Il n'est pas rare de trouver des boucles infinies dans le code des systèmes embarqués - souvent autour de machines à états finis, de contrôle de puces et de dispositifs périphériques, etc.

0voto

plinth Points 26817

J'adore les boucles infinies en tant que structure de contrôle externe d'une machine à états finis. Il s'agit en fait d'un goto structuré :

for (;;) {
    int c = ReadInput();
    if (c == EOF)
        return kEOF;

    switch (state) {
    case inNumber: state = HandleNumber(c); break;
    case inToken: state = HandleToken(c); break;
    case inWhiteSpace: state = HandleWhiteSpace(c);
    default:
       state = inError;
       break;
    }
    if (state == inError) ThrowError();

}

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