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


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Par défaut erreur de segmentation
    Bonjour,

    Voila mon probleme : lorsque je compile ce code, ça passe, mais à l'execution, ça sort : "erreur de segmentation".
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #include <stdio.h>
    #include <string.h>
    #define FICH_IR "ir.edt"
    #define NBE_LINE_TAB 5
    #define NBE_COL_TAB 3
    #define LINE_SIZE 9
     
    void initTabMat (char tabMat[NBE_LINE_TAB][NBE_COL_TAB][LINE_SIZE], char nomFich[]){
     
    	//variables locales
    	FILE * fich;
    	FILE * fichFil;
    	char ligne[LINE_SIZE];
    	int ind = 0;
    	char tabFil[NBE_LINE_TAB][NBE_COL_TAB][LINE_SIZE];
    	int i;
    	int j;
     
    	//debut
    	fich = fopen("ens.edt","r");
    	fichFil = fopen(nomFich,"r");
     
    	while(fgets(ligne, sizeof(ligne), fichFil) != NULL){
    		strncpy(tabMat[ind][0], ligne, 4);
    		tabMat[ind][0][4] = '\0';
    		tabMat[ind][1][0] = ligne[5];
    		tabMat[ind][1][1] = '\0';
    		tabMat[ind][2][0] = '\0';
     
    		//printf("%s",ligne);
    		ind++;
    	}
     
    	ind = 0;
     
    	while(fgets(ligne, sizeof(ligne), fich) != NULL){
    		strncpy(tabFil[ind][0], ligne, 4);
    		tabFil[ind][0][4] = '\0';
    		tabFil[ind][1][0] = ligne[5];
    		tabFil[ind][1][1] = ligne[6];
    		tabFil[ind][1][2] = '\0';
    		tabFil[ind][2][0] = '\0';
    		ind++;
    	}
    	for(i = 0 ; i < NBE_LINE_TAB ; i++){
    		for(j = 0 ; j < NBE_LINE_TAB ; i++){
    			if(strcmp(tabMat[i][0],tabFil[j][0]) == 0){
    				strcpy(tabMat[i][2], tabFil[j][1]);
    			}
    		}
    	} 
     
    	fclose(fichFil);
     
    	fclose(fich);
     
    }
     
     
     
    void testAffich(char tabMat[NBE_LINE_TAB][NBE_COL_TAB][LINE_SIZE]){
     
    	int i;
     
    	for(i = 0; i < 5; i++){
    		printf("%s %s %s\n", tabMat[i][0], tabMat[i][1], tabMat[i][2]);
    	}
    }
     
     
    int main(){	
     
    	char tabMat[NBE_LINE_TAB][NBE_COL_TAB][LINE_SIZE];
    	initTabMat(tabMat, FICH_IR);
    	testAffich(tabMat);
    }
    Je ne voi pas d'ou vien l'erreur... Une idée?

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Yaurait surement plein de causes, mais là comme ça, je dirais que les fichiers n'existent pas, fopen renverrait NULL et le fgets qui suit planterait
    Si c'est ta premiere seg fault, faut savoir que c'est tres courant et que ça n'a rien avoir avec une erreur du systeme... Je connais pas la signification exacte, mais je pense que ça veut dire que le process a essayé d'acceder à une zone memoire interdite (l'adresse 0x0 est interdite, forcement)

  3. #3
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    Salut,

    pour commencer utilise un debugger (si tu es sous linux gdb fera l'affaire) pour savoir où ça plante (http://www.developpez.com/c/gcc/c942.html)

    sinon quelques remarques :

    - Il faut tester tes créations de fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	//debut
    	fich = fopen("ens.edt","r");
            if (fich == NULL)
            {
                  printf("fichier ens erreur\n");
                  exit(-1);
             }
    	fichFil = fopen(nomFich,"r");
            if (fich == NULL)
            {
                  printf("fichier %s erreur\n", fichFil);
                  exit(-1);
             }
    ;

    Essaye de mieux segmenter et commenter ton code car c'est assez opaque à première vue

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Par défaut
    Voici ce que donne le débugger gdb :

    Program received signal SIGSEGV, Segmentation fault.
    0xb7e2beda in fgets () from /lib/tls/i686/cmov/libc.so.6

    d'après mes tests, il s'agit du fgets du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(fgets(ligne, sizeof(ligne), fich) != NULL){
    		strncpy(tabFil[ind][0], ligne, 4);
    		tabFil[ind][0][4] = '\0';
    		tabFil[ind][1][0] = ligne[5];
    		tabFil[ind][1][1] = ligne[6];
    		tabFil[ind][1][2] = '\0';
    		tabFil[ind][2][0] = '\0';
    		ind++;
    }
    je ne comprend pas, la ligne de code suivante fonctionne quand elle n'est pas dans le while :
    fgets(ligne, sizeof(ligne), fich);

    voici mon fichier ens.edt :
    MATH;AG
    PROG;DL
    ALGO;MV
    ANGL;AI
    ALTE;RN

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Es-tu sur de ne pas avoir une sixième ligne blanche dans ton fichier, car les lectures ne se basent que sur le contenu du fichier et ne sont pas limitées par la dimension (5) du tableau ?

  6. #6
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par daweed
    Voici ce que donne le débugger gdb :

    Program received signal SIGSEGV, Segmentation fault.
    0xb7e2beda in fgets () from /lib/tls/i686/cmov/libc.so.6

    d'après mes tests, il s'agit du fgets du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(fgets(ligne, sizeof(ligne), fich) != NULL){
    		strncpy(tabFil[ind][0], ligne, 4);
    		tabFil[ind][0][4] = '\0';
    		tabFil[ind][1][0] = ligne[5];
    		tabFil[ind][1][1] = ligne[6];
    		tabFil[ind][1][2] = '\0';
    		tabFil[ind][2][0] = '\0';
    		ind++;
    }
    je ne comprend pas, la ligne de code suivante fonctionne quand elle n'est pas dans le while :
    fgets(ligne, sizeof(ligne), fich);

    voici mon fichier ens.edt :
    MATH;AG
    PROG;DL
    ALGO;MV
    ANGL;AI
    ALTE;RN
    + 1 avec Diogene. A première vue, tu dois accéder en dehors de tabFil avec une valeur incorrecte de ind (>5). Il faut donc conditionner le while également avec la dimension max du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /*...*/
    while(fgets(ligne, sizeof(ligne), fich) && ind < NBE_LINE_TAB)
    {
         /* traitement*/
    }
    /*...*/
    A+
    Foobar1329

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    recupere la valeur de ton sizeof(ligne) avant ta boucle et regarde si il contient
    bien assez de caractere pour lire la ligne complete!
    ca ressemble au fait que tu ne lis pas la ligne complete et du coup ta boucle fait plus de tour que prevu !

    edit:
    j'avais pas regarder le debut du code
    char ligne[LINE_SIZE]; donc sizeof doit te renvoyer 9
    ce qui est suffisant pour lire la ligne complete donc je rejoins l'idée plus haut tu dois avoir peut une ligne en plus ds txt!
    sinon rajoute des printf entre les lignes de ta boucle pour reperer l'erreur

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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