Partage
  • Partager sur Facebook
  • Partager sur Twitter

Différentes interprétations de "break;"?

Diffrent selon l'OS?

Sujet résolu
    14 août 2008 à 23:26:06

    Bonjour a tous!

    Tout a l'heure, en passant mon programme (le CowSay des exercices de Nanoc) de Linux a Windows je me suis aperçu que le même code source une fois compilé ne s'exécutait pas de la même façon sur les 2 OS...

    Il se trouve qu'en rajoutant une ligne, le programme fonctionne de la même façon sur les 2 OS. Ne serai-ce pas a cause du break qui casserais le if au lieu du while? (la variable "compteur" serait alors incrémentée ce qui empêcherait le while de tester le caractère de fin...)

    Voici le code Source...
    #include <iostream>
    #include <string>
    
    
    using namespace std;
    
    string decoupage(string chaine);
    
    int main()
    {
        //Petit scénario 
        cout<<"Une vache qui parle!Vous me croyez pas?"<<endl;
        cout<<"Faites lui dire quelque chose:"<<endl;
    
        //On prend la chaine entrée par l'utilisateur
        string phraseVache;
        getline(cin, phraseVache);
        phraseVache += '\0';//<---ligne ajoutée -> bug terminé
    
        //On dessine le haut de la bulle
        cout<<" ";
        for(long i = 0; i<26; i++)
        {
            cout<<"_";
        }
        cout<<endl;
    
        //On écrit sa phrase
        cout<<decoupage(phraseVache);
    
        //On dessine le bas de la bulle
        cout<<" ";
        for(long i = 0; i<26; i++)
        {
            cout<<"-";
        }
        cout<<endl;
    
        //Puis la vache
        cout<<"                     \\ |"<<endl;
    	cout<<"                     (\\/)"<<endl;
    	cout<<"                     (oo)"<<endl;
    	cout<<"                     (..)"<<endl;
    
    	getchar();
    
        return 0;
    }
    string decoupage(string chaine)
    {
    
        int compteur = 0;
        int comDebut=0;
        int longeurLigne = 0;
        string ligne = "";
        string lignes = "";
    
        while(chaine[compteur] != '\0')
        {
            longeurLigne = 23;
            for(int i=0; i<25; i++)
            {
                if(chaine[compteur] == ' ')
                {
                    longeurLigne = i;
                }
                if(chaine[compteur] == '\0')
                {
                    longeurLigne = i;
                    break;//<---------le break incriminé?
                }
                compteur++;
            }
            ligne = "                        ";
            for(int j=0; j<=longeurLigne; j++)
            {
                ligne[j] = chaine[comDebut + j];
            }
            lignes += "< " + ligne +" >\n";
    
            comDebut += longeurLigne+1;
            compteur = comDebut;
        }
    
        return lignes;
    }
    


    Voila, je trouve tout ça très bizarre, moi... Est-ce vraiment le break ou est ce quelque chose que je n'aurais pas vu?
    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2008 à 23:43:27

      ce break casse le for
      les if ne se breakent pas
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        14 août 2008 à 23:51:21

        A quoi sont dues ces différentes interprétation d'algorithme alors...? Le break ne casserais rien du tout...?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 août 2008 à 0:34:33

          Citation : n0n0

          Le break ne casserais rien du tout...?


          Il arrête la boucle for (car en cas de boucles imbriquées, break fait sortir de la boucle la plus interne) quand le caractère de fin de chaîne '\0' est trouvé. A priori, son absence sera tolérée par le compilateur dans ce code, mais conduirait à des tours de boucle inutiles.
          • Partager sur Facebook
          • Partager sur Twitter
            15 août 2008 à 1:13:36

            Du code C++ standard ne change pas d'OS à OS. C'est plutôt la version du compileur qui a dû changée.
            • Partager sur Facebook
            • Partager sur Twitter
              15 août 2008 à 3:02:00

              Les string C++ ne stockent pas le caractère '\0' comme marqueur de fin de chaine, pour la bonne et simple raison qu'elles connaissent leurs tailles, contrairement aux chaines de type C.
              C'est pour ça qu'en l'ayant rajouté ton code est devenu fonctionnel.
              Tu ne dois pas utiliser le caractère '\0' mais plutôt utiliser length() pour obtenir la longueur de ta chaine, ou travailler avec des itérateurs.
              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2008 à 14:14:01

                Citation : Devilgeo

                Il arrête la boucle for (car en cas de boucles imbriquées, break fait sortir de la boucle la plus interne) quand le caractère de fin de chaîne '\0' est trouvé. A priori, son absence sera tolérée par le compilateur dans ce code, mais conduirait à des tours de boucle inutiles.



                Dans mon esprit, sortir de la boucle for conduirait a arrêter la boucle while : si chaine[compteur] = '\0' -> la condition du while ne serai pas remplie.
                Ce que j'ai oublié c'est que la variable compteur changeait a la fin du while... (j'avais po vu ...)
                Enfin...Ça explique pas pourquoi sous Linux ça marchais...



                Citation : St Untrider

                Les string C++ ne stockent pas le caractère '\0' comme marqueur de fin de chaine, pour la bonne et simple raison qu'elles connaissent leurs tailles, contrairement aux chaines de type C.



                C'est faux... en ne rajoutant pas le '\0' a la fin de la chaine, le code suivant s'exécute quand même puisque la console affiche "Il y a bien un '\0"...
                if(chaine[compteur] == '\0') 
                     {
                          longeurLigne = i;
                          cout<<"Il y a bien un '\\0'";
                          break;
                      }
                
                • Partager sur Facebook
                • Partager sur Twitter

                Différentes interprétations de "break;"?

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown