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

SL & STL C++ Discussion :

Pointeur non modifié à l'interieur d'une fonction ? o_O


Sujet :

SL & STL C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Pointeur non modifié à l'interieur d'une fonction ? o_O
    Bonjour,
    Je me resous à poster parce que mon code ne se comporte vraiment pas comment je pense qu'il devrait se comporter. J'ai du louper quelque chose d'énorme mais je ne vois pas...

    Voila une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    bool isActionKnown(const char* actionName, Action *a)
    {
    	map<string,Action*>::iterator result;
    	result = knownActions.find( actionName );
    	if (result == knownActions.end() )
    		return false;
    	else
    	{	
    		a = knownActions[actionName];
    		cout<<"Value inside the function : "<<a->name<<endl;
    		return true;
    	}
    }
    Et voilà un bout de code qui l'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Action* A = new Action("test");
    cout<<"Value before the function : "<<A->name<<endl;
    k.isActionKnown("empty",A);
    cout<<"Value after the function : "<<A->name<<endl;
    Et la trace du programme est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Value before the function : test
    Value inside the function : empty
    Value after the function : test
    Alors ma question est : pourquoi je n'ai pas "value after the function : empty"...
    Parce que l'objet qui est passé est une copie (donc une copie du pointeur ?)
    Le truc c'est qu'on ne peut pas passer un pointeur par reference...

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui, c'est ce que j'ai essayé de faire, mais le compilo me jette :

    "pointeur non conforme vers la reference"

    (enfin, j'ai résolu mon problème autrement, mais ça m'intrigue quand même... je vois pas comment faire a part en utilisant un pointeur vers ce pointeur...)

  3. #3
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Dans ta fonction, tu obtiens un nouveau pointeur sur un Action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = knownActions[actionName];
    Or, l'adresse mémoire de a a changé et non pas seulement son contenu.

    Soit tu passes le pointeur par référence par qu'il mette à jour l'adresse du pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool isActionKnown(const char* actionName, Action &*a)
    Soit tu modifies vers quoi pointe a et ne touche pas à son adresse mémoire.

    Au passage, utilise std::string en paramètre au lieu de const char*

    A moins que Action soit polymorphique, je te conseillerait de stocker par valeur et non pas par pointeur. Ca fera un code plus propre et pas besoin d'allocation dynamique (du moins sur la partie que tu montres)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool isActionKnown(string actionName, Action &a)
    {
    	map<string,Action>::iterator result;
    	result = knownActions.find( actionName );
    	if (result == knownActions.end() )
    		return false;
    	else
    	{	
    		a = knownActions[actionName];
    		cout<<"Value inside the function : "<<a.name<<endl;
    		return true;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Action A("test");
    cout<<"Value before the function : "<<A.name<<endl;
    k.isActionKnown("empty",A);
    cout<<"Value after the function : "<<A.name<<endl;

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    En fait le code que je montre est juste un bout réarrangé. Mes objets Action sont uniques, mais référencés dans plusieurs autres structures (y compris dans Action), donc je n'ai pas trop le choix...

    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool isActionKnown(const char* actionName, Action &*a)
    j'avais essayé, mais le compilateur me jette. Il n'aime pas la référence sur un pointeur...


    EDIT :
    Autant pour moi, j'ai inversé la position des deux opérateurs. Ca ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool isActionKnown(const char* actionName, Action *&a)
    Merci !

  5. #5
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 528
    Points : 5 197
    Points
    5 197
    Par défaut
    Citation Envoyé par stephane.lallee Voir le message
    Le truc c'est qu'on ne peut pas passer un pointeur par reference...
    ah ? depuis quand ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void myFunc(Action*& ptr)
    {
       ptr = new Action;
    }
     
    int main(int, char**)
    {
       Action* ptr = NULL;
       myFunc(ptr);
       // ptr != NULL
    }
    en fait ton problème est là :
    Citation Envoyé par stephane.lallee Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool isActionKnown(const char* actionName, Action &*a)
    j'avais essayé, mais le compilateur me jette. Il n'aime pas la référence sur un pointeur...
    ce qu'il n'aime pas c'est ton pointeur sur une référence

  6. #6
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Modifie le contenu du pointeur et non pas le pointeur.

    Voici un exemple simple illustrant ton problème:

    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
    #include <iostream>
     
    int gl_val = 2;
     
    void f(int * val)
    {
    	val = &gl_val;
    }
     
    void g(int * val)
    {
    	*val = gl_val;
    }
     
    int main(int argc, char *argv[])
    {
    	int val = 1;
     
    	f(&val);
    	std::cout << "f: " << val << std::endl;
     
    	g(&val);
    	std::cout << "g: " << val << std::endl;
     
        return 0;
    }

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Modifie le contenu du pointeur et non pas le pointeur.
    Oui oui, j'ai bien compris ce que tu essaie de me dire, mais vraiment moi ce que je veux c'est modifier le pointeur, afin d'avoir une seule instance de mon objet et de récupérer son adresse. Je ne veux pas modifier cet objet

    Mais sinon ca marche bien avec le passage par référence du pointeur, et non le pointeur sur une référence... Merci à vous deux

    *n'avait jamais pensé que les pointeurs avaient eux aussi des adresses *

  8. #8
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    ce qu'il n'aime pas c'est ton pointeur sur une référence
    J'avais inversé les 2 symboles ^^ (j'avais fait ça de tête sans tester )


    stephane.lallee, tu as le bouton Résolu ...

  9. #9
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 528
    Points : 5 197
    Points
    5 197
    Par défaut
    Citation Envoyé par stephane.lallee Voir le message
    *n'avait jamais pensé que les pointeurs avaient eux aussi des adresses *
    en toute logique, le pointeur est bien stocké quelque part

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

Discussions similaires

  1. Modifier un Label dans une fonction Shared
    Par twixi dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/06/2008, 11h26
  2. Réponses: 28
    Dernier message: 17/01/2008, 18h15
  3. [AJAX] Envoi ou non d'un formulaire avec une fonction AJAX
    Par ohhh.gringo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/05/2007, 11h47
  4. Réponses: 1
    Dernier message: 16/03/2007, 17h30
  5. Réponses: 7
    Dernier message: 08/04/2006, 12h18

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