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 :

bug ou probleme?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut bug ou probleme?
    Bonjour,

    Lors de mon programme suis heurté à un problème que je comprend pas.
    Mon programme fonctionne bien sous windows et que je le lance sous linux je rencontre le probleme suivant.

    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
     
    int lgMax[16]={30,6,100,100,40,20,40,40,100,100,100,100,100,10,40,40};
     
    for(i=0;i<zone;i++)
        {
          strcpy(champ,&ligne[position[i]]); 
          lgMax[0]=30; //remet la valeur a 30 sinon bug... je c'est pas pourquoi
          if(strlen(champ)>lgMax[i])
          {
            strcpy(champ," ");
          }
          if(i==2)
            printf("%d ",lgMax[0]);//affiche 30
          while(strlen(champ)<lgMax[i]+1)
            strcat(champ," ");
            //lgMax bug après la boucle quand i=2
          if(i==2)
          {
            printf("%d ",lgMax[0]);//affiche 0
            exit(0);
          }
          fwrite (champ , 1 , lgMax[i] , fDest );
        }
    Je comprend pas pourquoi dans mon for quand i=2 ca remet ma valeur lgMax[0] à 0 (les autres valeurs du tableau ne change pas)
    Quelqu'un pourrait m'orienter sur le pourquoi de ce problème?

    merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Intuitivement, je dirais que ton premier strcpy déborde et vient écraser le tableau lgMax.
    Tu dois avoir quelque par un char champ[TAILLE_MAX]. Tu devrais donc utiliser quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(champ,&ligne[position[i]],TAILLE_MAX);

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Sans la déclaration de champ, ça ne va pas être facile...

    Mais ça sent le débordement de buffer, donc surveille un peu mieux ce que tu fais avec champ, et regarde si tu mets une variable entre les deux, si c'est elle qui est modifiée à la place...
    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.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    Lors de mon programme suis heurté à un problème que je comprend pas.
    Mon programme fonctionne bien sous windows et que je le lance sous linux je rencontre le probleme suivant.
    Poste un code compilable. Il est impossible d'analyser ton code. Trop d'inconnues.

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Poste un code compilable. Il est impossible d'analyser ton code. Trop d'inconnues.
    désolé, je voulais pas copier le code enterrement, car il est plutôt immense.
    j'ajoute les différentes variables, ainsi qu'un bou de code réalisé avant

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    int zone;
      int i,t;
      char ligne[1024];
      int position[16];
      int lgMax[16]={30,6,100,100,40,20,40,40,100,100,100,100,100,10,40,40};
      int pos; 
      char champ[101];
     
     if ((fDest = fopen(nomdest, "w")) == NULL)//Créé le fichier fixe test si erreure
      {
        sprintf(txterr,"impossible d'ouvrir le fichier %s \n",nomdest); 
        Ecriture_err();
        return(-2);
      }
     
      nb_ligne=0;
     
      while(fgets(ligne,sizeof(ligne), fic_header)) //compte nombre de ligne sans le header et ajout des data dans le fichier fixe
      {
        nb_ligne++;
        trimCRLF(ligne);
        //Ecriture
     
        t=strlen(ligne);
        zone=1;
        position[0]=0;
        for(i=0;i<t;i++)//remplace les ; par des \0
        {
          if(ligne[i]==';')
          { 
            ligne[i]=0;       
            position[zone++]=i+1; //donne la position de debut de chaque champs
          }                       
        }
        if (zone>16)// + de 15 champs
        {
          log=1;
          sprintf(txterr,"Attention il existe au moins un champ en trop à la ligne %d \n",nb_ligne+1);
          Ecriture_err();
          continue;
        }
    for(i=0;i<zone;i++)
        {
          strcpy(champ,&ligne[position[i]]); 
          lgMax[0]=30; //remet la valeur a 30 sinon bug... je c'est pas pourquoi
          if(strlen(champ)>lgMax[i])
          {
            strcpy(champ," ");
          }
          if(i==2)
            printf("%d ",lgMax[0]);
          while(strlen(champ)<lgMax[i]+1)
            strcat(champ," ");
          if(i==2)
          {
            printf("%d ",lgMax[0]);
            exit(0);
          }
            //lgMax bug après la boucle quand i=2
        }
    désolé je peux pas poster de code compilable à moins de mettre tout mon programme.

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    j aime bien le titre, si c'est un bug c'est pas un problème ?

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    désolé, je voulais pas copier le code enterrement, car il est plutôt immense.
    j'ajoute les différentes variables, ainsi qu'un bou de code réalisé avant
    <...>
    désolé je peux pas poster de code compilable à moins de mettre tout mon programme.
    Alors il faut apprendre à réduire me code au minimum compilable qui montre le problème, car ce n'est pas à nous de le faire. C'est d'ailleurs une technique de mise au point bien connue et très efficace.

    D'une manière plus générale, ton code devrait être organisé en modules indépendants et testables individuellement. Ca fait partie des règles de Bonne Conception.

  8. #8
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    J'ai trouvé.
    C'était ma variable champ qui débordé étrange car elle ne pouvait pas dépassé 100 (valeur max dans lgMax). et ce problème ne se rencontré que sur linux...
    j'ai augmenté la taille du tableau de 1 et ça fonctionne.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    J'ai trouvé.
    C'était ma variable champ qui débordé étrange car elle ne pouvait pas dépassé 100 (valeur max dans lgMax). et ce problème ne se rencontré que sur linux...
    j'ai augmenté la taille du tableau de 1 et ça fonctionne.
    Non. Le problème se rencontre partout. Simplement comme le dépassement de tableau entraine un comportement est indéfini, les conséquences sont imprévisibles. Il peut arriver n'importe quoi, y compris un comportement conforme aux attentes, ce qui fait que ce bug (comportement indéfini) est particulièrement dangereux et fait que le C n'est pas un langage de débutant.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub


    .

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par totofe Voir le message
    J'ai trouvé.
    C'était ma variable champ qui débordé étrange car elle ne pouvait pas dépassé 100 (valeur max dans lgMax). et ce problème ne se rencontré que sur linux...
    j'ai augmenté la taille du tableau de 1 et ça fonctionne.
    Donc, dès que tu vas lire une ligne de 101 caractères

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

Discussions similaires

  1. BUG IE8 probleme d'affichage
    Par tidou95220 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 27/01/2011, 15h18
  2. probleme setInterval bug
    Par lea94140 dans le forum Flash
    Réponses: 1
    Dernier message: 27/04/2007, 08h40
  3. Réponses: 4
    Dernier message: 22/06/2006, 06h43
  4. Probleme de requete+ gros bug access
    Par shub dans le forum Access
    Réponses: 8
    Dernier message: 04/05/2006, 13h23
  5. Réponses: 2
    Dernier message: 18/02/2006, 09h20

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