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 :

segmentation fault (eh oui encore lui !)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut segmentation fault (eh oui encore lui !)
    salut les amis
    j ai un petit soucis au niveau de mon programme
    ce dernier m affiche un segmentation fault apres avoir effectué la toute derniere operation du programme a savoir un printf x2
    a l aide du débogueur GDB j ai pu situé le probleme mais je ne vois pas du tout ce qui peut generer une tel chose
    Message de gdb :
    Program received signal SIGSEGV, Segmentation fault.
    0x080488f3 in main ()
    Donc apparement ca vient de mon main que voici :
    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
     
    int main(int argc, char** argv)
    {
    	int NbMot;
    	char codeC[V][N]; //contenu des mots
    	int codeL[2]; // longueur des mots
     
    	printf("Nombre de mot du code : ");
    	scanf("%d",&NbMot);
    	saisie_code(codeC,codeL,NbMot);
     
    	prefixe(codeC,codeL,NbMot);
    	suffixe(codeC,codeL,NbMot);
     
    	return 0;
    }
    petite precision quand meme, le probleme est apparue lors de la creation de la procedure suffixe (apres avoir debuugué attentivement cette derniere aucune erreur en ressort)

    est ce que quelqu'un aurait une petite idée la dessus ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    est ce que quelqu'un aurait une petite idée la dessus ?
    Il y a des chances que oui. mais comme tu es le seul a avoir l'intégralité du code sous tes yeux, pour le moment c'est non.

    Au hasard, sans voir le code, dans tes manipulations de chaînes, tu n'aurais pas oublié de réserver la place du zéro terminal !.

  3. #3
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    effectivement
    en fait j ai alloué des tableaux de taille N (N = 10) et avec mes valeurs de test je n'arrive generalement pas au dela d'une taille equivalent a 4

    V = 4 et N = 10
    voici le code de ma fonction suffixe
    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
     
    void suffixe(char codeC[V][N],int codeL[2],int NbMot)
    {
    	int i,j,k,diff,LgTest,Lg1,start,x;
    	int sufix = 0;
    	char Mot1[N];
    	char MoTest[N];
    	char NMot[N];
     
    	for(i=0;(i<NbMot) && (sufix != 1);i++){
     
    		strcpy(Mot1,codeC[i]);
    		Lg1 = codeL[i];
    		for(j=0;(j<NbMot) && (sufix != 1);j++){
    			if(j!=i){
    				diff = 0;
    				strcpy(MoTest,codeC[j]);
    				LgTest = codeL[j];
    				if(Lg1>LgTest)
    					diff = 1;
    				else{
    					start = LgTest - Lg1;
    					x = 0;
    					for(k=start;k<LgTest;k++){
    						NMot[x] = MoTest[k];
    						x++;
    					}
    					printf("NMOT : %s\n",NMot);
    					if(strncmp(Mot1,NMot,Lg1)) //si les chaines sont !=
    						diff = 1;
    				}
    				if(diff == 0)
    					sufix = 1;
    			}
    		}
    	}
    	if(sufix == 1){
    		printf("Le Code ne respecte pas les conditions du SUFFIXE !\n");
    	}
    	else{
    		printf("Le Code respecte les conditions du SUFFIXE !\n");
    	}
    }
    la fonction prefixe ne pose aucun probleme, le programme marchait impeccablement avan l ajout de suffixe

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Pas bien le temps de tout comprendre mais es tu sur que ton mot NMOT fabriqué par la boucle suivante est bien terminé par un zéro sinon le printf suivant la boucle risque de faire mal !.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(k=start;k<LgTest;k++){
    	NMot[x] = MoTest[k];
    	x++;
    	}
    printf("NMOT : %s\n",NMot);
    Essaye juste de rajouter

    NMot[x] =0 entre la boucle et le printf.

    Tu peut éviter ta boucle en utilisant la fonction strncpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    strncpy(NMot,&MoTest[start],Lgtest);
    NMot[Lgtest]=0;

    Si le problème persiste, poste l'intégralité du code pour que l'on puisse exécuter ton programme.

  5. #5
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    J'ai effectué les modifications que tu m as proposé mais l'erreur persiste
    voici l'integralité du code :

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include <stdio.h>
    #include <string.h>
    #define N 10 //Longueur par defaut d'un tablo contenant un mot
    #define V 4 //Nombre de mot par defo de mot pouvant etre contenu dans le tablo
     
     
    void saisie_code(char codeC[V][N],int codeL[2],int NbMot)
    {
    	int i;
    	char mot[N];
    	for(i=0;i<NbMot;i++){
    		printf("Saisie du mot %d : ",i+1);
    		scanf("%s",mot);
    		strcpy(codeC[i],mot);
    		printf("longueur du mot : ");
    		scanf("%d",&codeL[i]);
    	}
    }
     
    void prefixe(char codeC[V][N],int codeL[2],int NbMot)
    {
    	int i,j,diff,LgTest,Lg1;
    	int prefix = 0;
    	char Mot1[N];
    	char MoTest[N];
     
    	for(i=0;(i<NbMot) && (prefix != 1);i++){
     
    		strcpy(Mot1,codeC[i]);
    		Lg1 = codeL[i];
    		for(j=0;(j<NbMot) && (prefix != 1);j++){
    			if(j!=i){
    				diff = 0;
    				strcpy(MoTest,codeC[j]);
    				LgTest = codeL[j];
    				//Test sur la longueur des mots (si Mot prefix > Mot)
    				if(Lg1>LgTest)
    					diff = 1;
    				else{
    					//printf("Mot1 : %s & Mot2: %s",Mot1,MoTest);
    					if(strncmp(MoTest,Mot1,Lg1)) //si les chaines sont !=
    						diff = 1;
    				}
    				if(diff == 0)
    					prefix = 1;
    			}
    		}
    	}
    	if(prefix == 1){
    		printf("Le Code ne respecte pas les conditions du PREFIXE !\n");
    		printf("Condition du prefixe -> Aucun mot de code n’est le debut d’un autre\n");
    	}
    	else{
    		printf("Le Code respecte les conditions du PREFIXE !\n");
    		printf("Condition du prefixe -> Aucun mot de code n’est le debut d’un autre\n");
    	}
    }
     
    void suffixe(char codeC[V][N],int codeL[2],int NbMot)
    {
    	int i,j,diff,LgTest,Lg1,start;
    	int sufix = 0;
    	char Mot1[N];
    	char MoTest[N];
    	char NMot[N];
     
    	for(i=0;(i<NbMot) && (sufix != 1);i++){
     
    		strcpy(Mot1,codeC[i]);
    		Lg1 = codeL[i];
    		for(j=0;(j<NbMot) && (sufix != 1);j++){
    			if(j!=i){
    				diff = 0;
    				strcpy(MoTest,codeC[j]);
    				LgTest = codeL[j];
    				if(Lg1>LgTest)
    					diff = 1;
    				else{
    					start = LgTest - Lg1;
    					//x = 0;
    					strncpy(NMot,&MoTest[start],LgTest);
    					/*for(k=start;k<LgTest;k++){
    						NMot[x] = MoTest[k];
    						x++;
    					}*/
    					NMot[LgTest] =0;
    					printf("NMOT : %s\n",NMot);
    					if(strncmp(Mot1,NMot,Lg1)) //si les chaines sont !=
    						diff = 1;
    				}
    				if(diff == 0)
    					sufix = 1;
    			}
    		}
    	}
    	if(sufix == 1){
    		printf("Le Code ne respecte pas les conditions du SUFFIXE !\n");
    	}
    	else{
    		printf("Le Code respecte les conditions du SUFFIXE !\n");
    	}
    }
     
    int main(int argc, char** argv)
    {
    	int NbMot;
    	char codeC[V][N]; //contenu des mots
    	int codeL[2]; // longueur des mots
     
    	printf("Nombre de mot du code : ");
    	scanf("%d",&NbMot);
    	saisie_code(codeC,codeL,NbMot);
     
    	prefixe(codeC,codeL,NbMot);
    	suffixe(codeC,codeL,NbMot);
     
    	return 0;
    }
    exemple de test :

    mot 1: 0 Longueur 1
    mot 2: 10 Longueur 2
    mot 3: 110 Longueur 3
    mot 4: 111 Longueur 3

  6. #6
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    Apres un passage obligé sur windob j'ai testé le programme sous visual C et ce dernier me sors l'erreur suivante a la fin du programme
    Run-Time Check Failure #2 - Stack around the variable 'codeL' was corrupted.

    petite question en passant :
    en utilsant un autre exemple pour tester mon programme sous linux les resultats ne conviennent pas (ne correspond pas aux resultats attendu) et sous windows les resultats sont bon sans avoir rien changé au programme
    c'est du a quoi d apres vous ? (anciennes valeurs resté en memoire ....?)

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ce genre d'erreur indique généralement un débordement de buffer sur la pile.
    Ton tableau mot, par exemple...
    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.

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

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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