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

Vue hybride

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

+ 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