Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/03/2007, à 23:04

stereotype

Pb en C: Erreur de segmentation (core dumped)

Bonsoir a tous,

Je suis un jeune programmeur en C, et en voulant passer une image couleur en N/B, il me retourne ca lors de l'execution:
Erreur de segmentation (core dumped)

Je joins ici mon code:

#include <stdio.h>

int main()
{
FILE *q;
q=(FILE *) fopen("image2.ppm", "w");

FILE *f;
f=(FILE *) fopen("image1.ppm","r");


int i;
int j;
int k;
int compteur;
compteur=0;

while (compteur <4)
	{
	i = fgetc(f);
	fputc(i, q);
	if (i==10)
	compteur++;
	}

while (! feof(f))
	{
	i = fgetc(f);
	j = fgetc(f);
	k = fgetc(f);

		for ( compteur=0; compteur<=2; compteur++)
			{
			fputc((i+j+k)/3, q);
			}
	}
fclose(f);
fclose(q);
}

J'ai vu des cas ou cette erreur revenait, mais je n'ai pas reussi a l'identifier a mon probleme.

Merci d'avance smile


La vie... c'est bien.
Site perso/portfolio: www.guebew.com

Hors ligne

#2 Le 18/03/2007, à 23:53

tiky

Re : Pb en C: Erreur de segmentation (core dumped)

je sais pas pourquoi mais je sent qu'il doit s'agir d'un pointeur nul ou un dépassement dans un buffer tongue

Utilise gdb pour trouver la source d'erreur mais déjà sans compiler je fais une petite correction.

#include <stdio.h>

int main()
{
FILE *q = NULL;
q=(FILE *) fopen("image2.ppm", "w");
if( q == NULL )
{
   exit(-1);
}

FILE *f = NULL;
f=(FILE *) fopen("image1.ppm","r");
if( f == NULL )
{
   exit(-1);
}

int i;
int j;
int k;
int compteur = 0;

while (compteur <4)
    {
    i = fgetc(f); // c'est normal que tu veux récuper un char dans un int ?
    fputc(i, q);
    if (i==10)
    compteur++;
    }

while (! feof(f))
    {
    i = fgetc(f);
    j = fgetc(f);
    k = fgetc(f);

        for ( compteur=0; compteur<=2; compteur++)
            {
            fputc((i+j+k)/3, q);
            }
    }
fclose(f);
fclose(q);
}

Dernière modification par tiky (Le 18/03/2007, à 23:56)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#3 Le 18/03/2007, à 23:57

sylvaing01

Re : Pb en C: Erreur de segmentation (core dumped)

Salut, moi aussi je débute en c:

while (compteur <4)
    {
    i = fgetc(f);
    fputc(i, q);
    if (i==10)           //mettre {
    compteur++;    // et }
    }

si des fois...

Hors ligne

#4 Le 19/03/2007, à 00:04

sylvaing01

Re : Pb en C: Erreur de segmentation (core dumped)

ah çà me revient j'ai eu une fois un problème avec while (! eof) pour une copie de fichier, et j'avait solutionné le problème comme çà:

while(!feof(fichiersrc))
{    i=fgetc(fichiersrc);
      if(i==EOF){break;}
      x=fputc(i, fichiercible);
      if(x==EOF){break;}
}
      fclose(fichiersrc);
      fclose(fichiercible);

Hors ligne

#5 Le 19/03/2007, à 06:24

benlaug

Re : Pb en C: Erreur de segmentation (core dumped)

Astuce lors des erreurs de segmentation.

Si vous voyez pas (core dumped) tapze :

ulimit -c 1000000

(bon c'est p'têtre abusé mais au moins on est sur smile)

Relancer le programme pour recréer l'erreur (en l'ayant compilé avec l'option -g de gcc)
Normalement on doit voir Segmentation Fault (Core Dumped).

Ensuiter taper :

gdb ./a.out core

où a.out est le nom du binaire

(gdb) where

Et là magie, on a toutes les instructions qui pose problème

