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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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à

+ 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