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


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 20
    Points
    20
    Par défaut segmentation fault
    Bonsoir,
    J'effectue actuellement un programme sur la compression topologique,lors de la compilation j'ai pas de problême cependant lorsque je l'execute j'ai un segmentation fault.
    voila mon code source il est assez grand je suis désolée j'espere que vous pourrez comprendre malgré les commentaires.

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
    /* Fichier d'en-tête */
    #include <stdio.h>
    #include <stdlib.h>
     
    /*Prototypes*/
    int read_file(char freq[256],FILE *fichier);
    char carac_plu_frequent(char freq[256]);
    char lecture_8octets_aff_topo(char tab[8],FILE *fichier,char freq[256]);
    char miseaX (int x,int i,char c);
     
    /*Fonction read_file permettant de lire le fichier et de stocker les caractere dans un tableau ce qui permettra de voir le nombre de caractere et le caractere le plus frequent*/
    int read_file(char freq[256],FILE *fichier)/*Elle renvoi un int normal c'est le nombre de caractere*/
    {
    	int nb_carac;/*Variable de type entier pour le nombre de caractere*/
    	int i;/*Pour la scrutation*/
    	char c;/*Pour stocker les caractere scruter*/
     
    	fichier = fopen("fichier.txt","r+");/*On ouvre le fichier qu'on veut lire*/
    	nb_carac = 0;/*on met a 0 le nombre de caractere*/
     
    	for(i=0;i<256;i++)/*On met toutes les cases du tableau à 0*/
    	{
    		freq[i] = 0;/* voila qui est fait ...*/
    	}
     
    	if(fichier == NULL)/*On verifie bien que le fichier existe*/
    	{
    		printf("Erreur pendant la lecture du fichier\n");
    		exit(0);/*On sort du programme si le fichier n'existe pas*/
    	}
     
    	while(!feof(fichier))/*Tant qu'on est pas arrivé a la fin du fichier*/
    	{
    		c = fgetc(fichier);/*c prend la valeur d'un caractere*/
    		freq[c] = freq[c] + 1;/*dans le tableau on increment la case du tableau correspondant a la valeur ASCII du caractere*/
    		nb_carac++;/*Sert a compter le nombre de caractere*/
    	}
    	nb_carac = nb_carac - 1; /*C'est bizare ca lit un caractère en plus ...*/
    	return nb_carac;/*La fonction retourne le nombre de caractere au cas ou on en aurai besoin*/
    }
     
    /*fonction carac_plu_frequent permettant en sorti de voir le fichier le plus frequent dans le fichier*/
    char carac_plu_frequent(char freq[256])/*Elle renvoi un caractere ( le plus frequent )*/
    {
    	int frequence_max_du_carac ;/*Permet de stocker le nombre de fois qu' un caractere  est present*/
    	int carac_plus_frequent;/*Permet de stocker le caractere le plus fréquent*/
    	int i;/*Pour la scrutation*/
     
    	carac_plus_frequent = 0; /*On met a 0 ....(normal)*/
    	frequence_max_du_carac = 0;/*On met a 0 ....(normal)*/
     
    	for(i=0;i<256;i++) /* on scrut le tableau de caractere afin de determiner le caractere le + fréquent */
    	{
    		if(freq[i] > frequence_max_du_carac)/*Si le nombre de caractere est superieur au debut a 0 alors on entre*/
    		{
    			carac_plus_frequent = i; /*le caractere le plus fréquent prend alors la valeur de i */
    			frequence_max_du_carac = freq[i]; /*Et le nombre de fois qu'apparai le caractere est mis dans la variable frequence_max*/
    		}
    	}
    	printf("Le caractere le plus fréquent apparait %d fois \n",frequence_max_du_carac);
    	return carac_plus_frequent;/*On retourne le fameux caractere */
    }
     
    /*Fonction lecture_8octets_aff_topo permettant de lire 8 caractere et d'en sortir le topologique */
    char lecture_8octets_aff_topo(char tab[8],FILE *fichier,char freq[256]) 
    /*elle renvoi le caractere topologique*/
    {	
    	char temp;/*Temp sera ici le caractere le plus frequent (on appelera la fonction précédente) */
    	char c;/*C servira pour stocker les caractere lu dans le fichier */
    	int i;/*tjs pour la scrutation */
    	char topo ;/*topo sera le nombre topologique */ 
     
    		for(i=0;i<8;i++)
    		{
    			tab[i] = 0;
    		}
     
    		temp = 0;
    		for(i=0;i<8;i++)/*On veut 8 caractere donc de 0 a 7 */
    		{
    			c =0;/*on met c a 0 normal */
    			if(!feof(fichier))/*Si on est pas arriver a la fin du fichier on fait ...*/
    			{
    				c = fgetc(fichier);/*c prend la valeur d'un caractere*/
    			}
    		tab[i] = c;/*tab[i] prend la valeur de c pour tab allant de 0 a 7 inclus*/
    		}
     
    		topo = 0; /*Normal*/	
    		temp = carac_plu_frequent(freq);
    		for(i=0;i<8;i++)
    		{	
    			if(tab[i] == temp) /*si tab[i] est notre caractere le plus fréquent */
    			{
    				topo = miseaX(1,7-i,topo); /*Donc la ....on fait un maskage 00000000 | 00000001 : pour i = 0 il n'y a pas de decalage donc si tab[i] = temp le bit de poit faible = 1 .. etc .. */ 
    			}
    		}
    		return topo;/*on retourne le topologique */
    }
     
    char miseaX (int x,int i,char c)
    {
    	if(x == 0)
    	{
    		return(c&~(1<<i));
    	}
    	else
    	{
    		return(c|(1<<i));
    	}
    }
     
    int main(void)
    {
    	FILE *fichier;
    	char topo;
    	char tab[8];
    	char freq[256];
    	int n;
    	char c;
     
    	n = read_file(freq,fichier);
    	printf("Le fichier contient : %d caractere(s)\n",n);
     
    	c = carac_plu_frequent(freq);
    	printf("Le caractere le plus fréquent dans le fichier est : %c\n",c);
     
    	fseek(fichier,0,0);
    	topo = lecture_8octets_aff_topo(tab,fichier,freq);
    	printf("Le caractere topologique est : %c",topo);
     
    	fclose(fichier);
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ gcc -o compression compression.c -lm
    compression.c:156:2: warning: no newline at end of file
    $./compression
    Le fichier contient : 9 caractere(s)
    Le caractere le plus fréquent apparait 3 fois
    Le caractere le plus fréquent dans le fichier est : o
    Segmentation fault
    $

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    fichier n'a jamais été initialisé. (pas d'ouverture)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int read_file(char freq[256],FILE *fichier)/*Elle renvoi un int normal c'est le nombre de caractere*/
    {
    	int nb_carac;/*Variable de type entier pour le nombre de caractere*/
    	int i;/*Pour la scrutation*/
    	char c;/*Pour stocker les caractere scruter*/
     
    	fichier = fopen("fichier.txt","r+"); ..........
    }
    si je l'ouvre dans cette fonction et que je ne le ferme pas il est toujours ouvert non ?

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Mais la variable fichier du main n'a pas été initialisée: C'est une variable locale fichier à read_file qui l'a été.
    Donc Ouvre le fichier dans main et passe ensuite la variable fichier en argument à read_file. Naturellement supprime l'ouverture dans read_file
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    ah d'accord,merci beacoup pour ton aide.

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Si tu souhaites garder l'ouverture du fichier dans ta fonction utilise un File **fichier dans celle-ci.
    Au moment de l'appel, tu passes l'adresse de fichier, et dans ta fonction tu mets une * en plus.
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

+ 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