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 :

Contenu d'une variable qui disparait :/


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut Contenu d'une variable qui disparait :/
    Bonjour

    Comme l'indique le titre, j'ai un petit soucis de vairable.. je vous montre mon code :
    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
     
    void Server::Rename(char* fileName, SOCKET& soc){
      Commande* com;
      HANDLE hFile;
      com = new Commande("","");       
      cout << "FILENAME1 : " << fileName <<endl;
      if ((hFile = CreateFile(fileName,
                              GENERIC_WRITE,
                              0,
                              NULL,
                              OPEN_EXISTING,
                              0,
                              NULL)) == INVALID_HANDLE_VALUE){
        sendReply(550,soc);
        return;
      }
      CloseHandle(hFile);  
      sendReply(351,soc);
      cout << "FILENAME1 : " << fileName <<endl;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void Server::sendReply(int code, SOCKET& soc){
      char tmp[65535]= "";
      int nbcar;
      strcat(tmp," ");     
      strcat(tmp,getMsgReply(code));
      nbcar = send(soc,tmp,strlen(tmp),0);                  
      cout << "réponse '"<< tmp << "' envoyee"<<endl;
    }
    Après l'éxécution de la commande : sendReply(351,soc);, le contenu de mon char* fileName disparait.. je ne comprend pas trop pourquoi si quelqu'un pouvait m'éclaircir les idées...

    merci

    PS: je travail sous Windows avec Dev-c++ 4.9.9.2

  2. #2
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Salut Aleksis,
    je voudrais savoir, tu es sûr que sendReply(351,soc); est exécutée, car tu fais un return; dans le if donc si tu passes la fonction se termine.
    Le mieux est peut-être de faire un cout après la métode rename.
    Tu peux me dire comment tu as initialisé ton char * ?

    b Oo

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    SAlut b Oo
    alors mon char est initialiser a l'aide d'un constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Commande::Commande(char* commande, char* parametre){
      cmd = commande;
      param = parametre;
    }
    jusque là, aucun soucis, je peu utiliser tout ça sans problème ( j'ai fais des methode get).

    une fois ma structure crée, je pass le champs param en paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if (strcmp(com->getCmd() ,"RNFR") == 0){
           Rename(com->getParam(),soc);
     }
    la j'arrive donc dans ma fonction avec ma variable bien initialisé à la bonne valeur.

    Et oui je suis sur que sendReply(351,soc); est exécutécar je fais un cout juste avant et un autre juste après et les 2 s'affiche. Juste que sur le 2eme ma variable fileName ne contient plus rien :s

  4. #4
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Tu ne peux pas modifier ce char * (car tu n'alloues pas de mémoire pour la chaine) donc met le en const char *.
    Si cela n'a pas résolu le problème, l'erreur doit venir d'ailleurs (tu dois modifier ton pointeur).

    b Oo

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    j'ai suivi ton conseil, j'ai mi ma var en const.. mais hélas.. le problème est toujours la :/ merci quand même

  6. #6
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Tu peux me donner le code de CreateFile(...), car cela vient peut-être de là.

    b Oo

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    CreateFile est une fonction de l'API Win32.

    A part ça, en ne stockant que des pointeurs vers les mêmes chaînes constantes, tu t'exposes sans doute à ce genre de problème.

    Essaye de stocker des copies de tes chaînes, et utilise std::string pour ça (voir la FAQ).

  8. #8
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Bon c'est quand même bizarre, il faudrait avoir un peu plus de code pour voir d'où cela vient. Sinon essayes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void Server::Rename(const char * const fileName, SOCKET& soc){
    ...
    }
    Si tu n'as pas d'erreur de compilation, et si ce n'est pas affiché, cela m'étonne beaucoup que l'erreur vienne du code posté (plutôt à l'appel de la fonction).

    b Oo

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Laurent Gomila
    CreateFile est une fonction de l'API Win32.

    A part ça, en ne stockant que des pointeurs vers les mêmes chaînes constantes, tu t'exposes sans doute à ce genre de problème.

    Essaye de stocker des copies de tes chaînes, et utilise std::string pour ça (voir la FAQ).
    il m'a fallu un peu de temps avant de m'y remettre.. j'ai fait ce que tu m'as propose, ca a marcher mais j aimerais quand meme savoir pourquoi le contenu disparait :/

  10. #10
    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
    À mon avis, tu y verras plus clair si tu rajoutes des const partout où il le faut... Tu verras sans doute qu'une chaîne supposée constante se prend une écriture là où ça fait mal...

    (ou bien, tu peux aussi avoir un dépassement de buffer si tu as deux tableaux de caractères qui se suivent, et que suite à une erreur, tu écris le \0 non pas à la fin d'un buffer, mais au début du suivant...)

  11. #11
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void Server::sendReply(int code, SOCKET& soc){
      char tmp[65535]= "";
      int nbcar;
      strcat(tmp," ");     
      strcat(tmp,getMsgReply(code));
      nbcar = send(soc,tmp,strlen(tmp),0);                  
      cout << "réponse '"<< tmp << "' envoyee"<<endl;
    }
    voila j'ai trouvé le pourquoi du comment appareemnt dans ma fonction sendReply, la décalration de ma var tmp écrasserait ma valeur

    donc en déclarant cette var en static
    ça marche très bien

    en tout cas merci a tous pour vos différentes solution proposées

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

Discussions similaires

  1. Contenu d'une variable qui est elle même variabilisée en partie
    Par Samuel25_t dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 08/12/2014, 17h10
  2. Réponses: 2
    Dernier message: 25/06/2013, 15h15
  3. Réponses: 2
    Dernier message: 21/09/2009, 17h17
  4. Réponses: 11
    Dernier message: 22/06/2005, 11h04
  5. [WebForms][Javascript] Une DropDownList qui disparait....
    Par prem's dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 02/03/2005, 10h50

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