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 de segmentation , probléme de compilation


Sujet :

C++

  1. #1
    Membre du Club
    Femme Profil pro
    étudiante
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Par défaut erreur de segmentation , probléme de compilation
    Bonjour,

    j'ai un problème en exécution , "une erreur de segmentation" j'arrive pas à comprendre.

    j’extraie d'un fichier1 texte la première ligne qui est composée de 3 nombre et je vérifie avec une fonction calculsup combien de fois ces 3 nombres existent dans chaque ligne d'un fichier 2.

    Après je passe à la deuxième ligne de fichier 1...

    nbreregles : ligne de fichier 1

    transaction : ligne de fichier 2

    voila la fonction calculsup :
    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
    int calculsup ( string x, string y , string z)
     {int i=0,sup=0, t1=0,nbre, t2= 0, t3=0, d=0;
     int transaction;
     liste_transaction listtest;
      listtest.allerpremier();
     while ( d < transaction)
     {
     while (i < nbre-1)
     { if  (x == listtest.courant->premisse[i])  t1 =1;
        i++;
      }
     while (i < nbre-1)
     { if  (y == listtest.courant->premisse[i])  t2 =1;
     i++;  
      }
     
     if  (z == listtest.courant->conclusion)  t3 =1;
     
     
         if ((t1 == 1) && (t2== 1)&& (t3 ==1))
                sup++;
                d++;
                listtest.allersuivant();
     }
    return sup;
    }
    voila dans cette partie de main j’appelle cette fonction :
    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
    cout <<"debut try \n" ;
     
    list.allerpremier();
    int n2=0,tr = 0, sup;
    while (n2 < nbreregles-1)
    { int i=0;
    string x,y,z;
    int n = list.courant->nbrepremisse ;
        while (i <= n-2 )
     
    {//cout <<"i = " << i << "  " ;
    //cout << list.courant->premisse[i]<< "\n";
    x= list.courant->premisse[i];
    cout << "x : "<< x << "\n";
    //cout <<"i+1 = " << i+1 << "  " ;
    //cout << list.courant->premisse[i+1]<< "\n";
    if (n>1) {y = list.courant->premisse[i+1];
    cout << "y : " << y << "\n"; }
    i++;
    }
    //cout << list.courant->conclusion<< "\n";
    z=  list.courant->conclusion;
    cout <<"z : "<< z<< "\n";
    sup= calculsup (x,y,z);
    cout << n2 << ":" << sup<< "\n" ;
     
    list.allersuivant();
    n2++;
     
    }
        return 0;

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le premier conseil que je peux te donner, c'est déjà de respecter scrupuleusement l'indentation de ton code.

    Cela n'a l'air de rien, mais un code qui respecte une indentation correcte devient, comme par magie, tout de suite beaucoup plus lisible. Si tu ne le fais pas pour toi (et tu devrais le faire pour toi, car c'est toi qui relira le plus souvent ton code ), fais le pour nous, car tu dois garder en tête que tu arrives avec un code dont on ne sait absolument rien! Si tu veux que l'on arrive à t'aider efficacement il faut nous aider à t'aider. Et le simple fait de fournir un code facilement compréhensible nous aide énormément .

    Ainsi, si l'on ne change pas une virgule à ton code, mais qu'on le "formate" correctement, voici à quoi il ressemble :
    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
    int calculsup ( string x, string y , string z)
    {
        int i=0,sup=0, t1=0,nbre, t2= 0, t3=0, d=0;
        int transaction;
        liste_transaction listtest;
        listtest.allerpremier();
        while ( d < transaction)
        {
            while (i < nbre-1)
            {
                if  (x == listtest.courant->premisse[i])  t1 =1;
                i++;
            }
            while (i < nbre-1)
            { 
                if  (y == listtest.courant->premisse[i])  t2 =1;
                i++;  
            }
     
            if  (z == listtest.courant->conclusion)  t3 =1;
     
     
            if ((t1 == 1) && (t2== 1)&& (t3 ==1))
                sup++;
            d++;
            listtest.allersuivant();
        }
        return sup;
    }
    voila dans cette partie de main j’appelle cette fonction :
    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
    cout <<"debut try \n" ;
     
    list.allerpremier();
    int n2=0,tr = 0, sup;
    while (n2 < nbreregles-1)
    { 
        int i=0;
        string x,y,z;
        int n = list.courant->nbrepremisse ;
        while (i <= n-2 )
       {
            //cout <<"i = " << i << "  " ;
            //cout << list.courant->premisse[i]<< "\n";
            x= list.courant->premisse[i];
            cout << "x : "<< x << "\n";
           //cout <<"i+1 = " << i+1 << "  " ;
           //cout << list.courant->premisse[i+1]<< "\n";
           if (n>1) {y = list.courant->premisse[i+1];
           cout << "y : " << y << "\n"; }
           i++;
        }
        //cout << list.courant->conclusion<< "\n";
        z=  list.courant->conclusion;
        cout <<"z : "<< z<< "\n";
        sup= calculsup (x,y,z);
        cout << n2 << ":" << sup<< "\n" ;
     
        list.allersuivant();
        n2++;
     
        }
        return 0;
    Tu ne trouves pas qu'il est tout de suite beaucoup plus facile de suivre ce que ton code est sensé faire

    Maintenant, pour répondre à ta question, il faut savoir qu'une erreur de segmentation survient généralement lorsque tu commence à manipuler incorrectement des pointeurs: Parce que tu essayes d'accéder ou de libérer à une adresse mémoire qui a déjà été libérée, lorsque tu essaye de déréférencer NUL (autrement dit, quand ton code revient à faire un NULL->quelqueChose), etc.

    Je n'ai jeté qu'un coup d'oeil assez distrait sur ton code, mais j'ai l'impression que l'erreur est ailleurs! Si j'étais toi, je commencerais sans doute par vérifier très attentivement le code des différentes fonctions de liste_transaction et en particulier de toutes les fonctions qui manipulent des pointeurs.

    N'oublie pas que, si tu décides d'utiliser les pointeurs, il y a trois règles à suivre impérativement:
    • Les initialiser à NULL (nullptr en C++11) si tu ne peux pas donner directement l'adresse mémoire qu'il doivent représenter
    • Vérifier systématiquement s'ils ne valent pas NULL (nullptr) avant toute tentative de déréférencement
    • leur affecter la valeur NULL (nullptr) tout de suite après avoir utilisé delete sur le pointeur si la variable correspondant au pointeur reste accessible

    N'oubies pas non plus la règle des trois grands qui veut que, si tu définis une des fonctions pami le constructeur de copie, l'opérateur d'affectation et le destructeur, il faut impérativement définir un comportement correct pour les trois fonctions.

    Enfin, l'idéal est toujours de venir avec un code minimum compilable et un exemple des données utilisées lorsque l'on est confronté à un problème à l'exécution.

    Le code minimum compilable correspond à un code minimum, susceptible de compiler et de fournir un exécutable, qui soit en mesure de reproduire l'erreur à laquelle tu es confronté, éventuellement en utilisant le jeu de données que tu nous présente
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Problème de compilation (erreur LNK1104)
    Par Rakdos dans le forum Ogre
    Réponses: 7
    Dernier message: 28/03/2015, 19h49
  2. Problème de compilation segmentation fault
    Par nightfire dans le forum Fortran
    Réponses: 7
    Dernier message: 24/02/2009, 17h02
  3. Problème : erreur de segmentation.
    Par bastnt dans le forum C++
    Réponses: 23
    Dernier message: 05/10/2008, 19h01
  4. Problème de compilation Ogre -- Message d'erreur
    Par chroufa dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 18/03/2008, 19h55
  5. Réponses: 10
    Dernier message: 18/07/2007, 19h15

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