Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2688 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation incompréhensible

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de segmentation incompréhensible

n°1322082
Profil sup​primé
Posté le 09-03-2006 à 18:55:31  answer
 

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

mood
Publicité
Posté le 09-03-2006 à 18:55:31  profilanswer
 

n°1322090
Trap D
Posté le 09-03-2006 à 19:04:24  profilanswer
 

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

n°1322092
Profil sup​primé
Posté le 09-03-2006 à 19:06:23  answer
 

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 ?

n°1322094
Profil sup​primé
Posté le 09-03-2006 à 19:10:36  answer
 

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 :??:

n°1322097
chrisbk
-
Posté le 09-03-2006 à 19:12:42  profilanswer
 

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

n°1322099
Profil sup​primé
Posté le 09-03-2006 à 19:15:49  answer
 

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 :/

n°1322111
Profil sup​primé
Posté le 09-03-2006 à 19:37:31  answer
 

personne ? :o

n°1322116
chrisbk
-
Posté le 09-03-2006 à 19:46:51  profilanswer
 

méskoica ? [:lacuna coil]

n°1322118
chrisbk
-
Posté le 09-03-2006 à 19:48:06  profilanswer
 

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é

n°1322119
Profil sup​primé
Posté le 09-03-2006 à 19:51:19  answer
 

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

mood
Publicité
Posté le 09-03-2006 à 19:51:19  profilanswer
 

n°1322120
Profil sup​primé
Posté le 09-03-2006 à 19:51:59  answer
 

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;
}

n°1322121
Profil sup​primé
Posté le 09-03-2006 à 19:52:13  answer
 

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

n°1322123
chrisbk
-
Posté le 09-03-2006 à 19:58:28  profilanswer
 

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

n°1322125
Profil sup​primé
Posté le 09-03-2006 à 20:00:25  answer
 

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

n°1322126
chrisbk
-
Posté le 09-03-2006 à 20:02:24  profilanswer
 

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

n°1322127
Profil sup​primé
Posté le 09-03-2006 à 20:04:06  answer
 

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

n°1322128
Profil sup​primé
Posté le 09-03-2006 à 20:04:49  answer
 

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

n°1322130
chrisbk
-
Posté le 09-03-2006 à 20:09:02  profilanswer
 

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

n°1322131
Elmoricq
Modérateur
Posté le 09-03-2006 à 20:09:57  profilanswer
 

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]

n°1322133
Profil sup​primé
Posté le 09-03-2006 à 20:12:30  answer
 

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:

n°1322134
chrisbk
-
Posté le 09-03-2006 à 20:13:01  profilanswer
 

ca nous aide pas des masses [:el g]

n°1322135
Profil sup​primé
Posté le 09-03-2006 à 20:13:13  answer
 

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...

n°1322137
Elmoricq
Modérateur
Posté le 09-03-2006 à 20:15:39  profilanswer
 


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]

n°1322138
el muchach​o
Comfortably Numb
Posté le 09-03-2006 à 20:16:35  profilanswer
 

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
n°1322139
Elmoricq
Modérateur
Posté le 09-03-2006 à 20:16:47  profilanswer
 

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.

n°1322140
Profil sup​primé
Posté le 09-03-2006 à 20:17:29  answer
 

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

n°1322141
Profil sup​primé
Posté le 09-03-2006 à 20:18:25  answer
 

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é

n°1322145
Elmoricq
Modérateur
Posté le 09-03-2006 à 20:20:48  profilanswer
 


 
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
n°1322146
el muchach​o
Comfortably Numb
Posté le 09-03-2006 à 20:22:13  profilanswer
 


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
n°1322148
Profil sup​primé
Posté le 09-03-2006 à 20:27:51  answer
 

bon je vais essayer
 
merci de votre aide

n°1322153
chrisbk
-
Posté le 09-03-2006 à 20:35:20  profilanswer
 

el muchacho a écrit :


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


 
NO §§§

n°1322155
el muchach​o
Comfortably Numb
Posté le 09-03-2006 à 20:38:25  profilanswer
 

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
n°1322474
franceso
Posté le 10-03-2006 à 08:55:05  profilanswer
 


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
n°1322475
Profil sup​primé
Posté le 10-03-2006 à 08:57:37  answer
 

t'es sur? c'est possible :o
 

n°1322477
Profil sup​primé
Posté le 10-03-2006 à 08:58:09  answer
 

franceso a écrit :


Et il faut toujours tester la valeur de retour de malloc


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

n°1322489
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-03-2006 à 09:17:11  profilanswer
 


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/
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation incompréhensible

 

Sujets relatifs
erreur de téléchargement de fichiererreur dans le TITRE
Segmentation image cellulaire (microscopie)erreur integer
erreur avec getselectedindex[PHP] erreur introuvable (résolu)
[resolu] erreur WARNING[resolu] problème requete erreur de syntaxe du a des quotes...
Declencher une erreur 404 ?Script vbs Erreur 800A0046 Permission denied
Plus de sujets relatifs à : Erreur de segmentation incompréhensible


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR