Erreur de segmentation incompréhensible

Erreur de segmentation incompréhensible - C - Programmation

Marsh Posté le 09-03-2006 à 18:55:31    

alorzs voilà lors d'un programme en C , je déclare un tableau
 
puis je le passe en argumpent d' une fonction ou j'affecte les différents éléments du tableau
 
une fois le programme sorti de la fonction, j'essai d'avoir acces aux éléments du tableau
 
ca passe a la compilation mais a l'exécution il me sort un segmentation fault meme quand je modifie le programme et que j'essaie d'accéder uniquement au premier élément du tableau!!
 
j'ai jamais vu ça, je comprends vraiment pas pourquoi
 
merci d'avance

Reply

Marsh Posté le 09-03-2006 à 18:55:31   

Reply

Marsh Posté le 09-03-2006 à 19:04:24    

On comprendra peut-être mieux quand tu auras posté ton code !

Reply

Marsh Posté le 09-03-2006 à 19:06:23    

bin c'est un gros bordel
 
ya des fonctions un peu dans tous les sens ^^
 
et c'est sur plusieurs fichiers :(
 
vous avez pas une idée d'ou ca peut venir ?

Reply

Marsh Posté le 09-03-2006 à 19:10:36    

en fait si je fais un main a la fin du fichier ou le sf se produit et que j'appelle les fonctions -> aucun probleme
 
si j'appelle ces fonctions a partir d'un autre fichier
-> ca merde
 
j'y comprends vraiment rien, un sf alors qu' on accede au premier élément d'un tableau :??:

Reply

Marsh Posté le 09-03-2006 à 19:12:42    

ca doit pas etre joli joli [:el g]
 
A mon avis y'a des cradoteries, fodrait voir le code

Reply

Marsh Posté le 09-03-2006 à 19:15:49    

bon un exemple :  
 
struct image
{
 int ** image;
 int size;
}
 
 
int main(void)
{
  int nb_symbole;
 
  int * vecteur_image;
   
  struct poids pds[513];
  struct image * img;
 
  int vect[100000];
   
  img = (struct image *) malloc(sizeof(struct image));
 
  img = load_image(img);
   
 
  vecteur_image = (int *) malloc((img->size*img->size)*sizeof(int));
  vecteur_image = MatToVec(img->image, img->size, img->size, vecteur_image);
 
 
...
je mets pas la fin
}
 
la fonction mattovect est ici :
 
int* MatToVec(int **matrice, int width, int height, int *vecteur)
{
  int i,j;
   
  vecteur = (int*) malloc((width*height)*sizeof(int));
   
  for(i=0 ; i<height ; i++)
    {
      for(j=0 ; j<width ; j++)
 {
   vecteur[i*width + j] = matrice[i][j];
 }
    }
  return vecteur;
}
 
ébé si je demande *vecteur_image, j'ai un sf :/

Reply

Marsh Posté le 09-03-2006 à 19:37:31    

personne ? :o

Reply

Marsh Posté le 09-03-2006 à 19:46:51    

méskoica ? [:lacuna coil]

Reply

Marsh Posté le 09-03-2006 à 19:48:06    

jpige rien, c'est quoi ce bins ? pourquoi tu fais du malloc pour tout de suite ecraser le contenu ? a priori ta fonction loadImage doit renvoyer un truc mal fagotté

Reply

Marsh Posté le 09-03-2006 à 19:51:19    

oui effectivement petite erreur ya deux mallocs de suite m'enfin c'est pas grave ça
 
je vais chercher ma fonction loadimage

Reply

Marsh Posté le 09-03-2006 à 19:51:19   

Reply

Marsh Posté le 09-03-2006 à 19:51:59    

struct image* load_image(struct image *img)
{
  char * file_name;
  FILE * raw;
  int i, j;
  unsigned char c;
   
  printf("Please enter the name of the .raw file to open (should be less than 30 caracters) : " );
   
