simomiso
Messages postés3Date d'inscriptionjeudi 2 juillet 2009StatutMembreDernière intervention 3 juillet 2009
-
2 juil. 2009 à 17:46
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 2011
-
5 juil. 2009 à 21:51
Bonjour,
tout d'abords un GRAND MERCI a tous ceux ki ont participé ds la conception de ce site.
En fait j'ai un proble avec un filtre image avec matrice 5*5, ca compile mais quand je le lance il bloque et note: SEGUEMENTATION FAULT? voici une partie du code:
dans image.c///////////////
ImagePtr Filtre5(ImagePtr I1 , double ** M)
{
int i,j;
double k;
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 2 juil. 2009 à 18:59
Bonjour,
Si tu utilises un debugger, il pourra te dire précisément quelle instruction provoque l'erreur...
Comment le tableau Pixel est-il défini ?
Je pense que lorsque i == Hauteur - 2 (dernier passage dans la boucle), les accès à Pixel[i+2] sont hors du tableau.
Cela dit, il y a des problèmes ailleurs.
double **M;
Cela déclare un pointeur vers un pointeur vers un double, pas de problème.
M=(double**)malloc(sizeof(double*));
Ici on alloue de quoi stocker UN pointeur vers un double. Ce n'est vraisemblablement pas assez.
Corrigeons par exemple en allouant de quoi stocker 25 doubles:
M = malloc(sizeof(double) * 25);
M pointe donc vers un endroit dans la mémoire où l'on peut stocker 25 doubles contigus. Est-ce ce que l'on veut ?
Si oui, M devrait être de type double*.
Si non, on peut écrire (mais je te le déconseille dans ton cas):
#define LIGNES 5
#define COLONNES 5
M = malloc(sizeof(*M) * LIGNES) ;
int i ;
for( i = 0 ; i < LIGNES ; ++i)
M[i] = malloc(sizeof(*(M[i])) * COLONNES) ;
Une autre petite remarque: écris un programme qui contient ces quelques lignes
printf("%d", 1/25);
printf("%f", 1/25);
printf("%d", 1./25);
printf("%f", 1./25);
Cela ne devrait pas compiler silencieusement...
simomiso
Messages postés3Date d'inscriptionjeudi 2 juillet 2009StatutMembreDernière intervention 3 juillet 2009 3 juil. 2009 à 02:13
Merci pour ta reponse si précise..
en fait j'ai rectifier dans la boucle de i et j elle s'arrete a hauteur-2 et largeur-2 mais le probleme perciste. comme ta dis j'ai des doutes aussi ds la declaration de M je sais pas koi faire. j'ai essayé ske ta dis avec malloc(sizeof(double)*25) en declarant double **M dans le .h mais ca donne rien, pour le tableau de Pixel voila comment il est declaré:
GLvoid ReadPixels(char * fichier )
{
static GLboolean ImageSwitch = GL_FALSE ;
int i , j;
FILE *file;
file=fopen(fichier,"r");
fscanf(file,"%d %d \n",&width,&height);
printf("%d %d\n",width,height);
anImagePtr=ImageConstructeur( width,height);
int ia = 0;
for ( i = 0 ; i < width ; i++ )
{
for ( j = 0 ; j < height ; j++ )
{
fscanf(file,"%d ",&anImagePtr->Valeurs[ia]) ;
ia++;
}
}
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 3 juil. 2009 à 09:53
Bonjour,
Il me semble qu'il n'y a pas trace de «déclaration» du tableau Pixels de la structure ImagePtr dans le code que tu montres. En revanche, il y a quelque chose d'intéressant: le membre Valeurs a l'air d'être un tableau unidimensionnel, moins source d'erreurs.
Cela rejoint ce que j'ai dit plus haut : si tu te sers de M comme d'un tableau unidimensionnel, son type devrait être double* et pas double**.
Si M est de type double**, c'est une variable dont la valeur droite est une adresse (notons-la x). Lorsque tu écris M[0], c'est que tu vas chercher la valeur (de type double*) stockée à l'adresse x. À nouveau, cette valeur est une adresse. Notons-la y. Quand tu écris M[0][0], tu vas chercher la valeur stockée à l'adresse y. Cela revient à faire ce qui suit:
double ** M;
/*...*/
double ** x = M ;
double * y = *x ; // M[0]
double m = *y ; // M[0][0]
Pour t'en sortir, je te conseille deux choses:
1. Sers-toi d'un débugger. Par exemple avec gcc/gdb, tu compiles (gcc -ggbd) et tu exécutes dans gdb (gdb a.out //si a.out est le nom de ton exécutable) puis la commande magique est «help» (mais tu peux aussi faire «run» pour simplement exécuter le programme a.out). Il te dira quelle instruction provoque l'erreur.
2. Contente-toi de tableaux unidimensionnels, et teste sur de petits exemples: fais un programme qui remplit une matrice et l'affiche, compile, exécute. Si tout va bien, tu sais qu'il n'y a pas d'erreur dans cette portion de code et tu peux passer à la suite avec confiance.
simomiso
Messages postés3Date d'inscriptionjeudi 2 juillet 2009StatutMembreDernière intervention 3 juillet 2009 3 juil. 2009 à 11:31
j'ai essayé avec le debugeur maisje sais pas vraiment le manipulé, et le probleme est ke je doit l'envoyé au prof avant lundi soir. est ce ke je peu t'envoyé tout le code pour y jetter un coup d'oeil? voici mon adresse simpleboy75 (at) hotmail (poin) com
merci encore
Vous n’avez pas trouvé la réponse que vous recherchez ?