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 :

Pointeur en parametre de sortie : toujours NULL !


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut Pointeur en parametre de sortie : toujours NULL !
    Bonjour,

    Je perd la boule à force de creuser un soucis de pointeur ...

    J'ai une méthode de la forme :
    Truc1* getMachin(string name, Truc2* getparent);

    L'argument getparent est un parametre de sortie, de maniere à récuperer mon objet Truc1 par le return, et dans la foulée le Truc2...
    seulement, mon Truc2 est toujours NULL, alors que dans le code, au moment du return, il est tout à fait correct !

    Meme si je lui affecte un new Truc2() a moment du return, (de maniere à etre sur que la mémoire n'est pas liberée), toujours rien ...

    Pas moyen de passer le Truc2 en reference, dû au fait que ce soit un objet d'une lib externe, que je ne peux manipuler que par pointeurs...

    Alors voilà la question :
    Est ce possible de passer un argument de sortie en plus du return ? si oui comment ?

    La moindre idée ou remarque est la bienvenue :-)

    Merci

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    J'ai absolument rien compris à ton problème .

    Soit clair et ne résonne pas dans l'abstrait.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    C'est normal.

    Un petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int f(int *p)
    {
       p = new int[10];
       return p; // ne pas faire ce code, c'est très mal !!!
    }
     
    void main()
    {
       int * p1 = NULL;
       f(p1);
       std::cout << p1;
    }
    Que se passe-t-il ?

    dans main, p1 est initialisé à NULL. Ensuite, on appelle f(p1), c'est à dire qu'on copie p1 dans p, on a donc p = p1. Puis, p = new int[10], donc disons, p = 0xabcdef12 par exemple. Puis on sort de f, et on revient dans main, et on a donc p1 == ... NULL puisqu'on n'a jamais modifié p1 (on a modifié p qui est une copie de p1).

    Si tu veux modifier p1, il faut faire :

    (plus très sûr de l'ordre de l'* et de l'&).

  4. #4
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    ok désolé je vais le tenter en clarifiant le truc.

    J'ai une simple méthode qui me permet de récuperer un pointeur sur un objet.
    Truc* getObjet(string name);

    seulement, j'ai a présent besoin de l'objet, mais aussi d'un 2eme objet, retourné par cette meme méthode.

    Donc 2 choses :
    * je passe mon pointeur sur le 2eme objet en argument, car le type de retour est déjà "occupé", et dans le corps de la méthode j'affecte le contenu du pointeur.
    * Je surcharge donc ma méthode avec un prototype du genre :
    Truc* getObjet(string name, Truc* t2)

    J'appelle ensuite ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Truc* monTruc1=NULL, monTruc2=NULL;
    monTruc1 = getObjet(name, monTruc2);
    monTruc1 est bon, par contre monTruc2 est systématiquement == NULL...

    J'ai verifié dans la méthode, monTruc2 n'est pas NULL ...

    Voilà donc le soucis ... j'espere avoir été plus compréhensible cette fois ci.
    Merci.



    EDIT : si je comprend bien, meme par pointeur les arguments sont copiés ? je dois donc mettre une reference sur le pointeur pour qu'il reste le meme ?

  5. #5
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par Ange_blond Voir le message
    EDIT : si je comprend bien, meme par pointeur les arguments sont copiés ? je dois donc mettre une reference sur le pointeur pour qu'il reste le meme ?
    Exact. Le pointeur est copie.
    C'est a dire la varialbe qui contient l'addresse.

    Si tu veux modifier le pointeur d'origine (dans l'appelant), il faut en effet passer une reference dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ptr*     func(ptr*& ref)
    {
        // code here
         ref = new ptr();
         // code here
    }
    Ici c'est le pointeur d'origine, dans l'appelant, qui est modifie.

  6. #6
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    \o/

    Merci tout plein, ça a l'air de rouler à présent ! (je dis a l'air car ce qui foirait avant marche a présent ... reste à voir la suite ^^ )

    Merci du coup de main, j'ai encore appris un truc aujoud'hui


  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Je reviens après la bataille mais pour bien t'en rendre compte, il suffit de faire un typedef sur ton type pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef Truc2* pTruc2;
    Truc1* getMachin(string name, pTruc2 getparent);
    Il est clair que le passage est par copie.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. ORA-06502 parametre de sortie pose probleme
    Par Mons dans le forum SQL
    Réponses: 33
    Dernier message: 12/05/2009, 15h37
  2. Passage de pointeur en parametre
    Par cout dans le forum C
    Réponses: 3
    Dernier message: 14/06/2006, 16h45
  3. Retourner un paramètre en sortie d'un executable pour un Bat
    Par Laurent GAUDILLIER dans le forum Langage
    Réponses: 2
    Dernier message: 03/04/2006, 23h49
  4. Réponses: 2
    Dernier message: 30/03/2006, 16h18
  5. récupération de parametres en sortie d'une SP
    Par jbat dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 08h41

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