  do
    {
      file_name = (char *) malloc(30*sizeof(char));
      scanf("%s",file_name);
      printf("\n" );
       
      if ( (raw = fopen ( file_name, "r" )) == NULL)
 {
   printf("\nthe file %s is not in the directory\n",file_name);
   printf("Try again : " );
   free(file_name);
 }
    }
  while (raw == NULL);
   
   
  printf("\nPlease enter the size of the image (16 for a 16x16 image for example) : " );
  fflush(stdin);
  scanf("%d",&(img->size));
   
  img->image = (int**) malloc(img->size*sizeof(int));
   
  for(i=0 ; i<img->size ; i++)
    {
      img->image[i] = (int *) malloc (img->size*sizeof(int));
      for(j=0 ; j<img->size ; j++)
 {
   fread(&c,1,1,raw);
   img->image[i][j] = (int)(c);
 }
    }
   
  fclose(raw);
   
  free(file_name);
   
  return img;
}

Reply

Marsh Posté le 09-03-2006 à 19:52:13    

j'avais prévenu c'est long :o

Reply

Marsh Posté le 09-03-2006 à 19:58:28    

bin c'est surtout archi mal codé, meme si a premiere vue je vois pas de SF. Ca plante a quel endroit ?

Reply

Marsh Posté le 09-03-2006 à 20:00:25    

bin juste apres le mattovec si je lui demande d'avoir acces a *vecteur_image
 
mais au debut ca plantait pas et apres ca s'est mis a planter..^^
 
mais j'en ai eu une autre dans le meme genre
 
j'y comrpends rien quoi

Reply

Marsh Posté le 09-03-2006 à 20:02:24    

t'es sur de ton coup ? (vis a vis du lieu d'erreur ?) montre les qq lignes suivant stp

Reply

Marsh Posté le 09-03-2006 à 20:04:06    

bah wé
 
je demandais d'afficher deux choses en meme temps
 
un entier quelconque a qui je donnais une valeur bidon au début et *vecteur_image
 
si je mettais l'entier tout seul y s'affichait, si je demandais d'afficher les deeux ca plantait
 
crois moi j'y comrpends rien

Reply

Marsh Posté le 09-03-2006 à 20:04:49    

c'est pas la peine les qqs lignes suivantes c'est d'uatres fonctions, le printf je l'avis rajouté pour trouver ce qui plantait (ca plantait plus loin dans le programme sinon ) :o

Reply

Marsh Posté le 09-03-2006 à 20:09:02    

montre les quand meme [:el g] mais sinon bon, ton code est pas tres joli hein ? :d

Reply

Marsh Posté le 09-03-2006 à 20:09:57    

Je vois des fflush(stdin), des malloc() au retour pas testé, de belles boucles des familles et des scanf() mal utilisés, le tout en moins de 20 secondes.
 
Si tout le reste du programme est comme ça, la cause du segfault va être difficile à localiser. [:dawa]

Reply

Marsh Posté le 09-03-2006 à 20:12:30    

en fait je vous explique
 
on est deux a travailler sur un projet
 
séparément nos deux codes fonctionnent correctement
 
mais des qu'on essaie de els utiliser ensemble ca marche plus
 
:cry:

Reply

Marsh Posté le 09-03-2006 à 20:13:01    

ca nous aide pas des masses [:el g]

Reply

Marsh Posté le 09-03-2006 à 20:13:13    

en fait c'est un algorithme de compression d'image : encore plus étonnant
 
avec une image on a un segfault
 
avec une autre pas de pb...

Reply

Marsh Posté le 09-03-2006 à 20:15:39    


Alors : le principe de la mauvaise gestion mémoire, c'est que c'est la roulette russe.
 
C'est pas parce que ça fonctionne que le code est correct, par définition le comportement est aléatoire.
 
Un coup ça fonctionne... un coup ça fait des trucs bizarres mais ça plante pas... un coup ça segfault.
 
Et ça peut se produire dans une partie du code qui n'a rien à voir avec le problème mémoire en lui-même. [:dawa]
 
