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 :

Erreur incompréhensible une variable int change de valeur sans raison connue


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Par défaut Erreur incompréhensible une variable int change de valeur sans raison connue
    Bonjour, j'ai un gros problème:

    Fichiersize et FichierFactice sont des int;
    is est un inputfilestream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cdata= new char[(Fichiersize+FichierFactice)];
    data= new unsigned char[(Fichiersize+FichierFactice)];
    is.read(cdata,Fichiersize);
    is.close();
    A l'execution, au début du code FichierFactice=3, Fichier size=638988.
    A la fin de ce bout de code FichierFactier = 56819744, affiché en rouge par le debuggeur, mais qu'est-ce qui cloche?
    A ce stade FichierSize est correct et reste à 638988.

    Quelqu'un peut-il m'aider? merci.

    PS code debuggé et compilé sous VS2010

  2. #2
    Membre confirmé Avatar de Furr
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Les valeurs contenues dans FichierFactice changent aléatoirement ? Et sont différentes à chaque exécution ?

    Vérifie que tu as bien initialisé la variable à une valeur précise, car un entier non initialisé prend n'importe quel valeur, ce qui peut expliquer le comportement que tu obtiens

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ou sinon un dépassement mémoire, qui écrirait en dehors d'un de tes tableaux et donc potentiellement dans la zone mémoire de ton int. Mais j'avoue que sur ces 4 lignes de code, je vois pas ce qui pourrait le provoquer.

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Salut,

    Ca sent l'écrasement mémoire !! Mais ça n'a pas l'air d'être ton code qui est en cause.
    Quand tu exécutes pas à pas, regarde ce qu'il se passe en zone mémoire aux alentours de l'adresse de FichierFactice.

    Après le read, essaies de voir avec la méthode gcount le nombre d'octet copiés.

  5. #5
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Par défaut
    A priori
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FichierFactice=9-(Fichiersize%9);
    Cette ligne attribue une valeur correcte à FichierFactice.
    Fait notable, le debbuger n'indique rien sur cdata et data un peu plus loin semble ne contenir que 4 caractères???
    Il est en rouge

    Quand à fichier factice il change à chaque fois

    quant à gcount la valeur est bien la taille du fichier.

  6. #6
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Par défaut
    Peut être les tableaux auraient une taille maximale.

  7. #7
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Peux tu poster un échantillon de code un peu plus gros ?

    Notamment, avec les déclarations des variables en question, l'ensemble des opérations effectuées, etc.

    Là il n'y a rien de choquant, le problème est probablement ailleurs.

  8. #8
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Par défaut
    Tout d'abord pour dire que j'ai remplacé le tableau par un vector et ca fonctionne.

    Mais, bon je vroudrais aussi comprendre pourquoi ca ne fonctionnaint pas
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    int Fichiersize;
    int FichierFactice=0; 
    ifstream is; //Fichier à traiter
     
    { //Choix du fichier}
     
    is.open(Fichier, ios::binary );//Ouverture du fichier à traiter
    if(is.fail())
    {
      logfile<<"Le fichier n'a pas pu etre charge"<<endl;
      return false;
    }
    is.seekg(0, ios::end);
    Fichiersize= is.tellg();
    is.seekg(0, ios::beg);
    if(Fichiersize==-1)
    {
      logfile<<"Le fichier est trop volumineux"<<endl;
      return false;
    }
     
    FichierFactice=9-(Fichiersize%9);
    if(FichierFactice==9)FichierFactice=0;
     
    //Depart du traitement
    //Récupération du fichier d'origine
    char *cdata;
    #define TEST
    #ifdef TEST
      vector<unsigned char> data;
    #else
      unsigned char *data;
    #endif
      cdata= new char[(Fichiersize+FichierFactice)];
    #define TEST
      data.reserve(Fichiersize+FichierFactice);
    #ifdef TEST
    #else
      data= new unsigned char[(Fichiersize+FichierFactice)];
    #endif
      is.read(cdata,Fichiersize);
      int a=is.gcount();
      cout<<a<<endl;
      is.close();
    for(int i=0;i<FichierFactice;i++)
      cdata[Fichiersize+i]=0;
    for(int i=0;i<Fichiersize+FichierFactice;i++)
    {
      data[i]=(unsigned char)cdata[i];
    }
    delete [] cdata;
    Voila, je ne sais pas si c'est suffisant
    J'ai fais un define pour la nouvelle maéthode, il faut le supprimer pour avoir l'ancienne version

  9. #9
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Le code que tu as posté fonctionne (y compris la version avec les tableaux).

    Question bête, ne serais-tu pas en train de débugger du code release ? Auquel cas, les valeurs données par le debugger peuvent être fausses.

    Si tu fais un cout de ta valeur, la valeur n'est toujours pas bonne ?

  10. #10
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Par défaut
    Ben si justement je debug en mode release

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par raphchar Voir le message
    Ben si justement je debug en mode release
    Toi, tu vas avoir des problèmes...

    Il faut que tu débuggues en mode Debug, ça risque de fonctionner un poil mieux

  12. #12
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Par défaut
    C'est juste que j'avais lu sur ce forum que des erreurs n'apparaissent pas en mode debug alors qu'en mode release... Du coup je compile toujours en mode release.
    A l'origine mon erreur ne venait pas de ce changement "bizarre" mais la valeur incorrecte avait attirée mon attention.

  13. #13
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par raphchar Voir le message
    C'est juste que j'avais lu sur ce forum que des erreurs n'apparaissent pas en mode debug alors qu'en mode release... Du coup je compile toujours en mode release.
    A l'origine mon erreur ne venait pas de ce changement "bizarre" mais la valeur incorrecte avait attirée mon attention.
    Non ça, c'est lorsque ton code contient *déjà* du code erroné et qui peut amener à des comportements indéfinis. Du coup ça fonctionne en debug (à cause de tout un tas de raisons que je ne vais pas lister ici) et ça ne fonctionne pas en release. D'où la définition de comportement indéfinis.

    Bref, si ça fonctionne pas en mode release alors qu'en mode debug si, alors c'est qu'il y a un bug - à corriger - assez sévère ! D'où l'intérêt de retourner en mode debug et de débusquer le bug.

  14. #14
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Bref, si ça fonctionne pas en mode release alors qu'en mode debug si, alors c'est qu'il y a un bug - à corriger - assez sévère ! D'où l'intérêt de retourner en mode debug et de débusquer le bug.
    Le plus souvent, c'est quand même une variable non initialisée à zéro (le compilateur MS a la très mauvaise idée de les initialiser à 0 en debug, mais pas en release). Beaucoup plus rarement un volatile qui manque.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/09/2009, 21h00
  2. [JMeter] Récupration d'une variable qui change à chaque process
    Par vendeeman dans le forum Tests et Performance
    Réponses: 3
    Dernier message: 11/12/2007, 12h00
  3. Réponses: 6
    Dernier message: 29/11/2007, 16h15
  4. [MySQL] erreur avec une variable dans une requête
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/03/2007, 23h42
  5. Réponses: 6
    Dernier message: 18/01/2007, 10h24

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