Dernière modification par benlaug (Le 19/03/2007, à 06:24)

Hors ligne

#6 Le 19/03/2007, à 10:22

stereotype

Re : Pb en C: Erreur de segmentation (core dumped)

Salut,

Merci pour ton post smile j'ai modifié mon programme comme tu l'as fait, et en l'executant dans GDB, il me dit:

Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0xffffe000

Program exited with code 0377.

C'est la premiere fois que j'utilise gdb et je ne sais pas du tt a quoi ca correspond.
Voila voila hmm


La vie... c'est bien.
Site perso/portfolio: www.guebew.com

Hors ligne

#7 Le 19/03/2007, à 11:28

qqun

Re : Pb en C: Erreur de segmentation (core dumped)

bon je suis pas sur que cela soit le pb , mais quand tu lis ta derniere valeur
tu fait 3 fgetc , le premier passe mais le suivant dois renvoyer normalement un  EOF.

sinon ce petit prog devrait le faire mais pour les fichier ppm brut ,  pas pour les ppm ascii.
par contre il change pas la valeur max du header.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[])
{
	
FILE *in,*out;
	
int i,cpt=0; //var tmp et compteur
char res,c[192]; // var pour moyenne 3 coul , var pour lire une ligne
int w,h,s=0; // largeur,hauteur,taille header ppm
int r[2],g[2],b[2]; // var pour stocke rgb
unsigned char * tmp; // var pour ecrire ds fic out
	
in=fopen("beach.ppm", "r");
if(in==NULL)return 1;
	
out=fopen("bwbeach.ppm","w");
if(out==NULL)return 1;

tmp=malloc(sizeof(unsigned char)*4);

// lecture header

while (cpt <4)
{
    fgets(c,100,in);
    fprintf(out,"%s",c);
    s=s+strlen(c);
    if(cpt==2)sscanf(c,"%d %d",&w,&h);
    cpt++;
}

printf ("largeur:%d hauteur:%d sh:%d\n",w,h,s);

// positionement apres header

fseek (in , s , SEEK_SET);
fseek (out , s , SEEK_SET);

for(i=0;i<(h*w);i++){
	
	fread(r,1,1,in);
	fread(g,1,1,in);
	fread(b,1,1,in);
	
	res=((r[0]+g[0]+b[0])/3);
	
	tmp[0]=res;
	tmp[1]=res;
	tmp[2]=res;
	tmp[3]='\0';	
	
	s=s+3;
	
	fwrite(tmp,3,1,out);	
}

printf ("size:%d\n",s);

fclose(in);
fclose(out);

return 0;

}

#8 Le 19/03/2007, à 22:50

stereotype

Re : Pb en C: Erreur de segmentation (core dumped)

Salut qqun,

je viens de lire ton message, et je n'ai pas tt compris de ce que tu as fait.
Peux tu m'expliquer stp?

Merci en tt cas smile


La vie... c'est bien.
Site perso/portfolio: www.guebew.com

Hors ligne

#9 Le 20/03/2007, à 12:35

qqun

Re : Pb en C: Erreur de segmentation (core dumped)

ben en fait je n'y connais pas grand chose en ppm sad
en fait hier je me suis base sur le fait que le header etait du type
P6 
1024 788
# A comment
255
et que les donnees de l'image etait enregistrees en byte (pas en ascii) .
cela apres avoir etudie une image de ce format . mais bon c'est un peu empirique lol et vraiment pas tres juste sachant que:
P6 
1024 788
# A comment
255
et
P6  1024 788 255
sont 2 headers valides

donc je te conseille d'oublier mon code precedent ; ( qui ne marche que dans un cas bien precis sad
 
sinon ici il donne une descripiton plus precise du format PPM:

http://local.wasp.uwa.edu.au/~pbourke/dataformats/ppm/

pour ton coredump  je dirais que cela dois surement arriver dans certain cas suivant le format et le header
de l'image ppm .  par contre il semble bien que dans ton while  il y est un pb et qu'il passe une fois de trop comme disait sylvaing01 .