D'où la nécessité d'écrire du code propre et le plus blindé possible. [:petrus75]

Reply

Marsh Posté le 09-03-2006 à 20:16:35    

Remplace tous tes malloc par des calloc et initialise tes variables et pointeurs, ça va déjà enlever une bonne part d'aléatoire dans tes résultats. Ca ne voudra pas dire que ton programme est correct, mais ça peut aider à déboguer, déjà.
Ensuite, dans VectoMat, je mettrais plutôt un truc du genre:
*(vecteur++) = *(matrice++)
Ca évite la prise de tête et accessoirement, c'est plus rapide.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 09-03-2006 à 20:16:47    

Là, comme ça, avec les deux snipets que tu nous as livré, je vois rien d'autre que de se plonger dans un bon bouquin en C, et de tout réécrire.
 
Ou tout du moins passer pas mal de temps à remodeler tout ça.

Reply

Marsh Posté le 09-03-2006 à 20:17:29    

wai mais comment ca se fait que prises séparément nos fonctions marchent alors qu'ensemble ca merde ?
 
deuzio : comment on écrit du code propre et blindé ?:o

Reply

Marsh Posté le 09-03-2006 à 20:18:25    

el muchacho a écrit :

Remplace tous tes malloc par des calloc et initialise tes variables et pointeurs, ça va déjà enlever une bonne part d'aléatoire dans tes résultats. Ca ne voudra pas dire que ton programme est correct, mais ça peut aider à déboguer, déjà.
Ensuite, dans VectoMat, je mettrais plutôt un truc du genre:
*(vecteur++) = *(matrice++)
Ca évite la prise de tête et accessoirement, c'est plus rapide.


 
ah non apres ca fou le bordel, le pointeur pointe plus au meme endroit alors qu'avec la notation tableau ca change pas le premier élément pointé

Reply

Marsh Posté le 09-03-2006 à 20:20:48    


 
Comment veux-tu qu'on sache ? [:spamafote]
Là, à vue de nez, c'est impossible de te dire pourquoi.
 
 
 
 
En testant les codes retours, en pensant une gestion d'erreurs, en passant son programme au debugger ou mieux dans l'outil ad hoc pour repérer les problèmes de gestion mémoire (parce que faut pas rêver, même le programmeur le plus consciencieux du monde fait des bourdes), et aussi en prévoyant une batterie de tests (phase de recette technique, dans un monde idéal en tout cas).
 
Ca passe aussi par la phase "se renseigner sur les fonctions potentiellement dangereuses, et comment bien les utiliser" (ex : *alloc, *scanf, str*, etc)


Message édité par Elmoricq le 09-03-2006 à 20:22:58
Reply

Marsh Posté le 09-03-2006 à 20:22:13    


Ben écoute, si tu ne maîtrises pas exactement ce que tu fais, c'est pas la peine.
Le comportement est aléatoire, parce que tu t'es planté, c'est tout. Tes pointeurs tapent aléatoirement en mémoire, donc tu y vas au débugger avec des tableaux 5x5 jusqu'à voir où ça merde.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 09-03-2006 à 20:27:51    

bon je vais essayer
 
merci de votre aide

Reply

Marsh Posté le 09-03-2006 à 20:35:20    

el muchacho a écrit :


*(vecteur++) = *(matrice++)


 
NO §§§

Reply

Marsh Posté le 09-03-2006 à 20:38:25    

Oui effectivement, ça ne peut pas marcher du tout. C'est complètement con, ce que j'ai écrit.
 
Je vais au piquet. :ange:


Message édité par el muchacho le 09-03-2006 à 20:39:32

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 10-03-2006 à 08:55:05    


tu devrais plutôt mettre

Code :
  1. img->image = (int**) malloc(img->size*sizeof(int*));


 
Et il faut toujours tester la valeur de retour de malloc

Message cité 1 fois
Message édité par franceso le 10-03-2006 à 08:55:56
Reply

