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 :

Modification de pointeur non effective à la sortie de la fonction


Sujet :

C++

  1. #1
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut Modification de pointeur non effective à la sortie de la fonction
    Voici une fonction qui est censé parcourir récursivement le arbre :
    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
    void Graphe::creerSousProgramme(Programme* sousProg)
    {
        int total = sousProg->getTotalSousProg();
        int position = -1;
     
        Programme *tmp, *tmp2;
     
        for(int i = 0 ; i < total ; i++)
        {
            tmp = sousProg->getSousProg(i);
            for(int j = 0 ; j < tmp->getTotalSousProg() ; j++)
            {
                tmp2 = tmp->getSousProg(j);
     
                if((position = racine->getPosition(tmp2->getAdressDeb())) != -1)
                {
                    tmp2 = racine->getSousProg(position);
     
                    if(tmp2->getTotalSousProg() > 0)
                        creerSousProgramme(tmp2);
                }
            }    
        }
    }
    Peut-on me dire pourquoi je n'arrive pas à récupérer le résultat dans mon pointeur ?
    Quand je l'affiche j'ai toujours celui de départ.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Qu'entends-tu par récupérer ? Ta fonction ne retourne pas de valeur, ne prend pas d'arguments par référence, et ne modifie (a priori, faudrait voir le reste du code pour confirmer) que des variables locales. Je ne vois donc pas trop comment tu t'attends à récupérer quoi que ce soit.

  3. #3
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ben en fait je voulais récupérer le contenu modifier directement par le pointeur dans le prototype de la fonction.

    En tout cas il est bien modifié mais seulement dans la fonction ce qui fait que l'appel récursif n'a aucun effet (normal il n'a pas de fils) et le retour pour l'affichage n'affiche pas les modifications.

    Qu'est-ce qui va pas dans mon code ?

  4. #4
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    ta fonction appelle des fonctions dont le nom commence par get, donc je suppose qu'elles ne modifient rien. Le seule variable de ta classe que tu modifies est position. Donc je répète ce que JolyLoic a dit, ta fonction ne modifie apparemment rien du tout. C'est un problème de conception.


    Apparemment tu crées une sorte d'arbre de programmes et sous-programmes c'est cela ? Dis nous en plus sur ce que ton code doit faire.

  5. #5
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    En fait c'est plus compliqué que ça.

    Au premier niveau j'ai un vecteur contenant toutes mes adresses. je veux donc parcourir toutes ces adresses afin de les mettre dans les enfants vu que chaque enfant contient lui aussi un vecteur sauf que là il y a pas d'adresses de fin.

    Le but est donc de remplacer les sous-enfants par un pointeur contenant déjà les données voulu.

    J'ai donc modifié le operator= pour pouvoir effectuer mon affection d'où le tmp2.

    Pour faire plus simple voilà mon operator=

    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
    //operateur d'affectation
    Programme& Programme::operator=(const Programme& prog)
    {
        adresse_deb = prog.adresse_deb;
        adresse_fin = prog.adresse_fin;
        identification = prog.identification;
     
        size = prog.size;
        nbAppel = prog.nbAppel;
     
        recursif = prog.recursif;
        sse = prog.sse;
        x87 = prog.x87;    
     
        sousProgramme = prog.sousProgramme;
     
        return *this;
    }
    Mon sousProgramme est un vector<Programme *>

  6. #6
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    bon là je ne peut continuer plus en détail la discussion tout de suite, mais remarque deja, sauf erreur, que ton = est appliqué sur des pointeurs... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tmp = sousProg->getSousProg(i);
    pas sur des objets eux-mêmes ! Donc il me semble que operator= n'est pas appelé. (essaye à coup d'affichage console pour voir)

    il faudrait faire une sorte de pour l'initialiser

    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *tmp =  *(sousProg->getSousProg(i) ) ;
    (si getSousProg(i) renvoie un pointeur).

    mais même là il y aurait un problème de conception, car finalement ce "tmp" est local, et tu ne le récupères nul part, ou alors je ne vois pas ou. Tu ne le met dans aucun conteneur ou autre pour sauver ce nouvel objet que tu crées par copie avec le =.

  7. #7
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Je veux juste remplacer le tmp2 par sa nouvelle valeur. En fait je veux éviter de recréer tout mon vector.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je suis désolé, mais il y a quelque chose que je ne comprend pas dans ce que tu dis.

    Tu parles de remplacer tmp2 par une nouvelle valeur, C'est quoi cette nouvelle valeur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmp->getSousProg(j);
    racine->getSousProg(position);
    autrechose ?
    Et en quoi n'est-elle pas remplacée ?
    En quoi modifier quoi que ce soit à tmp2 serait sensé avoir un effet sur le reste du programme ? Ou alors, tu voudrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *tmp2 = *racine->getSousProg(position);
    ?


    Ton opérateur = ne me semble pas très pertinent. Déjà, je ne te vois pas faire d'affectations d'objets, juste de pointeurs, et de plus, tel qu'il est écrit, je ne vois pas en quoi il diffère de celui que le compilateur aurait généré tout seul si on le lui avait rien dit.

  9. #9
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    En fait je parcours ma racine pour pouvoir créer mes noeuds vu qu'à la racine on a déjà toutes les infos.

    Pourquoi ? Tout simplement parce que c'est une lecture de fichier qui récupère toutes ces infos et sont stockées dans notre racine.

    Il me reste plus qu'à parcourir les enfants (incomplets) de chaque noeud de la racine. Si je trouve une adresse de début correspondante alors je remplace l'enfant par l'élément de la racine. ce qui veut dire que c'est tmp2 qui prend racine....

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    Citation Envoyé par Kerod Voir le message
    Voici une fonction qui est censé parcourir récursivement le arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Graphe::creerSousProgramme(Programme* sousProg)
    {
    }
    Peut-on me dire pourquoi je n'arrive pas à récupérer le résultat dans mon pointeur ?
    Quand je l'affiche j'ai toujours celui de départ.
    Je n'ai pas trop regardé ton code, mais tu modifie un pointeur temporaire nommé sousProg. Si tu veut que ce soit un alias du pointeur que tu passe en paramètre, ce doit être une référence sur pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Graphe::creerSousProgramme(Programme* &sousProg)
    Sinon, ne serait t'il pas préférable de retourner le résultat?

  11. #11
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    J'ai essayé avec des return mais rien à faire c'est pour ça que j'ai essayé avec le passage par pointeur.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pourtant, le return de pointeur est ce qu'on utilise le plus dans des fonctions créatrices qui ne retournent pas de code d'erreur (comme la tienne, qui ne retourne rien d'autre que le pointeur)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Programme* Graphe::creerSousProgramme()
    {
    }
    PS: Si la fonction ne modifie pas l'objet Graphe, elle devrait également être déclarée const.

  13. #13
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ben si ça modifie l'objet graphe puisque c'est lui qui contient la racine qui est un pointeur vers un Programme.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    OK.

  15. #15
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Disons que c'est censé car dans le fonction ça modifie mais à l'extérieur non

  16. #16
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Mon problème de modification de mon pointeur est résolu mais maintenant c'est à l'affichage que ça pose problème, c'est surtout au moment de parcourir mon vecteur qu'il bloque.

    Alors voilà, j'ai ma fonction qui est censé dupliquer mon Programme, tant que je modifie pas le vecteur initial (avant copie) j'ai pas de soucis après lors du parcourir (j'entends par soucis Segmentation Fault). Mais si je rajoute la ligne pour modifier ben j'ai mon problème. Avez-vous une idée du pourquoi ?
    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
    void Programme::copy(const Programme* prog)
    {
        adresse_deb = prog->adresse_deb;
        adresse_fin = prog->adresse_fin;
        identification = prog->identification;
     
        size = prog->size;
        nbAppel = prog->nbAppel;
     
        recursif = prog->recursif;
        sse = prog->sse;
        x87 = prog->x87;    
     
        sousProgramme.clear();
        sousProgramme.assign( prog->sousProgramme.begin(), prog->sousProgramme.end() );
    }
    Ce sont les deux dernières lignes qui cassent tout. Pour plus d'infos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<Programme *> sousProgramme;
    Avez-vous une idée ?

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ne faudrait-il pas dupliquer chaque Programme du vecteur et non seulement leurs pointeurs ?

  18. #18
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Qu'entends-tu par là ?

    Là actuellement ça fonctionne sauf que lors du parcours il n'arrive pas à récupérer un élément de mon vector malgré le fait qu'il contient des éléments.

    Par exemple il arrive pas à récupérer la position 0, et Seg Fault

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Kerod Voir le message
    Qu'entends-tu par là ?

    Là actuellement ça fonctionne sauf que lors du parcours il n'arrive pas à récupérer un élément de mon vector malgré le fait qu'il contient des éléments.

    Par exemple il arrive pas à récupérer la position 0, et Seg Fault
    ??

  20. #20
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ben oui il fonctionne à 50%. Lors de la copie tout se passe bien.

    Lors de l'affichage et de l'accession du vector ben parfois à tous les coups il me mets un Seg Fault alors que pour d'autres non. Le plus étonnant c'est que je demande l'affichage de nombres d'éléments dans mon vecteur, il me sort un nombre positif mais si je lui dis affiche moi l'élément 0 = Erreur

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Pointeur non modifié à l'interieur d'une fonction ? o_O
    Par stephane.lallee dans le forum SL & STL
    Réponses: 8
    Dernier message: 19/03/2009, 16h06
  2. Modifications non effectuées sur sortie de formulaire
    Par jojodid dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/08/2008, 16h19
  3. OnMouseOver : modification du pointeur
    Par pimpmyride dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/04/2006, 18h22
  4. comparaison de pointeur non portable
    Par kykyn dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 10h58

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