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 :

Comment gérer un pointeur sur un double et pointer vers un double


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 Comment gérer un pointeur sur un double et pointer vers un double
    Bonjour,

    J'ai une situation ici selon laquelle je dois pointer sur un double et le mettre égal à un double.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double *d = fct(N1,N2); //fct retourne un double.
     
    // Erreur C2440 '=' cannot convert from double to double*
    Voici ce que je me propose comme solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double *d;
    double d2 = fct(N1,N2); //fct retourne un double.
    d = &d2;
    Est-ce que ceci fait du sens ? Quel est l'impact exact ? Je me dis que l'utilisation du & (perluète) fait en sorte que le pointeur est sur l'adresse mémoire du retour de la fonction et non vraiment sur le double.
    Est-ce que ça reste tout de même cohérent ?
    Est-ce que le résultat sera le même ?

    merci !

  2. #2
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Par défaut
    Pourrais tu nous montrer le code de la fonction car il semblerait que l'erreur se situe au niveau de la valeur de retour de celle-ci (ce doit être une referance) il me semble.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     double maFonction()
    {...
      double monresultat;
       return &monresultat;
    }
    @+

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Citation Envoyé par lolotte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     double maFonction()
    {...
      double monresultat;
       return &monresultat;
    }
    Attention, ce code pose deux problèmes :
    1/ la fonction déclare retourner un double (double maFonction()) et veut effectivement retourner &monresultat qui est de type double*. Ce sont deux types différents.
    2/ Beaucoup plus grave : monresultat est une variable locale de maFonction. Cette variable sera détruite dès la sortie de la fonction. L'adresse (ou une référence) de monresultat ne sera plus valide au retour de la fonction et le code va planter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double *pd = maFonction();// pd pointe sur une zone mémoire invalide

    Citation Envoyé par Seabast888 Voir le message
    J'ai une situation ici selon laquelle je dois pointer sur un double et le mettre égal à un double.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double *d = fct(N1,N2); //fct retourne un double.
     
    // Erreur C2440 '=' cannot convert from double to double*
    Voici ce que je me propose comme solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double *d;
    double d2 = fct(N1,N2); //fct retourne un double.
    d = &d2;
    Est-ce que ceci fait du sens ? Quel est l'impact exact ? Je me dis que l'utilisation du & (perluète) fait en sorte que le pointeur est sur l'adresse mémoire du retour de la fonction et non vraiment sur le double.
    Est-ce que ça reste tout de même cohérent ?
    Est-ce que le résultat sera le même ?
    Je ne comprend pas très bien ton problème. Le second code que tu présentes est valide puisque d prend l'adresse de d2 qui reste définie au retour de la fonction (mais qui sera détruite lorsque d2 sortira de sa portée). Et d2 reçoit bien la valeur en retour de la fonction.
    Mais, tel quel, je n'en vois pas l'intérêt. Donc pourrais-tu préciser ta question. Que veux-tu faire ensuite avec cette adresse ?

  4. #4
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Par défaut
    J'aimerais si possible avoir quelque détail concernant ma proposition erronée:

  5. #5
    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
    Elle n'est pas erroné, seulement pas très utile d'après ce qu'on peut voire...

  6. #6
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Par défaut
    Merci j'ai vue l'erreur !!!

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Elle n'est pas erroné, seulement pas très utile d'après ce qu'on peut voire...
    Il me semble quand même que le code proposé est erroné.
    Pour les deux raisons que j'avais mentionnées :
    Citation Envoyé par 3DArchi Voir le message
    1/ la fonction déclare retourner un double (double maFonction()) et veut effectivement retourner &monresultat qui est de type double*. Ce sont deux types différents.
    2/ Beaucoup plus grave : monresultat est une variable locale de maFonction. Cette variable sera détruite dès la sortie de la fonction. L'adresse (ou une référence) de monresultat ne sera plus valide au retour de la fonction et le code va planter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double *pd = maFonction();// pd pointe sur une zone mémoire invalide

  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
    >< J'ai rien compris à la discussion. La solution proposé n'est pas erroné, c'est la solution de base ! Mais !

    Je dois avoir des problèmes de lecture moi >< !

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Lavock Voir le message
    >< J'ai rien compris à la discussion. La solution proposé n'est pas erroné, c'est la solution de base ! Mais !

    Je dois avoir des problèmes de lecture moi >< !
    Ah ! J'ai compris ce que tu voulais dire. On était en plein quiproquo j'ai l'impression :
    La solution de Seabast888 a l'air bonne (sous réserve de ce que devient le pointeur) là où celle de lolotte présente des problèmes.

  10. #10
    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
    Bonjour,

    En fait, je ne retourne pas ce pointeur tel quel, mais je l'utilise.

    Ma question initial est comment gérer un pointeur sur un double. Par exemple, comment faire pour le mettre = à 0.0 ?

    Sachant maintenant que je ne retourne pas ce pointeur, est-ce que de la faire pointer vers une référence est correcte ?

    Un nouvel exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double *m = NULL;
    double s = 0.0;
    m = &s;
    Dans ce cas-ci par exemple, est-ce que m contiendra bien 0.0, et si je veux faire des modifications, je peux les faires directement sur s. Est-ce que ceci est correcte ?

    Aussi, considérant que je ne retourne jamais ce pointeur, qu'il ne sortira pas de la fonction, alors pas de problème de plantage ?

    merci!

  11. #11
    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
    Didiou >< !

    Le '&' c'est un opérateur unaire servant à recupérer l'adresse d'une variable.
    Le prochain qui me sort &var est la référence de var !

    Son opérateur contraire est '*'. *ptr est donc la variable pointé par ptr.

    Sinon, oui, c'est bon, mais c'est franchement "bizarre".
    Généralement, on se contente de s... Est si on a une fonction qui à besoin d'un double* est qu'on veut lui passer s, on utilise l'opérateur '&'.

  12. #12
    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
    Mon premier réflexe a aussi été de faire :

    m = s; sans l'opérateur unaire '&'
    et je recevais cette erreur : error C2440: '=' : cannot convert from 'double' to 'double *'

    J'ai donc ajouter '&' pour que le pointeur puisse tenir en compte la valeur de s, mais c'est aussi ce que je me demandais, si ce n'était pas un peu étrange...

    Mon but est simplement de faire en sorte que le pointeur double *m pointe sur double s et que s puisse changer de valeur sans problème. Est-ce que je peux faire mieux ou plus simple ?

    Au sujet du &, lorsqu'il est passé en paramètre dans la déclaration d'une fonction, ça s'appelle bien une référence, non? - Je me risque là :

  13. #13
    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 Seabast888 Voir le message
    Mon premier réflexe a aussi été de faire :

    m = s;
    Pas se que je voulais dire. Je me demande juste l'interêt d'avoir une variable est un pointeur de la variable dans le même scope.

    Il est parfaitement logique que m, qui est un pointeur sur double (double*) stocke l'adresse de s (qui s'obtient avec l'opérateur &).

    Citation Envoyé par Seabast888 Voir le message
    Au sujet du &, lorsqu'il est passé en paramètre dans la déclaration d'une fonction, ça s'appelle bien une référence, non? - Je me risque là :
    Oui, c'est à la fois un opérateur unaire de récupération d'adresse, un opérateur binaire de & bit-à-bit et la façon de déclarer une référence...

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

Discussions similaires

  1. [VB.Net/Dataview] Comment gérer un filtre sur une colonne de type date ?
    Par silatchom dans le forum Accès aux données
    Réponses: 3
    Dernier message: 07/07/2006, 19h28
  2. [VB6] Comment gérer un Timeout sur l'api HttpSendRequest
    Par marsup54 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/06/2006, 10h15
  3. [Dates] Comment gérer les dates sur un blog ?
    Par psychoBob dans le forum Langage
    Réponses: 10
    Dernier message: 14/06/2006, 14h09
  4. comment gérer plusieurs locks sur une table?
    Par charluber dans le forum Oracle
    Réponses: 4
    Dernier message: 18/04/2006, 21h28
  5. Réponses: 11
    Dernier message: 06/04/2006, 13h30

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