Marsh Posté le 10-03-2006 à 08:57:37    

t'es sur? c'est possible :o
 

Reply

Marsh Posté le 10-03-2006 à 08:58:09    

franceso a écrit :


Et il faut toujours tester la valeur de retour de malloc


 
comment on fait ? (on ne se moque pas plz :p )

Reply

Marsh Posté le 10-03-2006 à 09:17:11    


Tu peux lire tout ça.
 
http://mapage.noos.fr/emdel/notes.htm
 
Pose des questions si tu ne comprends pas.

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct image
  5. {
  6.    int ** image;
  7.    int size;
  8. };
  9. static void clean (char *s)
  10. {
  11.    char *p = strchr (s, '\n');
  12.    if (p != NULL)
  13.    {
  14.       *p = 0;
  15.    }
  16.    else
  17.    {
  18.       int c;
  19.       while ((c = getchar()) != '\n' && c != EOF)
  20.       {
  21.       }
  22.    }
  23. }
  24. static void load_image(struct image *img)
  25. {
  26.    FILE * raw;
  27.    {
  28.       char file_name[30];
  29.       printf("Please enter the name of the .raw file to open\n"
  30.              " (should be less than 30 caracters) : " );
  31.       fflush (stdout);
  32.       do
  33.       {
  34.          fgets(file_name, sizeof file_name, stdin);
  35.          clean(file_name);
  36.          if (*file_name != 0)
  37.          {
  38.             raw = fopen ( file_name, "rb" );
  39.             if ( raw == NULL)
  40.             {
  41.                printf("\nthe file %s is not in the directory\n", file_name);
  42.                printf("Try again : or <enter> to quit" );
  43.             }
  44.          }
  45.          else
  46.          {
  47.             break;
  48.          }
  49.       }
  50.       while (raw == NULL)
  51.          ;
  52.    }
  53.    if (raw != NULL)
  54.    {
  55.       {
  56.          char *p_end;
  57.          do
  58.          {
  59.             char line[16];
  60.             printf("\nPlease enter the size of the image\n"
  61.                    " (16 for a 16x16 image for example) : " );
  62.             fflush (stdout);
  63.             fgets(line, sizeof line, stdin);
  64.             clean(line);
  65.             img->size = strtoul(line, &p_end, 10);
  66.             if (*p_end != 0)
  67.             {
  68.                printf ("input error\n" );
  69.             }
  70.          }
  71.          while (*p_end != 0)
  72.             ;
  73.       }
  74.       if (img->size != 0)
  75.       {
  76.          img->image = malloc(img->size * sizeof * img->image);
  77.          if (img->image != NULL)
  78.          {
  79.             int i;
  80.             int c = EOF + 1;
  81.             for (i = 0 ; i < img->size && c != EOF; i++)
  82.             {
  83.                img->image[i] = malloc (img->size * sizeof * img->image[i]);
  84.                if (img->image[i] != NULL)
  85.                {
  86.                   int j;
  87.                   for (j = 0 ; j < img->size && c != EOF; j++)
  88.                   {
  89.                      c = fgetc(raw);
  90.                      if (c != EOF)
  91.                      {
  92.                         img->image[i][j] = c;
  93.                      }
  94.                   }
  95.                }
  96.                else
  97.                {
  98.                   printf ("memory error\n" );
  99.                   break;
  100.                }
  101.             }
  102.          }
  103.          else
  104.          {
  105.             printf ("memory error\n" );
  106.          }
  107.       }
  108.       fclose(raw);
  109.    }
  110. }
  111. static void dump_image(struct image const *img)
  112. {
  113.    /* to be completed */
  114. }
  115. static void delete_image(struct image *img)
  116. {
  117.    /* to be completed */
  118. }
  119. int main (void)
  120. {
  121.    struct image img;
  122.    load_image(&img);
  123.    dump_image (&img);
  124.    delete_image (&img);
  125.    return 0;
  126. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed