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 fonction qui retourne un pointeur ??


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut probleme avec fonction qui retourne un pointeur ??
    bonjour, j'ai un probleme avec fonction qui retourne un pointeur vers une structure
    dans la fonction ,la variable contient la bonne valeur
    mais une fois j'appel la fonction il m'affiche la mauvaise valeur alors que j'ai utilisé new
    A votre avis que pourrai etre le probleme ?
    Merci :

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Ce n'est pas très compréhensible ;
    Il faudrait un morceau de code

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    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
     
    struct list
    {
    int c;
    list * next;
    }
    list * fonc()
    {
    list * l=new (list);
    ....
    .....
    return l;
    }
    void main()
    {
    list * l;
    l=new (list);
    l=fonc();
    cout<<l->c;
    }
    mon code est tres long mais c'est le meme principe que le code precedent

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    ok : c'est pas ça la solution à ton problème mais dans le code que tu fournis tu fait 2 'new' (1 dans le main et un dans fonc), dont 1 que tu pourra jamais deleter (celui que tu fais dans le main)

    je sais pas si c'est comme ça dans ton vrai code mais si oui ça pose problème.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    oui c'est ca que je fais,mais quel est le probleme si je fais ca

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    salut =)

    bon, j'avoue que je suis loin d'être un expert ès C++, mais il y a qq chose qui me choque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct list
    {
    int c;
    list * next;
    }
    une structure qui contient une adresse d'une structure de même type. Quel est l'intérêt ?

    mais dans le code que tu fournis tu fait 2 'new' (1 dans le main et un dans fonc), dont 1 que tu pourra jamais deleter
    ben on va dire que c'est pas terrible, ça prend de la mémoire qui ne va pas se libérer. bon là ça va, ce n'est qu'une petite structure mais tu imagines une instance avec tous pleins de données à l'intérieur !

    et désolé, mais je n'ai pas très bien compris la question...

    parce que dans ton code on ne vois pas où tu mets une valeur dans c.

  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
    une structure qui contient une adresse d'une structure de même type. Quel est l'intérêt ?
    Construire des listes chaînées par exemple. Chaque élément va pointer sur le suivant dans la liste, ça évite d'avoir tous les éléments contigüs en mémoire comme pour les tableaux.

    oui c'est ca que je fais,mais quel est le probleme si je fais ca
    l = new list va faire pointer l sur une nouvelle liste allouée en mémoire, puis l = fonc() va faire pointer l ailleurs, en l'occurence sur la liste que tu alloues dans fonc(). Donc la première liste sera toujours allouée en mémoire, mais plus personne ne pointera dessus. Ce sera de la mémoire perdue (jusqu'à ce que l'OS fasse le ménage en quittant ton programme). Donc, le l = new list est inutile.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    merci ,mais j'ai pas compris que je dois faire :

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Points : 83
    Points
    83
    Par défaut
    Le problème c'est que tu perd le premier objet pointé par l.

    Si j'ai bien compris ton problème, l'objet en question semble être créé par erreur et ne te sert à rien.
    Ecris directement ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void main()
    {
    list * l = fonc(); 
    ....
    C'est juste que ça provoque une fuite mémoire.
    A chaque new, doit correspondre un delete.
    Comme tu écrases la première valeur du pointeur par une autre, tu ne peux plus faire de delete sur le premier.

    Normalement, ton programme doit afficher l'objet créé dans la fonction "fonc".

    Conseil :
    Si tu veux une liste chaîné, il en existe des tas qui sont parfaitement implémentées (ex STL)
    Laisse tomber les struct, qui rappelle le C, et utilise des classes (c'est la même chose)

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Comme le dit Troll vaut mieux utiliser std::list par exemple ça fonctionne très bien et ça évite de se casser la tête.
    En 2 coup de cuillères à pot on gère des lites chaînées avec ça

  11. #11
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    merci, en utilisant std::list est ce que je peux declarer une list de list
    en autre une list à deux pointeur?

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu peux faire des listes de ce que tu veux (tant que c'est copy-constructible)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    merci mais qu'est ce que ca veu dire
    tant que c'est copy-constructible

  14. #14
    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
    Que les instances de ta classe / structure peuvent être copiées correctement (puisqu'en interne la liste va faire des copies de tes objets).

  15. #15
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    comment je m'assure que les instances de ma structure sont copiees correctement?

  16. #16
    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
    En leur donnant un constructeur par copie qui fait bien son job (+ en général un opérateur d'affectation et un destructeur). Mais bien souvent ceux générés par le compilo suffisent.

  17. #17
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 62
    Points
    62
    Par défaut
    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
     
    list<char>::iterator fonc()
    {
    	list<char> l;
    	l.push_back('a');
    	l.push_back('b');
    	l.push_back('c');
    	l.push_back('d');
    	list<char>::iterator it=l.begin();
    	return it;
    }
    void main()
    {	
    	list<char>::iterator  a;
    	a=fonc();
    	cout<<(*a)<<endl;
    }
    j'ai utilise les list et le probleme avec les pointeurs persiste
    le main ne m'affiche pas la bonne valeur

  18. #18
    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
    La liste l est locale à fonc, donc elle sera détruite dès le retour de cette fonction. Donc l' itérateur renvoyé pointera sur du n'importe quoi.

Discussions similaires

  1. [2008] Probleme fonction qui retourne une table
    Par karimot dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/12/2013, 11h19
  2. Réponses: 6
    Dernier message: 16/01/2011, 15h33
  3. DLL:exporter une fonction qui retourne un pointeur
    Par ephemeride dans le forum C++
    Réponses: 2
    Dernier message: 29/09/2006, 11h42
  4. [Tableaux] Pb avec fonction qui retourne 2 variables
    Par cyberdevelopment dans le forum Langage
    Réponses: 6
    Dernier message: 12/07/2006, 14h19
  5. fonction qui retourne un pointeur
    Par sorari dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2005, 21h23

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