voila , bonne chance et desole de pouvoir t'aider plus

#10 Le 20/03/2007, à 15:30

stereotype

Re : Pb en C: Erreur de segmentation (core dumped)

Salut qqun,

Merci beaucoup pour ton interet a mon probleme en tt cas smile je vais aller voir sur ton lien si je peux trouver des infos interessantes, et je te tiendrai au courant sur ce post!

Merci a tous!!


La vie... c'est bien.
Site perso/portfolio: www.guebew.com

Hors ligne

#11 Le 03/05/2008, à 12:15

BigBouz

Re : Pb en C: Erreur de segmentation (core dumped)

bon je ne sais pas si ca pourrait changer qq chose
mais quand tu lis des info brut dans un fichier vaut mieux mettre

 f = fopen (fichier, "rb");

(et respectivement "wb" quand tu lis)

#12 Le 03/05/2008, à 12:20

rniamo

Re : Pb en C: Erreur de segmentation (core dumped)

ppm c'est du texte, pas des info brut wink.

sinon pourquoi ce castage ?

f=(FILE *) fopen("image1.ppm","r");

il est inutile...

par contre apré ton fopen tu dravrait faire un truc su style :

if (f) {...}

Car si tu ouvre pas ton image ça marche mal wink

A la limite envoi tes images (si elles ne sont pas trop grosses)


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#13 Le 04/05/2008, à 15:04

0nim3

Re : Pb en C: Erreur de segmentation (core dumped)

Moi je dirais plutôt qu'il faut placer le curseur avec fseek.
Essaye tu ne risque rien.

Hors ligne

#14 Le 09/11/2008, à 13:27

AigleRoyal33

Re : Pb en C: Erreur de segmentation (core dumped)

Bonjour à tous,

Je suis débutant en C et je me mêle les pinceaux avec les pointeurs en ce moment. Je vous expose mon problème.
Je souhaite :

1 - Aller chercher dans un fichier une ligne qui contient par exemple : "etat1 etat2 etat3 e4 e5#" (espaces compris)

2 - Maintenant, je voudrais créer un tableau de 5 pointeurs. Chaque pointeur, pointera sur chacune des chaines de caractères. Autrement dit, si on appelle, le tableau : tab_pointeurs, on aura :

tab_pointeurs[0] qui pointe sur "etat1"
tab_pointeurs[1] qui pointe sur "etat2"
......
tab_pointeurs[4] qui pointe sur "e5"

SEULEMENT, on ne sait pas à l'avance combien d'états on aura dans le fichier, et donc de combien de pointeurs on aura besoin. Et on ne sait pas non plus quelle taille feront chaque chaine de caractères. D'où les allocations mémoires.

