IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

probleme avec une boucle infinie


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut probleme avec une boucle infinie
    j'étais entrain de m'exercer sur la surcharge des opérateurs << et le ++ postfixé et préfixe quand j'ai rencontré le problème suivant:
    j'ai crée la classe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    class tableau
    {
        int * elmt;
        const int taille;
     
        public:
        tableau();
        tableau(int *e_,int t_);
        tableau(const tableau&);
        ~tableau();
        friend void taille(const tableau &t);
        int& operator [](const int);
        int& operator [](const int)const;
        tableau& operator++();
        tableau& operator++(int);
     
    friend ostream& operator<<(ostream &o,const tableau &t);
    };
     
    tableau::tableau():taille(1)
    {
        elmt=new int[taille];
    }
     
    tableau::tableau(int *e,int t_):taille(t_)
    {
         elmt=new int[taille];
        for (int i=0;i<taille;i++)
        {
            elmt[i]=e[i];
        }
    }
     
    tableau::tableau(const tableau& orgnl):taille(orgnl.taille)
    {
     
        elmt=new int[orgnl.taille];
        for (int i=0;i<orgnl.taille;i++)
        {
            elmt[i]=orgnl.elmt[i];
        }
    }
    tableau::~tableau()
    {
        delete elmt;
    }
    int& tableau::operator[](const int ind)
    {
     
        if (ind>taille ||ind<0)
        {
            throw("probleme avec indice\n!");
        }
     
        return elmt[ind];
    }
    int& tableau::operator[](const int ind)const
    {
     
        if (ind>taille ||ind<0)
        {
            throw("probleme avec indice\n!");
        }
     
        return elmt[ind];
    }
     
    //post fixé
    tableau& tableau::operator++()
    {
        for (int i=0;i<taille;i++)
        {
            ++elmt[i];
        }
     
        return *this;
    }
    //prefixé
     
    tableau& tableau::operator++(int)
    {
        tableau temp=*this;
        for (int i=0;i<taille;i++)
        {
            elmt[i]++;
        }
        return temp;
    }
    et lorsque j'execute ce code ça boucle indefiniment puis ça plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    ostream& operator<<(ostream &o,const tableau &t)
    {
        for (int i=0;i<t.taille;i++)
        {
     
            o<<"elmt["<<i<<"]"<<t.elmt[i]<<endl;
        }
        return o;
    }
    void taille(const tableau &t)
    {
        cout<<"taille"<<t.taille<<endl;
    }
     
    int main()
    {
     
        int temp[5]={1,2,3,4,5};
     
         tableau t(temp,5);
        tableau c=t;
     
        cout<<c++;//le probleme se situe ici dans l'incrementation postfixé
     
        //si je remplace la ligne en dessus par celles en dessous ça marche sans                 
        //probleme
       c++;
      cout<<c;    
     
        return 0;
        }
    Merci d'avance .

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Sans tout regarder,
    il faudrait que tu redéfinisse operator=
    ici, je n'ai pas la moindre idée de ce qui se passe aprés l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    tableau& tableau::operator++(int)
    {
    //temporaire qui recopie mal this.
    // temp et this partage le même elmt
        tableau temp=*this;
        for (int i=0;i<taille;i++)
        {
            elmt[i]++;
        }
    //normalement temp est detruit et on retourne une reference dessus !!!!!! => erreur
        return temp;
    }

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Quand je compile ton code, j'ai un warning du compilateur qui me semble important

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.cpp(96) : warning C4172: retourne l'adresse d'une variable locale ou temporaire
    Cela se passe dans le code de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tableau& tableau::operator++(int)
    {
        tableau temp=*this;
        for (int i=0;i<taille;i++)
        {
            elmt[i]++;
        }
        return temp;
    }
    Et effectivement, tu retourne une référence sur l'objet temp qui va être détruit dès que l'on quitte la fonction.

    Chez moi, sous Visual Studio 2005, cela ne plante pas mais cela n'affiche rien non plus là où tu indiques ton problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout<<c++;//le probleme se situe ici dans l'incrementation postfixé

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut
    ok merci bcp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA ACCESS probleme avec une boucle for
    Par maldini dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/04/2010, 10h52
  2. Probleme avec une boucle
    Par virtuadrack dans le forum C
    Réponses: 2
    Dernier message: 29/11/2007, 16h32
  3. Probleme avec une boucle
    Par restesouple dans le forum Windows Forms
    Réponses: 14
    Dernier message: 04/10/2007, 11h47
  4. [VBA-E] PRobleme avec une boucle DO..LOOP WHILE
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/07/2006, 02h04
  5. Ksh, problème avec une simple boucle for
    Par herzleid dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2006, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo