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 :

[Débutant] Objet ou Attribut qui disparait


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut [Débutant] Objet ou Attribut qui disparait
    Bonjour à tous.

    Il m'arrive quelque chose de bizarre, on dirait que les attributs de l'objet disparaissent :

    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
      std::vector <Noeud> Vect_N;
      std::vector <LienPhys> Vect_L;
     
      Vect_N.reserve(n);
         //Construction du vecteur de Noeud
         for (int i = 0; i < n; i++) 
         {
            //Création dez Noeuds
       Noeud N_Obj(i, 0, 0, env);
       Vect_N.push_back(N_Obj);
       N_Obj.~Noeud();
         }
     
      //Affichage de tous les Noeuds
      for (int i = 0; i < Vect_N.size(); i++) {Vect_N[i].afficher();} 
     
      //Construction du  de Lien
      int num_lien = 0;
         for (int i = 0; i < n; i++) 
         {
            for (int j = 0; j < n; j++) 
             {
                if (M[i][j] > 0) 
                  { 
              //Lien(i,j) = meme que Lien(j,i)
         if (j > i)
         {
          cout << "i= "<<i<<", j= " <<j<< ", M["<<i<<"]["<<j<<"]="<<M[i][j]<<endl;
          LienPhys L_Obj(num_lien, M[i][j], Vect_N[i], Vect_N[j], env);
          L_Obj.afficher();
          Vect_L.push_back(L_Obj);
          L_Obj.~LienPhys();
          num_lien++;      
         }
             }
             }
         }
      cout<<endl;
      //Affichage de tous les LienPhys
      for (int k = 0; k < Vect_L.size(); k++) 
         {
       Vect_L[k].afficher();
      }
    et ce que j'obtiens à l'affichage:
    N[0] = 0
    N[1] = 0
    N[2] = 0
    N[3] = 0
    N[4] = 0
    N[5] = 0

    i= 0, j= 1, M[0][1]=150
    L[0][1] de longueur = 150km est à 0
    i= 0, j= 2, M[0][2]=150
    L[0][2] de longueur = 150km est à 0
    i= 1, j= 2, M[1][2]=200
    L[1][2] de longueur = 200km est à 0
    i= 1, j= 3, M[1][3]=3000
    L[1][3] de longueur = 3000km est à 0
    i= 2, j= 4, M[2][4]=300
    L[2][4] de longueur = 300km est à 0
    i= 3, j= 4, M[3][4]=200
    L[3][4] de longueur = 200km est à 0
    i= 3, j= 5, M[3][5]=150
    L[3][5] de longueur = 150km est à 0
    i= 4, j= 5, M[4][5]=500
    L[4][5] de longueur = 500km est à 0

    L[0][0] de longueur = 0km est à 0 *ce qui devait être écris L[0][1] de longueur = 150km est à 0
    L[0][2] de longueur = 150km est à 0
    L[1][2] de longueur = 200km est à 0
    L[1][3] de longueur = 3000km est à 0
    L[2][4] de longueur = 300km est à 0
    L[3][4] de longueur = 200km est à 0
    L[3][5] de longueur = 150km est à 0
    L[4][5] de longueur = 500km est à 0
    Où est l'erreur ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je n'ai pas tout regardé en détail, mais vire déjà tous ces appels explicites aux destructeurs.

    http://c.developpez.com/faq/cpp/?pag...teur_explicite

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut


    dis moi pas ?
    tu peux me dire pourquoi tu appelles explicitement le destructeur ? l'objet est détruit automatiquement lorsqu'on sort de la portée de sa déclaration.

    EDIT : grillé

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    je détruisais vu que comme je suis dans une boucle for,

    Je construisait à chaque fois l'objet "L_Obj" de ma classe LienPhys, seuls e les paramètres dans le constructeurs changent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LienPhys L_Obj(num_lien, M[i][j], Vect_N[i], Vect_N[j], env);
    Je pensais que le fait de porter le même nom "L_Obj" risquerait de poser un conflit.

    J'ai enlever les destructeurs :
    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
    std::vector <Noeud> Vect_N;
      std::vector <LienPhys> Vect_L;
     
      Vect_N.reserve(n);
         //Construction du vecteur de Noeud
         for (int i = 0; i < n; i++) 
         {
            //Création dez Noeuds
       Noeud N_Obj(i, 0, 0, env);
       Vect_N.push_back(N_Obj);
       //N_Obj.~Noeud();
         }
     
      //Affichage de tous les Noeuds
      for (int i = 0; i < Vect_N.size(); i++) {Vect_N[i].afficher();} 
     
      //Construction du  de Lien
      int num_lien = 0;
         for (int i = 0; i < n; i++) 
         {
            for (int j = 0; j < n; j++) 
             {
                if (M[i][j] > 0) 
                  { 
              //Lien(i,j) = meme que Lien(j,i)
         if (j > i && j!=0)
         {
          cout << "i= "<<i<<", j= " <<j<< ", M["<<i<<"]["<<j<<"]="<<M[i][j]<<endl;
          LienPhys L_Obj(num_lien, M[i][j], Vect_N[i], Vect_N[j], env);
          L_Obj.afficher();
          Vect_L.push_back(L_Obj);
          //L_Obj.~LienPhys();
          num_lien++;      
         }
             }
             }
         }
      cout<<endl;
      //Affichage de tous les LienPhys
      for (int k = 0; k < Vect_L.size(); k++) 
         {
       Vect_L[k].afficher();
      }
    et cela affiche pareil:
    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
    N[0] = 0
    N[1] = 0
    N[2] = 0
    N[3] = 0
    N[4] = 0
    N[5] = 0
     
    i= 0, j= 1, M[0][1]=150
    L[0][1] de longueur = 150km est à 0
    i= 0, j= 2, M[0][2]=150
    L[0][2] de longueur = 150km est à 0
    i= 1, j= 2, M[1][2]=200
    L[1][2] de longueur = 200km est à 0
    i= 1, j= 3, M[1][3]=3000
    L[1][3] de longueur = 3000km est à 0
    i= 2, j= 4, M[2][4]=300
    L[2][4] de longueur = 300km est à 0
    i= 3, j= 4, M[3][4]=200
    L[3][4] de longueur = 200km est à 0
    i= 3, j= 5, M[3][5]=150
    L[3][5] de longueur = 150km est à 0
    i= 4, j= 5, M[4][5]=500
    L[4][5] de longueur = 500km est à 0
     
    L[0][0] de longueur = 0km est à 0
    L[0][2] de longueur = 150km est à 0
    L[1][2] de longueur = 200km est à 0
    L[1][3] de longueur = 3000km est à 0
    L[2][4] de longueur = 300km est à 0
    L[3][4] de longueur = 200km est à 0
    L[3][5] de longueur = 150km est à 0
    L[4][5] de longueur = 500km est à 0

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    C'est quand même bizarre seul le 1er Objet LienPhys est erroné:

    Pourr info le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    LienPhys::LienPhys(int k, double l, Noeud x, Noeud y, IloEnv env)
    {
     Num = k; 
     Longueur = l;
     M = x;
     N = y;
     CoutV = D * Longueur;
     VarL = IloBoolVar(env, "L");
    }

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 70
    Points
    70
    Par défaut
    Bonjour,
    je n'ai pas tout lu en détail, mais j'avais un problème qui ressemblait au tien. Je l'ai réglé en vidant les vecteurs après les avoir créé (vecteur.clear()).
    Après, ça vient peut être d'autre chose...

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Aucune idée de l'origine du problème, mais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int j = 0; j < n; j++) 
    {
        if (j > i && j!=0)
        {
            ...
        }
    }
    C'est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int j = i + 1; j < n; j++) 
    {
        ...
    }
    Sinon, pour régler le problème le meilleur moyen est encore d'utiliser un debugger, avec par exemple une exécution pas à pas. Au pire si tu ne sais pas le faire tu peux toujours placer des affichages un peu partout dans ton code, afin de suivre plus ou moins ce qui se passe au niveau des appels de fonction et des variables.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    J'ai essayé de vider les vector et différents affichages intermédiaires :
    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
    Vect_N.clear();
      Vect_L.clear();
      
         //Construction du vecteur de Noeud
         for (int i = 0; i < n; i++) 
         {
            //Création dez Noeuds
       Noeud N_Obj(i, 0, 0, env);
       Vect_N.push_back(N_Obj);
       //N_Obj.~Noeud();
         }
      cout<< Vect_N[0].get_Num()<<endl;
      cout<< Vect_N[1].get_Num()<<endl;
      cout<< Vect_N[2].get_Num()<<endl;
      cout<< Vect_N[3].get_Num()<<endl;
      cout<<endl;
      
      
      //Affichage de tous les Noeuds
      for (int i = 0; i < Vect_N.size(); i++) {Vect_N[i].afficher();} 
      
      //Construction du  de Lien
      int num_lien = 0;
         for (int i = 0; i < n; i++) 
         {
            for (int j = 0; j < n; j++) 
             {
                if (M[i][j] > 0) 
                  { 
              //Lien(i,j) = meme que Lien(j,i)
         if (j > i)
         {
          cout << "i= "<<i<<", j= " <<j<< ", M["<<i<<"]["<<j<<"]="<<M[i][j]<<endl;
          LienPhys L_Obj(num_lien, M[i][j], Vect_N[i], Vect_N[j], env);
          L_Obj.afficher();
          Vect_L.push_back(L_Obj);
          //L_Obj.~LienPhys();
          num_lien++;      
         }
             }
             }
         }
      cout<<endl;
      Vect_L[0].afficher();
      cout<< Vect_L[0].get_NoeudM().get_Num()<<endl;
      cout<< Vect_L[0].get_NoeudN().get_Num()<<endl;
      cout<<endl;
      Vect_L[1].afficher();
      cout<< Vect_L[1].get_NoeudM().get_Num()<<endl;
      cout<< Vect_L[1].get_NoeudN().get_Num()<<endl;
      cout<<endl;
      //Affichage de tous les LienPhys
      for (int k = 0; k < Vect_L.size(); k++) 
         {
       Vect_L[k].afficher();
      }
    et j'ai obtenu
    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
    0
    1
    2
    3
    N[0] = 0
    N[1] = 0
    N[2] = 0
    N[3] = 0
    N[4] = 0
    N[5] = 0
    i= 0, j= 1, M[0][1]=150
    L[10102400][1] de longueur = 150km est à 0
    i= 0, j= 2, M[0][2]=150
    L[10102400][2] de longueur = 150km est à 0
    i= 1, j= 2, M[1][2]=200
    L[1][2] de longueur = 200km est à 0
    i= 1, j= 3, M[1][3]=3000
    L[1][3] de longueur = 3000km est à 0
    i= 2, j= 4, M[2][4]=300
    L[2][4] de longueur = 300km est à 0
    i= 3, j= 4, M[3][4]=200
    L[3][4] de longueur = 200km est à 0
    i= 3, j= 5, M[3][5]=150
    L[3][5] de longueur = 150km est à 0
    i= 4, j= 5, M[4][5]=500
    L[4][5] de longueur = 500km est à 0
    L[4][5] de longueur = 0km est à 0
    -12847224
    -15793904
    L[10102400][2] de longueur = 150km est à 0
    -15793888
    2
    L[10102400][2] de longueur = 0km est à 0
    L[10102400][2] de longueur = 150km est à 0
    L[1][2] de longueur = 200km est à 0
    L[1][3] de longueur = 3000km est à 0
    L[2][4] de longueur = 300km est à 0
    L[3][4] de longueur = 200km est à 0
    L[3][5] de longueur = 150km est à 0
    L[4][5] de longueur = 500km est à 0
    Il est dans les Choux !!
    Je continu de chercher,

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Est-ce que tes classes ont des constructeurs par copie ? Si oui est-ce qu'on peut les voir ? Si non quels sont les types de leurs données membres ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Je pense aussi que cela doit veni de mes classe

    classe Noeud:
    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
    #include <iostream.h>
    #include "Noeud.h"
     
    //Description des différents couts
    const float Noeud::Mat_EXC = 20.44;
    const float Noeud::Mat_OXC = 10.78;
    const float Noeud::Site_Noeud = 7.67;  
    const float Noeud::Cout = Mat_EXC + Mat_OXC + Site_Noeud;
    //Constructeur
    Noeud::Noeud(){}
    Noeud::Noeud(const Noeud& NC)
    {
     if (NC.Num > 0)
     {
      Num = NC.Num;
      Type = NC.Type;
      Etat = NC.Etat;
      VarN = NC.VarN;
     }
    }
    Noeud::Noeud(int k, int t, bool e, IloEnv env)
    {
     Num = k;
     Type = t;
     Etat = e;
     VarN = IloBoolVar(env, "N");
    }
    //Accesseurs
    int Noeud::get_Num() {return Num;}
    int Noeud::get_Type() {return Type;}
    bool Noeud::get_Etat() {return Etat;}
    IloBoolVar Noeud::get_Var() {return VarN;}
     
    //Modificateur
    //void Noeud::set_Num(int a) {Num = a;}
    void Noeud::set_Etat(bool a) {Etat = a;}
     
    void Noeud::afficher()
    {
     cout << "N[" << Num << "] = " << Etat << endl;
    }
    //Destructeur
    Noeud::~Noeud(){}
    et la classe LienPhys
    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
    #include "Noeud.h"
    #include "LienPhys.h"
    //Description des différents couts
    const float LienPhys::MUX = 1.33;
    const float LienPhys::Booster = 1.67;
    const float LienPhys::Site_Ampli = 4.78;
    const float LienPhys::Module_DCF = 1.44 * (80/100);
    const float LienPhys::CoutF = MUX + Booster;
    const float LienPhys::D = Site_Ampli + Module_DCF;
     
    //Constructeur
    LienPhys::LienPhys(){}
    LienPhys::LienPhys(const LienPhys& LC)
    {
     if (LC.Num > 0)
     {
      Num = LC.Num;
      Longueur = LC.Longueur;
      M = LC.M;
      N = LC.N;
      CoutV = LC.CoutV;
      Etat = LC.Etat;
      VarL = LC.VarL;
     }
    }
    LienPhys::LienPhys(int k, double l, Noeud x, Noeud y, IloEnv env)
    {
     Num = k; 
     Longueur = l;
     M = x;
     N = y;
     CoutV = D * Longueur;
     VarL = IloBoolVar(env, "L");
    }
    //Accesseurs
    int LienPhys::get_Num() {return Num;}
    double LienPhys::get_Longueur() {return Longueur;}
    Noeud LienPhys::get_NoeudM() {return M;}
    Noeud LienPhys::get_NoeudN() {return N;}
    bool LienPhys::get_Etat() {return Etat;}
    IloBoolVar LienPhys::get_Var() {return VarL;}
     
    //Modificateur
    void LienPhys::set_Num(int a) {Num = a;}
    void LienPhys::set_Etat(bool a) {Etat = a;}
    void LienPhys::afficher()
    {
     cout << "L[" << M.get_Num() << "][" << N.get_Num() << "] de longueur = "
     << get_Longueur() <<"km est à " << Etat << endl;
    }
    //Destructeur
    LienPhys::~LienPhys(){}
    J'avourai que les constructeurs par copie, j'ai pas trop compris

  11. #11
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    A vu de nez, sans avoir trop regardé le code, ça peut venir d'un passage par valeur et non par référence ou pointeur; ainsi l'objet que tu veux modifier est copié, et tu travail sur la copie et non sur l'objet lui même... Ce qui pourrai expliquer le fait que ton objet ne se modifie pas.

    Pour ce qui est des constructeur de copie, c'est le constructeur qui est apellé s'il y a une copie de ton objet à faire :
    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
     
    class A
    {
        public :
            A(void) {this->i = 0;}
            ~A(void) throw() {}
            A(const A& AToCopy) {this->i = AToCopy.i;}    // Le constructeur de copie
            const A& operator=(const A& AToCopy) {this->i = AToCopy.i; return *this;}
        private :
            int i;
    };
    /**/
    A Salut;
    A Bonjour(Salut);    // Ca va apeller le constructeur de copie, je créé un A à partir d'un autre.
    A Coucou;
    Coucou = Salut;     // Ca va apeller l'opérateur de copie
    J'ai parlé de l'opérateur de copie, car dans la pluspart des cas, si on a un destructeur, on a aussi un opérateur de copie et un constructeur de copie... Ce n'est pas une règle absolue, mais dans pas mal de cas la présence d'un des trois force les deux autres :
    Si on a besoin de détruire un objet de manière spécifique, alors pour cequi est de sa copie il en est de même. (Il faut penser aux allocations mémoire par exemple)
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Après plusieurs modifications dans mon code et l'utilisation dun opérateur de copie, etc...

    J'ai enfin trouvé une solution mais cela relève tout de même du MYSTERE!!

    Regardez bien:
    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
         //Construction du vecteur de Noeud
         for (int i = 0; i < n; i++) 
         {
            //Création dez Noeuds
       Noeud N_Obj(i, 0, false, env);
       Vect_N.push_back(N_Obj);
         }
      //Affichage de tous les Noeuds
      for (int i = 0; i < Vect_N.size(); i++) {Vect_N[i].afficher();}
      cout<<endl; 
     
      //Construction du  de Lien
      int num_lien = 1;
      long lg = 0;
         for (int i = 0; i < n; i++) 
         {
            for (int j = 0; j < n; j++) 
             {
                if (M[i][j] > 0) 
                  { 
              //Lien(i,j) = meme que Lien(j,i)
         if (j > i)
         {
          Noeud N1 = Vect_N[i];
          Noeud N2 = Vect_N[j];
          lg = M[i][j];
          cout<<"N1= "<<N1.get_Num()<<", N2= "<<N2.get_Num()<<", lg= "<<lg<<endl;
     
          LienPhys L_Obj(num_lien, lg, N1, N2, false, env);
          L_Obj.afficher();
          cout<<endl;
     
          Vect_L.push_back(L_Obj);  
          num_lien++;      
         }
             }
             }
         }
      cout<<endl;
     
      //Affichage de tous les LienPhys
      for (int k = 0; k < Vect_L.size(); k++) 
         {
       Vect_L[k].afficher();
      }
    RESULTATS:
    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
     
    N[0] = 0
    N[1] = 0
    N[2] = 0
    N[3] = 0
    N[4] = 0
    N[5] = 0
    N1= 0, N2= 1, lg= 150
    L[-4198472][1] de longueur = 150km est à 0
    N1= 0, N2= 2, lg= 150
    L[-4198472][2] de longueur = 150km est à 0
    N1= 1, N2= 2, lg= 200
    L[1][2] de longueur = 200km est à 0
    N1= 1, N2= 3, lg= 3000
    L[1][3] de longueur = 3000km est à 0
    N1= 2, N2= 4, lg= 300
    L[2][4] de longueur = 300km est à 0
    N1= 3, N2= 4, lg= 200
    L[3][4] de longueur = 200km est à 0
    N1= 3, N2= 5, lg= 150
    L[3][5] de longueur = 150km est à 0
    N1= 4, N2= 5, lg= 500
    L[4][5] de longueur = 500km est à 0
     
    L[-4198472][1] de longueur = 150km est à 0
    L[-4198472][2] de longueur = 150km est à 0
    L[1][2] de longueur = 200km est à 0
    L[1][3] de longueur = 3000km est à 0
    L[2][4] de longueur = 300km est à 0
    L[3][4] de longueur = 200km est à 0
    L[3][5] de longueur = 150km est à 0
    L[4][5] de longueur = 500km est à 0
    et en modifiant :
    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
         //Construction du vecteur de Noeud
         for (int i = 0; i < n; i++) 
         {
            //Création dez Noeuds
       Noeud N_Obj(i+1, 0, false, env);
       Vect_N.push_back(N_Obj);
         }
      //Affichage de tous les Noeuds
      for (int i = 0; i < Vect_N.size(); i++) {Vect_N[i].afficher();}
      cout<<endl; 
     
      //Construction du  de Lien
      int num_lien = 1;
      long lg = 0;
         for (int i = 0; i < n; i++) 
         {
            for (int j = 0; j < n; j++) 
             {
                if (M[i][j] > 0) 
                  { 
              //Lien(i,j) = meme que Lien(j,i)
         if (j > i)
         {
          Noeud N1 = Vect_N[i];
          Noeud N2 = Vect_N[j];
          lg = M[i][j];
          cout<<"N1= "<<N1.get_Num()<<", N2= "<<N2.get_Num()<<", lg= "<<lg<<endl;
     
          LienPhys L_Obj(num_lien, lg, N1, N2, false, env);
          L_Obj.afficher();
          cout<<endl;
     
          Vect_L.push_back(L_Obj);  
          num_lien++;      
         }
             }
             }
         }
      cout<<endl;
     
      //Affichage de tous les LienPhys
      for (int k = 0; k < Vect_L.size(); k++) 
         {
       Vect_L[k].afficher();
      }
    RESULTATS:
    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
    N[1] = 0
    N[2] = 0
    N[3] = 0
    N[4] = 0
    N[5] = 0
    N[6] = 0
    N1= 1, N2= 2, lg= 150
    L[1][2] de longueur = 150km est à 0
    N1= 1, N2= 3, lg= 150
    L[1][3] de longueur = 150km est à 0
    N1= 2, N2= 3, lg= 200
    L[2][3] de longueur = 200km est à 0
    N1= 2, N2= 4, lg= 3000
    L[2][4] de longueur = 3000km est à 0
    N1= 3, N2= 5, lg= 300
    L[3][5] de longueur = 300km est à 0
    N1= 4, N2= 5, lg= 200
    L[4][5] de longueur = 200km est à 0
    N1= 4, N2= 6, lg= 150
    L[4][6] de longueur = 150km est à 0
    N1= 5, N2= 6, lg= 500
    L[5][6] de longueur = 500km est à 0
     
    L[1][2] de longueur = 150km est à 0
    L[1][3] de longueur = 150km est à 0
    L[2][3] de longueur = 200km est à 0
    L[2][4] de longueur = 3000km est à 0
    L[3][5] de longueur = 300km est à 0
    L[4][5] de longueur = 200km est à 0
    L[4][6] de longueur = 150km est à 0
    L[5][6] de longueur = 500km est à 0
    Alors Jolie le tour de magie!

    Bref, il ya peut être un lien direct ou indirect entre le fait que je crée un Noeud avec un attribut Num = 0 et je faisais un push_back au vector "Vect_N" qui comme chacun sait commence à Vect_N[0]

    Cela dit cela vient peut être de mon compilateur "CC" sous Solaris

    Merci quand même à tous.

    A+.

  13. #13
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par Clark
    Alors Jolie le tour de magie!
    il n'y a pas de tour de magie là dedans. le listing était déjà correct avant pour i=1 et plus. donc là tu n'as fait qu'occulter le problème.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Salut bigboomshakala,

    Alors sais tu pourquoi quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         //Construction du vecteur de Noeud
         for (int i = 0; i < n; i++) 
         {
            //Création dez Noeuds
             Noeud N_Obj(i, 0, false, env);
            Vect_N.push_back(N_Obj);
         }
    j'obtiens à la relecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L[-4198472][1] de longueur = 150km est à 0

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Fais une exécution pas à pas à cet endroit pour i = 0, et regarde ce qu'il se passe. En l'occurence si une variable prend la valeur -4198472 ça devrait être assez facile de trouver l'erreur.

  16. #16
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Salut Clark,
    je pense avoir trouvé d'où vient l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Noeud::Noeud(const Noeud& NC)
    {
      if (NC.Num > 0)
      {  
         Num = NC.Num;
         Type = NC.Type;
         Etat = NC.Etat;
         VarN = NC.VarN;
       }
    }
    L'erreur vient d'ici (ou de operator=) car si Num = 0 alors tu ne passes pas et Num n'est jamais défini.

    A+

    b Oo
    b Oo

  17. #17
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Salut b Oo,

    C'est vrai, tu as raison. Encore une fois j'ai pas tout examiner correctement.

    Ah lala, J'ai vraiment était nul sur ce coup!

    Merci encore à tout le monde.

    Et non, la magie n'existe PAS !!

    A+.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/02/2014, 15h53
  2. Réponses: 1
    Dernier message: 12/04/2010, 16h49
  3. Réponses: 2
    Dernier message: 01/11/2008, 20h19
  4. Objet en cache qui disparait
    Par Hokutomarsouin dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/06/2007, 09h51
  5. LABEL QUI DISPARAIT SUR UN PICTUREBOX !
    Par Sophie42 dans le forum MFC
    Réponses: 2
    Dernier message: 13/01/2004, 12h10

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