Je ne sais pas si le problème est assez clair smile. Voilà, la portion de code :

   1. typedef char* t_etats;
   2. 'etats' est une variable globale. Un tableau de 500 caractères maxi qui contiendra toute la ligne du fichier (espaces compris).
   3. i est la variable qui permet de se déplacer dans ce tableau.
   4.
   5. //////////////////////////////////////// FONCTION RECHERCHER_ETATS ///////////////////////////////////////////////
   6. /*   
   7. * Recherche les états de la machine dans le fichier 'machine'.
   8. * Préconditions : Le fichier existe
   9. * Postconditions : Renvoie un tableau de chaîne de caractères (les états).
  10. */
  11. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. t_etats* rechercher_etats(FILE* fichier){
  13.
  14.     char marqueur = '$'; t_etats* etats_ret=NULL;
  15.    
  16.     /* Parcours du fichier ligne par ligne. On sort de la boucle une fois le mot trouvé.*/
  17.     while (!feof(fichier)){
  18.          
  19.           fgets(etats,sizeof(etats),fichier);         
  20.           if(etats[0] != marqueur){
  21.                 break; 
  22.           } 
  23.     }
  24.     printf("Etats recherches : %s",etats);
  25.     printf("Taille : %d\n",strlen(etats)-2); // on enlève le '#' et le marqueur de fin '\0'
  26.     int unsigned i=0; int j=0; int unsigned k=0; int maxetats=0; int taille_nom_etat=0; int t=0;
  27.            
  28.     // On compte le nombre total d'états présents pour la machine. En comptant le nombre d'espace entre leurs noms et en ajoutant 1.
  29.     while(k<strlen(etats)-2){
  30.        if(etats[k]==' '){ 
  31.           maxetats++; 
  32.        }
  33.        k++;
  34.     }
  35.     maxetats++;
  36.     printf("nbre d'etats : %d\n",maxetats);
  37.
  38.     /* tab_etat est un tableau de pointeurs. Sa taille (maxetats) n'est pas connue à l'avance. Mais, on en aura besoin un peu plus haut
  39.      * dans la fonction "indice_etat". Sa taille réelle est contenue dans la variable maxetats et on ajoute une case de plus qui
  40.      * contiendra toujours NULL. Cette case jouera le rôle de marqueur de fin et nous permettra à l'aide d'une boucle de déterminer la
  41.      * taille du tableau. Les indices vont de 0 à maxetats-1. Donc, si on ajoute une colonne de plus, elle aura pour indice 'maxetats'.
  42.      */
  43.     t_etats tab_etat[maxetats+1]; tab_etat[maxetats]=NULL;
  44.
  45.     for(j=0;j<maxetats;j++){
  46.  
  47.   /* On compte la taille en caracteres de chaque etat.
  48.    * strlen(mot)-2 pour éviter de prendre le dernier caractère de la chaine # et le marqueur de fin : '\0'.
  49.    */                   
  50.    while(etats[i]!=' ' && i<strlen(etats)-2){
  51.          i++;             
  52.                taille_nom_etat++;                                                                   
  53.     }
  54.     printf("taille du nom de l'etat = %d\n",taille_nom_etat);
  55.     //size_t n = taille_nom_etat;
  56.     /*
  57.      * Pour chaque état, on alloue une zone mémoire de taille variable qui contiendra son nom (chaine de caractère qui le
  58.      * représente). Ceci, en partant du principe que les noms (des états) i.e les chaines de caractère sont de tailles différentes.
  59.      *
  60.      * Si  par exemple, nous avons les états : 'etat1' 'etat2', 'e3', 'q4', 'eta5'
  61.      * On allouera :
  62.      * Une zone mémoire de 5 caractères pour chacun des états 1 et 2.  
  63.      * Une zone de 2 caractères pour chacun des états 3 et 4 et
  64.             * Une zone de 4 caractères pour l'état 5.
  65.      * tab_etat est un tableau de pointeurs sur ces caractères. Donc,
  66.      * tab_etat[0] pointera sur l'état 1 et donc sur la chaîne : 'etat1'
  67.      * tab_etat[1] pointera sur l'état 2 et donc sur la chaîne : 'etat2'
  68.      * tab_etat[2] pointera sur l'état 3 et donc sur la chaîne : 'e2'
  69.      * tab_etat[3] pointera sur l'état 4 et donc sur la chaîne : 'q4'
  70.      * tab_etat[4] pointera sur l'état 5 et donc sur la chaîne : 'eta5'
  71.      */
  72.      tab_etat[j] = malloc(sizeof(char)*taille_nom_etat);
  73.      if(tab_etat[j]==NULL){
  74.          printf("\n Allocation Impossible \n" );
  75.          exit(EXIT_FAILURE);
  76.      }
  77.      //printf("i = %d\n",i);
  78.      int temp; temp = taille_nom_etat; int taille; taille = strlen(etats)-2;
  79.      if(i <= taille){
  80.           for(t=0;t<taille_nom_etat;t++){
  81.                tab_etat[j][t]=etats[i-temp];
  82.                temp--;
  83.           }
  84.       }
  85.       i++;
  86.       taille_nom_etat=0;             
  87.      }             
  88.                          
  89.      printf("Les etats sont : \n" );
  90.      for(j=0;j<maxetats;j++){
  91.           printf("%s\n",tab_etat[j]); 
  92.      }
  93.      //system("PAUSE" );
  94.      printf("\n" );
  95.      etats_ret = tab_etat;
  96.      return etats_ret;
  97. }
  98. // Fin de la fonction rechercher_etats

