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 :

fonction retourant un pointeur


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 29
    Par défaut fonction retourant un pointeur
    Bonjour,

    Est-ce possible de faire une fonction retournant un pointeur sur un objet ?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *Objet getMin(Objet *noeud, string el);
    Le but étant de pouvoir accueillir cette fonction directement par un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Objet *courant = getMin(n,el);
    Par exemple, si le pointeur courant pointe sur un noeud, la fonction getMin retournerait directement un pointeur sur un noeud, qui serait le min.

    Est-ce que ceci est possible, ou est-ce qu'il y a moyen de faire mieux ?

    merci !

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    T* foo();


    Mais bon, faut savoir ce qu'on fait. Si l'objet a été dynamiquement alloué c'est à l'appelant de garantir sa destruction?

    Tu peux utiliser une référence (constante) aussi.

  3. #3
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 45
    Par défaut
    En référence à mon post:
    http://www.developpez.net/forums/d83...onst-fonction/

    est il possible d'en faire carrément une lvalue comme avec des références?

    genre

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    [SUPPRESSION]

    [EDIT]
    Erf, le précedent post n'est pas l'auteur... Je me douter qu'il y avais un truc bizarre >< !
    [/EDIT]

    Oui...

    => une référence n'est pas un truc magique. C'est un pointeur figé à sa création... Tout ce qu'on peut faire avec une ref, on peut le faire avec un pointeur (sauf la surcharge d'opérateur).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 29
    Par défaut
    'jour,

    Ce n'est pas de mon crue cette fonction qui va vers un pointeur...
    Par contre, si je fais comme ça, est-ce que ça fait plus de sens ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Objet *courant = &getMin(n,el);
    En ajoutant une référence, le pointeur pointera vers la référence du résultat de la fonction.
    Du moins, je n'ai plus d'erreur d'initialisation!

    merci pour votre avis

  6. #6
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Je savais que j'étais pas reveillé...

    Bon, l'opérateur "&", c'est pour récupérer l'adresse d'une rvalue... Donc ce que tu met n'as aucun sens...

    Sous reserve que ta fonction retourne effectivement une ravlue (pointeur ou référence), tu peux "récupérer" cette objet par adresse (comprendre ref. ou pointeur). Si tu a mis des otpions de compilation style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -pedantic -std=c++03 -wAll
    et que rien de rale, c'est que ta fonction renvoie une référence.

    Sinon, si tu es sur qu'elle renvoie un pointeur, met les options équivalente. Si ça marche toujours, jette ton compilateur....

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ce qui est embêtant, avec le symbole "&", c'est qu'il a quatre sémantique définies et une cinquième libre

    Ainsi, il peut s'agir
    • du symbole représentant une référence, lorsque tu es dans une déclaration (Type /* const */ & ref /*=lavar */ , Type /* const */ & foo(), void bar( Type /* const */ & ) )
    • du symbole "address of" (prise de l'adresse de l'objet pour créer un pointeur) lorsqu'il se rapporte à une rvalue
    • du symbole ET logique, lorsqu'il relie deux expressions pouvant être considérées comme valeurs binaires (res = value & mask )
    • du symbole ET optimisé (dans le sens où la deuxième expression n'est évaluée que si la première est vraie) lorsqu'il est doublé et qu'il relie deux expressions évaluables comme si elles étaient booléennes ( if (ptr && ptr->next) )
    • N'importe quelle sémantique lorsqu'on ne définit pour une classe (boost.serialize lui donne la sémantique d'accès à un flux in ou out, par exemple)

    Dans l'exemple que tu donnes ( Objet *courant = &getMin(n,el); ), l'opérateur & s'applique à une rvalue, et tu prend donc "l'adresse de ce qui est renvoyé par getMin".

    Si le résultat renvoyé par getMin est déjà un pointeur, tu obtiendra donc un pointeur de pointeur...
    Citation Envoyé par Goten
    T* foo();


    Mais bon, faut savoir ce qu'on fait. Si l'objet a été dynamiquement alloué c'est à l'appelant de garantir sa destruction?
    Il faut savoir ce que l'on fait, mais ce n'est pas *forcément* à l'appelant de garantir la destruction:

    c'est plutôt à l'objet ou à la fonction qui possède le pointeur sur le premier noeud sur lequel tous les autres viennent se "greffer"...

    Encore faut il veiller à ne pas détruire l'objet trop top... ni trop tard

    L'utilisation du RAII (et surtout de son pendant Ressource Release is Destruciton :p) peut nous donner certaines certitudes sur le sujet

    Citation Envoyé par Lavock
    => une référence n'est pas un truc magique. C'est un pointeur figé à sa création... Tout ce qu'on peut faire avec une ref, on peut le faire avec un pointeur (sauf la surcharge d'opérateur).
    Oui si l'on observe le code binaire exécutable créé, mais... non, car la compréhension de ce qu'est une référence devrait se limiter à la sémantique et à la syntaxe, c'est à dire à un domaine où les différences sont bien plus nombreuses que les points communs...

    Il faut comprendre qu'un pointeur est un objet, dans le sens où il dispose de sa propre adresse en mémoire, ce qui fait qu'il est possible d'utiliser l'opérateur "address of" pour récupérer... un autre objet dont la valeur représentera... l'adresse du pointeur et obtenir... un pointeur de pointeur, sur lequel il est possible d'utiliser l'opérateur "address of" pour obtenir un pointeur de pointeur de pointeur, et nous pourrions continuer ainsi presque jusqu'à la saint glain glain...

    Une référence par contre est un alias de l'objet référencé et n'a, "officiellement" du point de vue du programmeur du moins, pas d'adresse mémoire propre (même si, actuellement, du point de vue du code généré, elle dispose, effectivement d'une place mémoire qui lui est réservée).

    Il est donc possible de déclarer une référence sur un pointeur (Type *& refPtr), mais il est par contre impossible de déclarer... un pointeur sur référence (Type &* ptrRef)... ou d'essayer d'en prendre l'adresse.

    De plus, syntaxiquement parlant, il y a une différence entre l'utilisation d'un pointeur, qui requière l'utilisation de la fleche "->" ou de l'étoile " * " (utilisée pour sa sémantique d' operateur "pointed by") pour pouvoir accéder au contenu de l'objet pointé, alors qu'une référence se manipulera en utilisant exactement la même syntaxe que si l'on manipulait l'objet d'origine (le plus souvent en utilisant le point "." pour accéder à son contenu, à moins que nous n'ayons justement affaire à... une référence sur un pointeur...), modulo les éventuelles restrictions imposées par le fait que la référence puisse être déclarée constante.

    Personnellement j'estime, mais je peux faire fausse route, qu'il est préférable de limiter, dans un premier temps du moins, la compréhension des références au seul domaine de la sémantique et de la syntaxe, afin d'éviter toute confusion entre une référence ( Type /* const */ &) et... un pointeur constant (Type * const )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Citation Envoyé par koala01 Voir le message

    Personnellement j'estime, mais je peux faire fausse route, qu'il est préférable de limiter, dans un premier temps du moins, la compréhension des références au seul domaine de la sémantique et de la syntaxe, afin d'éviter toute confusion entre une référence ( Type /* const */ &) et... un pointeur constant (Type * const )
    Je pense que cela dépends de si la personne maîtrise le C ou pas... Mais j'avoue, tous ce qui est val/ptf/ref, etc... c'est déjà pas simple. Et ça va être encore plus difficile en c++1x (<- boutade).

    D'ailleurs, y a un truc dans la faq pour ça ?
    *est partie vérifier*

    Le plus proche par juste de "qu'est-ce qu'une réf"... Mais rien sur le c++1x (<- boutade encore).

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Lavock Voir le message
    <snip> Et ça va être encore plus difficile en c++1x (<- boutade).
    <snip>
    Mais rien sur le c++1x (<- boutade encore).
    <snip>
    Mais tu n'a rien compris: 0x ou permet d'aller jusqu'à F
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Retour de fonction pour allocation pointeur
    Par Tenshock dans le forum C
    Réponses: 8
    Dernier message: 26/12/2014, 21h44
  2. Réponses: 11
    Dernier message: 07/01/2008, 19h47
  3. retour de pointeur par une fonction
    Par Miko95 dans le forum C++
    Réponses: 17
    Dernier message: 12/12/2007, 01h33
  4. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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