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++/CLI Discussion :

Problème de référence


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 47
    Points : 29
    Points
    29
    Par défaut Problème de référence
    Bonjour,
    Voilà je commence depuis peu à développer en C++ .net (mais depuis 2 ans en C++) et voilà j'ai un petit souci.
    Je développe un convertisseur de carnet d'adresse MAC vers carnet d'adresse PC(pour ceux que ça intéresse). Je scrute mon fichier VCF qui contient tous mes contact. Je créé un objet "personne" qui va contenir les données de la personne en cours. A la fin des données concernant cette personne, j'ajoute l'objet "personne" dans une liste soit list->Add(personne) (aussi simplement qu'en java d'ailleurs).
    A chaque nouvelle personne, je réutilise mon objet personne que j'ai créé précédemment tout en le réinitialisant à chaque personne rencontrée (je ne désalloue pas afin de faire du recyclage d'objet).
    Le souci est que lorsque j'affiche l'ensemble des contacts mémorisés (ici j'en ai 66), les 66contacts ont le même nom.

    J'ai l'impression que le list->add(objet) ne fait que passer l'adresse et ne copie pas l'objet personne.
    Que dois je faire un constructeur de copie ? (ça me pose quelques soucis en .net)...
    Merci de m'éclaircir
    DD_Le_Terrible

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Citation Envoyé par babozfr
    Bonjour,
    Voilà je commence depuis peu à développer en C++ .net (mais depuis 2 ans en C++) et voilà j'ai un petit souci.
    Je développe un convertisseur de carnet d'adresse MAC vers carnet d'adresse PC(pour ceux que ça intéresse). Je scrute mon fichier VCF qui contient tous mes contact. Je créé un objet "personne" qui va contenir les données de la personne en cours. A la fin des données concernant cette personne, j'ajoute l'objet "personne" dans une liste soit list->Add(personne) (aussi simplement qu'en java d'ailleurs).
    A chaque nouvelle personne, je réutilise mon objet personne que j'ai créé précédemment tout en le réinitialisant à chaque personne rencontrée (je ne désalloue pas afin de faire du recyclage d'objet).
    Le souci est que lorsque j'affiche l'ensemble des contacts mémorisés (ici j'en ai 66), les 66contacts ont le même nom.

    J'ai l'impression que le list->add(objet) ne fait que passer l'adresse et ne copie pas l'objet personne.
    Que dois je faire un constructeur de copie ? (ça me pose quelques soucis en .net)...
    Merci de m'éclaircir
    montre nous ton code

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    Il est sale

    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
    CReadVcf::CReadVcf(TextReader ^ stream){
        String ^ line;
        int count = 0;
        bool readable = 0;
        this->fileStream = stream;
        personne = gcnew CObjetVcf();
        array<String ^, 1> ^ adr = gcnew array<String ^>(3);
        contacts = gcnew System::Collections::Generic::List<CObjetVcf^>();
     
        while(line = stream->ReadLine()){        
            if(line->StartsWith("BEGIN:VCARD")){
                //on saute la version
                stream->ReadLine();
                readable = 0;
            }
            if(line->StartsWith("END:VCARD")){
                readable = 0;
                count++;
                contacts->Add(personne);
                personne->Re set();            
            }


    Objet personne :

    .h
    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
    #pragma once
    using namespace System;
    using namespace System::Windows::Forms;
     
     
    ref class CObjetVcf{
     
    private: 
        String ^ nom, ^ prenom, ^mailWork, ^mailHome;
        array<String^>^adresseWork,^adresseHome;
        int age;
        String^ telFixe,^telMobile,^telTravail;
     
    public :
        CObjetVcf(); //constructeur
        CObjetVcf CObjetVcf(const CObjetVcf ^o); //constructeur de copie
        String^ getTelFixe();
        String^ getTelMobile();
        String^ getTelTravail();
        int getAge();
        String^ getNom();
        String^ getPrenom();
        array<String^>^ getAdresseWork();
     
        void setNom(String ^);
        void setPrenom(String ^);
        void setAdresseWork(array<String^>^);
        void setAdresseHome(array<String^>^);
        void setMailWork(String ^);
        void setMailHome(String ^);
     
        void convertToLdiff();
        String^ Show();
        void Reset();
    };
    .cpp
    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
    #include "stdafx.h"
    #include "CObjetVcf.h"
     
    CObjetVcf::CObjetVcf(){
        Reset();
    }
     
    CObjetVcf CObjetVcf::CObjetVcf(const CObjetVcf ^o){
        this->nom = o->nom;
        this->prenome
            //String ^ nom, ^ prenom, ^mailWork, ^mailHome;
        //array<String^>^adresseWork,^adresseHome;
        //int age;
        //String^ telFixe,^telMobile,^telTravail;
    }
     
    void CObjetVcf::Reset(){
        nom = "";
        prenom = "";
        telFixe = "";
        telMobile = "";
        telTravail = "";
        age = 0;
    }
     
    String^ CObjetVcf::getTelFixe(){ return this->telFixe;}
    String^ CObjetVcf::getTelMobile(){ return this->telMobile;}
    String^ CObjetVcf::getTelTravail(){ return this->telTravail;}
    int CObjetVcf::getAge(){ return this->age;}
    String^ CObjetVcf::getNom(){ return this->nom; }
    String^ CObjetVcf::getPrenom(){ return this->prenom;}
    array<String^>^ CObjetVcf::getAdresseWork(){ return this->adresseWork;}
    void CObjetVcf::setNom(String ^ name){ this->nom = name;}
    void CObjetVcf::setPrenom(String ^ surname){ this->prenom = surname;}
    void CObjetVcf::setAdresseWork(array<String^>^adr){ this->adresseWork = adr;}
    void CObjetVcf::setAdresseHome(array<String^>^adr){ this->adresseHome = adr;}
    void CObjetVcf::setMailWork(String^ mail){this->mailWork=mail;}
    void CObjetVcf::setMailHome(String^ mail){this->mailHome=mail;}
     
    void CObjetVcf::convertToLdiff()
    {
     
    }
     
    String^ CObjetVcf::Show(){
        String^contenu="";
        contenu = "Nom : "+this->nom+"\nPrénom : "+this->prenom+"\nAdresse Travail : "+this->adresseWork[0]+"\n"+this->adresseWork[1]+" "+this->adresseWork[2]+"\nMail : "+this->mailWork+"\n --------\n";
        return contenu;
    }
    Merrciiiii
    DD_Le_Terrible

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    j'ai pas trop cherché plus loin, mais dans ta boucle, tu utilises toujours le meme objet personne
    tu devrais en recréer un à chaque itération et le remplir de valeur

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    justement je fais exprès d'utiliser le même objet car ça évite d'allouer / désallouer la mémoire, ce qui prend plus de temps...
    on nous a appris à "recycler les objets" il parait que ça optimise les prog.
    Merci
    DD_Le_Terrible

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    je viens d'essayer la même chose en allouant et désallouant l'objet à chaque boucle. Le programme se lance mais une erreur est lancée. Je confirme ce que je pense, la liste ne copie pas mon objet mais pointe dessus ce qui est gênant lorsque je delete l'objet et que j'affiche le contenu de ma liste.
    Avec vous une solution ? Je suis bloqué...
    Si j'utilise la STL ça marcherait mieux ? J'ai des doutes sur l'outil list de .net... je n'ai jamais rencontré ce problème en utilisant les STL.
    Merci
    DD_Le_Terrible

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    il faut que tu alloues un nouvel objet à chaque fois

    tu dois avoir un problème dans ton code

    et ne t'inquietes pas pour la mémoire, le GC s'en occupe

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 47
    Points : 29
    Points
    29
    Par défaut
    J'ai trouvé la solution à ma réponse. C'était bien un problème de référence.
    Il faut donc "cloner" mon objet (je pense que ça correspond à faire une copie) avant de l'ajouter à la liste.
    Donc pas besoin de recréer un objet à chaque boucle de ce fait.

    voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object^ Clone(){return this->MemberwiseClone();};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System::Collections::Generic::List<Object^> contacts = gcnew System::Collections::Generic::List<Object^>();
     
    contacts->Add(personne->Clone());
    Bonne soirée
    DD_Le_Terrible

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

Discussions similaires

  1. [VBA-E] Problème de références
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 13/07/2006, 10h04
  2. Problème de référence de classe
    Par nmathon dans le forum Delphi
    Réponses: 7
    Dernier message: 21/06/2006, 17h46
  3. [FLASH MX2004] this et problème de référence
    Par cristolb dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 03/05/2006, 23h33
  4. Problème de référence de données circulaire
    Par Wismerhill50 dans le forum Langage
    Réponses: 3
    Dernier message: 23/10/2005, 23h38
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 11h39

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