gilimcce
Messages postés33Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention27 septembre 2004
-
16 sept. 2004 à 15:31
gilimcce
Messages postés33Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention27 septembre 2004
-
19 sept. 2004 à 19:02
Bonjour à tous....
je declare une fonction
loadJpegImage(char *, unsigned char*, int*, int*)
1e parametre : le chemin de l'image chargee
2e // : le tableau (ou pointeur sur char) contenant l'image en question
3e et 4e // : les hauteur et largeur de l'image qui vont conditionner les dimensions du tableau dynamique
cette fonction est appelee dans le main :
unsigned char *text;
int height, width;
loadJpegImage(chemin, text, &width, &height);
dans le corps de la fonction,
la dimension de text est allouee dynamiquement :
int loadJpegImage(char *fichier, unsigned char *texture, int *Pt_width, int *Pt_height)
{
....
....
....
1 - mapper mon objet => aucun mappage n'est effectue comme si le tableau etait vide
2 - desallouer la memoire => erreur a la compilation "Freeing inexistant memory"
Ces deux actions sont faites au sein du main.
////////////////////////////////////////////////////
Dans le main :
unsigned char *text;
int height, width;
loadJpegImage(chemin, &text, &width, &height);
////////////////////////////////////////////////////
int loadJpegImage(char *fichier, unsigned char **texture, int *Pt_width, int *Pt_height)
{
....
....
....
Tu faisais une allocation dynamique (avec malloc) à l'interieur de ta fonction. Tu dois donc passé le pointeur (unsigned char *) par adresse afain que la valeur de 4 octets qu'il vaudra (retrourné par malloc) soit bien pris en compte à la sortie de ta fonction.
Quand tu alloues ou désalloues à l'interieur d'une fonction un pointeur, il faut toujours le passer en parmètre par adresse (par exemple char **).
C'est une règle simple... et qui marche à tout les coup....
Prend le temps de bien réfléchir et tu comprendras le mécanisme...
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 17 sept. 2004 à 08:40
c'est justement parce que ca retourne un void* que le cast n'est pas necessaire
a quoi sert le type void* en c ?
"certain compilateur ne voudront pas compiler si tu ne cast pas le pointeur retourné par le malloc"
un compilateur c++ oui, mais pas un compilateur c
et on avais deja dis pourquoi ca pouvais etre dangereux en c le cast d'une valeur retour, tu cache au compilateur le type retour (qui sera int par defaut) dans le cas ou il genere lui meme la declaration (declaration implicite)
le cast du malloc + l'oubli d'inclure stdlib.h est la pire des erreurs
Vous n’avez pas trouvé la réponse que vous recherchez ?
gilimcce
Messages postés33Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention27 septembre 2004 19 sept. 2004 à 19:02
Bon... Si quelqu'un y comprend qq chose....
Avec le passage par adresse, je n'avais plus d'erreur de memoire.
Mais le mappage, c'était pas vraiment ça, meme completement absent pour tout dire.
Je suis revenu a quelque chose de basique :
un pointeur simple sur unsigned char pour ma variable texture qui contient les pixels de mon image. Histoire d'avoir les idees un peu plus claires.
du coup plus d'erreur de desallocation, mais pas plus de mappage que precedemment.
Je vous livre le code. J'espere que qq un aura la synthese qu'il m'a manque.
Merci....
///////////////////// MAIN ////////////////////////
// rearrangement de l'image scannee dans le tableau de texture 3D
// ici nous sommes en niveau de gris, donc on copie le meme octet dans
// chacune des 3 cases RGB
for (i=0;i<t_height;i++)
for (j=0;j<t_width;j++)
{
texture[i*t_width*3+j*3 ] = image_gris[i*t_width+j];
texture[i*t_width*3+j*3+1] = image_gris[i*t_width+j];
texture[i*t_width*3+j*3+2] = image_gris[i*t_width+j];
}