J'ai utilisé gdb et valgrind pour essayer de débugger, mais j'ai pas compris grande chose au rapport de valgrind. gdb quant à lui m'a juste indiqué qu'il y a avait "erreur de segmentation (core dumped) SIG-quelquechose, je sais plus-"

Merci d'avance,

AR

Dernière modification par AigleRoyal33 (Le 09/11/2008, à 13:30)

Hors ligne

#15 Le 20/01/2014, à 15:19

Fztheman

Re : Pb en C: Erreur de segmentation (core dumped)

J'ai moi même mon petit problème lors ce que je veut creer une fonction de chargement d'une partie d'Othello (Projet d'IUT).

int chargementPartie(struct partie **p) 
{ 
    struct partie tp; 
    int i=0; 
    FILE *fich; 
    fich=fopen("sauvegarde.txt", "rt"); 
    if(fich==NULL) 
    { 
        return 0; 
    } 
    int* valeur; 
    fscanf(fich,"%d\n",valeur); 
    tp.premierJoueurJoue = *valeur; 
    while(!feof(fich)) 
    { 
        fscanf(fich,"%d\n",valeur); 
        tp.damier[i] = *valeur; 
        i++; 
    } 
    fclose(fich); 
    p = &tp; 
    return 1; 
}

Or ma fonction de sauvegarde marche très bien :

int sauvegardePartie(struct partie *p) 
{ 
    int i; 
    FILE *fich; 
    fich=fopen("sauvegarde.txt", "wt"); 
    if(fich==NULL) 
    { 
        return 0; 
    } 
    fprintf(fich,"%d\n",p->premierJoueurJoue); // La première ligne correspond au joueur actuel. 
    for (i=0;i<NB_CASES;i++) 
    { 
        fprintf(fich,"%d\n",p->damier[i]); // Les ligne suivante correspondent au différentes cases du damier. 
    } 
    fclose(fich); 
    return 1; 
} 

J'ai exactement la même erreur que Stereotype.. Si vous pouviez m'aider, merci d'avance..

Dernière modification par Fztheman (Le 20/01/2014, à 15:22)

Hors ligne

#16 Le 20/01/2014, à 15:55

Braun

Re : Pb en C: Erreur de segmentation (core dumped)

Bonjour,
Avant tout tu pourrais localiser la difficulté en rajoutant dans la boucle une ligne affichant à l'écran le nombre "i" et l'entier "valeur" ou "*valeur" lu.
Ensuite tu pourras rechercher une tentative de dépasser la fin du fichier ou la dimension du tableau.

Hors ligne

#17 Le 20/01/2014, à 17:01

Fztheman

Re : Pb en C: Erreur de segmentation (core dumped)

J'ai essayé de mettre des traces, je l'ai est enlevé dans la version que je vous ai donné pour plus de lisibilité mais ça ne l'est affiche pas, j'en avais mis avant et après les fscanf et une après l'ouverture.

Hors ligne

#18 Le 20/01/2014, à 17:59

Braun

Re : Pb en C: Erreur de segmentation (core dumped)

D'accord, mais ce qui m'intéresserait c'est justement ce que donnent ces traces, curiosité mal placée probablement.

Hors ligne

#19 Le 20/01/2014, à 18:30

pingouinux

Re : Pb en C: Erreur de segmentation (core dumped)

Fztheman #15 a écrit :
    int* valeur; 
    fscanf(fich,"%d\n",valeur); 
    tp.premierJoueurJoue = *valeur; 

Il y a déjà ceci : valeur est un pointeur sur un entier, mais l'entier n'est pas alloué.

Hors ligne