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 (core dumped)


Sujet :

C

  1. #1
    Battosaiii
    Invité(e)
    Par défaut Segmentation fault (core dumped)
    J'ai lu le post precedent mais dans mon cas j;ai initialiser le fichier.
    Voila des bouts de mon prog :

    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
     
     
    int main(int argc, char *argv[])
    {
      sequence *seq;       /* pointer to input sequence data structure  */
      image    **imgs;     /* pointer to input sequence array of images */
      image    *out;       /* pointer the output image */
     
      char  seq_in[100],  /* input sequence name */
            seq_out[100], /* output sequence name */
            file_out[100], /* output file name */
    	    file_in[100]; /*input image to read*/
     
      int length;         /* length of the sequence */
      int i=0;              /* loop index */
     
      /* Process input arguments */
      if(argc != 3)
        {
          fprintf(stderr,"Usage: %s [input PGM sequence name] [output PGM sequence name]\n", argv[0]);
          exit(0);
        }
      else
        {
          strcpy(seq_in, argv[1]);
          strcpy(seq_out, argv[2]);
        }
     
      /* Load the input sequence */
      seq = load_sequence(seq_in);
     
      /* Get a pointer to the sequence images */
      imgs = get_sequence_images(seq);
     
      /* Get sequence length */
      length = get_sequence_length(seq);
     
      /* Check if sequence is long enough */
      if(length < 2) {
        fprintf(stderr, "sequence is too short\n");
        exit(1)
    pgm_read_image("mad000.pgm",imgs[0]);
    out = clone_image(imgs[0]);
    //
     while(i!=length-1)
      {
    /*read the n image */ 
    double x;
    sprintf(file_in, "%s%03d.pgm", seq_in, i);
    pgm_read_image(file_in,imgs[i]);
     
    /*Idiff=In-In-1 */
     
    create_diff_image(imgs[i],imgs[i+1],out);
    x=calc_entropy_image(out,1);
    printf(" entropy value : %lg ",x);	  
      i++;
    imgs[i-1]=imgs[i];
        /* Now write out the diff image */
       /*sprintf(file_out, "%s%03d.pgm", seq_out, i);
        printf("Writing out %s\n",file_out);
       pgm_write_image(out, file_out);
    */
    printf("diff a la %d eme valeur\n",i);
      }
    je sais que l'erreur vient de x=calc_entropy_image(out,1); . En effet si j'enleve cette fonction le programme marche .

    voici le prog de 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    ouble calc_entropy_image(image *img, int minus)
    {
      double *prob, entropy;
     
      pel *pdat;
     
      int p;
     
      pdat = get_image_pels(img);
     
      if(minus)
        {
          prob = (double *)calloc(512,sizeof(double));
     
          for(p=0;p<get_image_width(img)*get_image_height(img);p++)
    	prob[pdat[p]+256]++;
     
          for(p=0;p<512;p++)
    	prob[p] = prob[p]/(get_image_width(img)*get_image_height(img));
     
          entropy = 0.0;
          for(p=0;p<512;p++)
    	if(prob[p] != 0.0)
    	  entropy += -prob[p] * log2(prob[p]);
    //	printf("test into calc_entropy_image ");
        }
      else
        {
          prob = (double *)calloc(256,sizeof(double));
     
          for(p=0;p<get_image_width(img)*get_image_height(img);p++)
    	prob[pdat[p]]++;
     
          for(p=0;p<256;p++)
    	prob[p] = prob[p]/(get_image_width(img)*get_image_height(img));
     
          entropy = 0.0;
          for(p=0;p<256;p++)
    	if(prob[p] != 0.0)
    	  entropy += -prob[p] * log2(prob[p]);
        }  
    //printf("test into calc_entropy_image ");
     free(prob);
    //printf("test into calc_entropy_image\n ");
     return(entropy);
    }

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    As tu essayé au debugger?

    Astuce du jour :
    Sous Linux (ou Cygwin) ouvrir un .c avec vi (vi main.c).
    Appuyer sur Echap et taper : 1G=G
    Et hop auto-indentation du code.

  3. #3
    Battosaiii
    Invité(e)
    Par défaut
    J'ai localise le probleme dans le code plus precisement :

    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
     
    out = clone_image(imgs[0]);
      while(i!=length-1)
      {
    /*read the n image */ 
    double x;
    sprintf(file_in, "%s%03d.pgm", seq_in, i);
    pgm_read_image(file_in,imgs[i]);
     
    /*Idiff=In-In-1 */
     
    create_diff_image(imgs[i],imgs[i+1],out);
    //x=calc_entropy_image(out,1);
    //printf(" entropy value : %lg ",x);	  
      i++;
    imgs[i-1]=imgs[i];
        /* Now write out the diff image */
       /*sprintf(file_out, "%s%03d.pgm", seq_out, i);
        printf("Writing out %s\n",file_out);
       pgm_write_image(out, file_out);
    */
    printf("diff a la %d eme valeur\n",i);
      }
    est ce permis de faire

    imgs[i-1]=imgs[i];
    sachant que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct ee554_image
    {
      int width;
      int height;
      pel *pels; 
    };
    voici la reponse :
    diff a la 38 eme valeur
    diff a la 39 eme valeur
    diff a la 40 eme valeur
    diff a la 41 eme valeur
    diff a la 42 eme valeur
    diff a la 43 eme valeur
    diff a la 44 eme valeur
    diff a la 45 eme valeur
    diff a la 46 eme valeur
    diff a la 47 eme valeur
    diff a la 48 eme valeur
    diff a la 49 eme valeur
    Aborted (core dumped)
    en effet quand je supprime l'eaglite :
    imgs[i-1]=imgs[i];
    le code ne bug pas. Que veux dire Core dumped ?
    J'espere que je me suis montre plus clair .

  4. #4
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    Que veux dire Core dumped
    lecture/ecriture dans une zone mémoire non autorisée. Dans ton cas, ca doit etre un dépassement de tableau

  5. #5
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Pas tout à fait si je puis me permettre:
    Le core dump n'est pas la cause mais un effet, lors d'une exception grave (comme là) renvoyé par le processeur le système d'exploitation faire un "core dump" c'est à dire qu'il va faire une copie au moment de l'erreur de la mémoire et des registres de la machine.
    De cette facon tu peux utiliser un debugger sur le core (gdb au hasard) pour voir l'état des variables au moment du crash.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la drogue c'est mal
    Que veux dire Core dumped
    lecture/ecriture dans une zone mémoire non autorisée. Dans ton cas, ca doit etre un dépassement de tableau
    Non. Tu confonds avec Segmentation fault.

    Ca veut dire le core, c'est à dire la mémoire du processus en cours a été dumped, littéralement 'jetée'. En fait, elle a été recopiée dans un fichier texte qui est lisible pour analyse.

    Il peut y avoir de nombreuses causes. En tout cas, c'est certainement suite à un bug dans programme...

  7. #7
    Battosaiii
    Invité(e)
    Par défaut
    J'ai beau tester pleins de trucs je comprends pas. Je vais telecharger gdb. En attendant : je trouve rien.

    au moment de liberer la memoire il bug.

    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
     
     
     i=0;
      image *z;
      //for(i = 0; i < length - 1; i++) {
    	  while(i!=length-1){
    	  /* Compute the mean between the current picture and the next one */
        mean_image(imgs[i], imgs[i+1], out);
     
        /* Now write out the output image */
        sprintf(file_out, "%s%03d.pgm", seq_out, i);
        printf("Writing out %s\n",file_out);
        pgm_write_image(out, file_out);
    i++;
    if(i!=length-1){
    z==imgs[i];
    imgs[i-1]=z;
     
    }
      }
     
      /* We must deallocate the memory the sequence and for the image before */
      /* we finish */
      free_image(out);
      //printf("test debug \n");
      free_sequence(seq);
    Il bug dans l'instruction free_sequence. Mais quand je mets des printf dans cette fonction il ne les affiche pas , meme celles qui sont au debut. Le bug est indubitablemet du a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    z==imgs[i];
    imgs[i-1]=z;
    Je ne comprend pas pourquoi j'ai pas le droit de faire ca ??

    la definition d'une sequence est :

    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
     
    typedef int pel;
    typedef float block_t[8][8];
    typedef int mblock_t[16][16];
     
    struct ee554_image
    {
      int width;
      int height;
      pel *pels; 
    };
    typedef struct ee554_image image;
     
    struct ee554_sequence 
    {
      int length;
      image *images[1000]; 
    };
    typedef struct ee554_sequence sequence;
    Je suis totalement bloque je COMPORENDS pas ????

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    J'imagine que tu souhaites faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    z = imgs[i];
    imgs[i-1] = z;
    et non pas ==.

  9. #9
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Mieux que gdb télécharge eclipse et son plugin CDT.
    Tu pourra faire du debug step by step (d'accord c'est possible avec gdb mais moi lisible) . Bon naturellement il te faut une console X-windows.

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Battosaiii
    J'ai beau tester pleins de trucs je comprends pas. Je vais telecharger gdb. En attendant : je trouve rien.

    au moment de liberer la memoire il bug.
    C'est probablement suite à un problème précédant. Le gestionnaire de mémoire est corrompu (débordement de tableau etc.).

    Poste une version reduite au minimum mais complète et compilable qui montre le défaut.

  11. #11
    Battosaiii
    Invité(e)
    Par défaut
    L'erreur venait bien de imgs[i-1]-inags[i]. Pour resoudre le probleme j'ai creer une fonction qui fait l'egalisation de chaque pixel de l'image en parcourant les block de pixels 8*8.
    Plus de bug ! Je sais toujours pas pourquoi il veut pas egaliser 2 images mais bon ...

  12. #12
    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
    je n'arrive pas à voir où tu as créé le tableau imgs, je vois juste la création d'un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     image    **imgs;     /* pointer to input sequence array of images */

  13. #13
    Battosaiii
    Invité(e)
    Par défaut
    imgs = get_sequence_images(seq);
    C'est la dedans qu'est creer le tableau d'images.

  14. #14
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imgs = get_sequence_images(seq);
    Ok, Je ne l'avais pas repéré. Il serait interressant de voir le code de get_sequence_images

Discussions similaires

  1. Segmentation Fault / Core Dumped
    Par alvanoto dans le forum Débuter
    Réponses: 7
    Dernier message: 06/01/2010, 21h01
  2. segmentation fault (core dumped)
    Par domdom974 dans le forum Fortran
    Réponses: 2
    Dernier message: 04/08/2009, 09h07
  3. [ASE 15.0.3] Segmentation Fault - core dumped
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 0
    Dernier message: 04/06/2009, 10h55
  4. segmentation fault (core dumped)
    Par miamiam dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2008, 11h46
  5. Réponses: 1
    Dernier message: 10/12/2006, 21h37

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