Erreur de segmentation incompréhensible - C - Programmation
Marsh Posté le 09-03-2006 à 19:04:24
On comprendra peut-être mieux quand tu auras posté ton code !
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 ?
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
Marsh Posté le 09-03-2006 à 19:12:42
ca doit pas etre joli joli
A mon avis y'a des cradoteries, fodrait voir le code
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
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é
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
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;
}
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 ?
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
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
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
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 )
Marsh Posté le 09-03-2006 à 20:09:02
montre les quand meme mais sinon bon, ton code est pas tres joli hein ?
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.
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
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...
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.
D'où la nécessité d'écrire du code propre et le plus blindé possible.
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.
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.
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é ?
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à. |
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é
Marsh Posté le 09-03-2006 à 20:20:48
Comment veux-tu qu'on sache ?
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)
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.
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.
Marsh Posté le 10-03-2006 à 08:55:05
tu devrais plutôt mettre
Code :
|
Et il faut toujours tester la valeur de retour de malloc
Marsh Posté le 10-03-2006 à 08:58:09
franceso a écrit : |
comment on fait ? (on ne se moque pas plz )
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 :
|
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