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 :

Pourquoi la valeur change sans intervention?


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut Pourquoi la valeur change sans intervention?
    Salut à tous,

    Je rencontre un problème qui m'intrigue.

    J'ai une méthode qui renvoie qui produit un tableau de char et le retourne. elle est donc déclarée ainsi :

    Je déclare un "char *" pour récupérer le contenu du tableau et l'utiliser. Seulement voilà au sortir de la méthode, tout est bon, le débugger indique bien les bonnes valeurs dans le tableau (une suite de chiffre). Deux lignes plus tard, alors que rien ne touche à ce "char *", le debugger indique que la valeur a changé et à la place j'ai des trucs bizarres. Je ne comprends pas d'où celà vient.

    Visiblement, ce changement à une incidence puisque si je déclare en dur, la valeur du "premier" retour, le reste fonctionne normalement. Mais avec la nouvelle valeur, rien ne fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char * outText ={'\0'};
    	outText= maMethode();
     
    	int i = 0; //ici la valeur de outText est correcte, composée de chiffre
     
            int comp = a+3; //ici la valeur de outText est devenue ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHî
     
    	while(outText[i]!='\0')
    	{
                   // faire des trucs
    	}
    Si quelqu'un peut m'expliquer ce qui se passe...

    Merci

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tu n'aurais pas renvoyé un pointeur vers un tableau statique local ? Ou un truc non alloué ?
    Utilises les string plutôt.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu ne gères manifestement pas la mémoire comme il faut.
    Utiliser std::string est une bonne idée.

  4. #4
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Et bien c'est tout simple, il doit déclaré un char * avec lequel il travaile dans "maMéthode()" et qu'il renvoit. Vu que la déclaration est faite dans "maMéthode()", à la sortie de "maMéthode()" cette variable et donc l'allocation qui en découle ne sont plus, donc le pointeur vers cette ancienne zone mémoire pointe "dans le vide" CQFD

    Il faudrait plutot faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void maMéthode( char * & maChaine ){
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char [80] maChaine;
    maMéthode( maChaine );

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1. Le C++ déconseille les char* au profit des std::string.
    2. Le & n'est pas nécessaire ici.
    3. La taille du tableau n'est pas passée. Ce qui pourrait être intéressant, c'est une fonction template:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      template< size_t N >
      void maMéthode(char (&maChaine)[N])
      {
         // Utiliser chaine, sachant que sa taille N est considérée 
         // comme une constante connue à la compilation.
      }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    [*]Le & n'est pas nécessaire ici.
    Passer un tableau a une fonction attendant un char *& ne devrait pas passer la compilation.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Ah, ok.
    En lisant son post, j'ai cru qu'il voulait qu'il soit possible de passer un tableau...

    Edit: Et après relecture, je le crois encore, en fait...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    Merci à tous pour vos réponses.

    Citation Envoyé par galak63
    Et bien c'est tout simple, il doit déclaré un char * avec lequel il travaile dans "maMéthode()" et qu'il renvoit.
    Presque Galak63, je ne sais pas si ça change quelque chose, mais c'est un tableau qui est déclaré à l'intérieur et qui est renvoyé. Mais ce que tu dis me parait pertinent.

    Toute fois j'aurais surement du préciser un petit détail....
    La fonction (que j'ai appelé maMethode) est en fait une déclaration liée avec du code en C.

    J'ai tenté de mettre le & dans cette fonction en C, mais le compilateur n'a pas beaucoup aimé au niveau de la définition...

    ça ressemblait à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" void maMéthode( char * & maChaine );
    avec la définition comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void maMéthode( char * & maChaine )
    {
    //code C
    }
    Citation Envoyé par Médinoc
    Ah, ok.
    En lisant son post, j'ai cru qu'il voulait qu'il soit possible de passer un tableau...

    Edit: Et après relecture, je le crois encore, en fait...
    En fait, j'ai un tableau de char dans cette fonction, j'aimerai le récupérer. Quelque soit le moyen, mais en disposer sous forme de tableau de char ou quoi que ce soit qui me permette de bosser sur chaque char du tableau.

    voilà

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Sunsawe
    Presque Galak63, je ne sais pas si ça change quelque chose, mais c'est un tableau qui est déclaré à l'intérieur et qui est renvoyé.
    L'hypothese de Luc devient de plus en plus probable...

    J'ai tenté de mettre le & dans cette fonction en C, mais le compilateur n'a pas beaucoup aimé au niveau de la définition...
    Normal. Comme de toute facon le compilateur C++ n'aurait pas aime non plus l'appel, ca n'a pas d'importance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    extern "C" void maMéthode( char * maChaine );
     
    void maMéthode( char * maChaine )
    {
    //code C
    }
     
    char table[UneTailleAdequate]; 
     
    maMethode(table);
    Devrait passer mais il y a le probleme de trouver UneTailleAdequate. La solution C++ c'est d'utiliser des std::string. Avec une interface compatible avec le C, differentes solutions sont possibles, la plus complete est de definir l'equivalent de std::string; alternativement passer aussi la taille allouee et retourner une erreur si maMethode a besoin de plus, a charge a l'appelant de faire des reallocations.

  10. #10
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Mea culpa, le " *& " aurait été nécessaire si il voulait changer la valeur du pointeur a l'intérieur de sa méthode Mais normalement a la compil ca devrait passer

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par galak63
    Mea culpa, le " *& " aurait été nécessaire si il voulait changer la valeur du pointeur a l'intérieur de sa méthode Mais normalement a la compil ca devrait passer
    Faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void f(char*&);
    ...
    char table[SIZE];
    f(table);
    ne doit pas passer a la compilation. table est un tableau qui est converti implicitement en un pointeur vers son premier element, donc un temporaire qui ne peut pas etre binde a une reference non constante.

  12. #12
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Alors peux tu me dire la manière à adopter si tu veux changer la valeur de ton pointeur ?

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par galak63
    Alors peux tu me dire la manière à adopter si tu veux changer la valeur de ton pointeur ?
    Ta methode est correcte pour modifier un pointeur. Le probleme, c'est que table n'est pas un pointeur mais un tableau.

  14. #14
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Alors je précise ma question : comment fait-on pour allouer ce tableau dans la fonction

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par galak63
    Alors je précise ma question : comment fait-on pour allouer ce tableau dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void f(char*&);
    ...
    char* foo = NULL;
    f(foo);
    Quel est le probleme?

    A part naturellement que vector est vraissemblablement une meilleure solution si on n'est pas restreint par la compatibilite avec le C.

  16. #16
    Membre éprouvé Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Donc j'avais un peu raison aussi

  17. #17
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    Merci à tous,

    J'ai utilisé la méthode proposée par Jean-Marc.Bourguet et Galak63 qui nécessite une taille adéquate de tableau.

    La taille étant parfaitement connu, celà ne pose pas de soucis, même si je suis curieux de savoir comment on peut s'en sortir, si justement, cette taille n'est pas connu...

    Tout fonctionne normalement maintenant.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/07/2007, 17h29
  2. Réponses: 14
    Dernier message: 04/10/2006, 00h19
  3. Réponses: 2
    Dernier message: 07/07/2006, 19h48
  4. Réponses: 4
    Dernier message: 11/05/2006, 11h28
  5. [VBA-E] Action dès que la valeur change.
    Par mulanzia2003 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/02/2006, 14h03

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