[C/C++] ya-t-il un moyen simple de résoudre mon pb (fonc. statiques) ?

ya-t-il un moyen simple de résoudre mon pb (fonc. statiques) ? [C/C++] - Programmation

Marsh Posté le 07-03-2002 à 11:22:17    

lors de la compilation de mon source j'obtiens l'erreur:
 
"error C2664: 'png_create_write_struct' : cannot convert parameter 3 from 'void (struct png_struct_def *,const char *)' to 'void (__cdecl *)(struct png_struct_def *,const char *)'"
 
la ligne de code provoquant cette errue est la suivante:
 
" png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, fn, png_my_error, png_my_warning );"
 
 
ma fonction "png_my_error" est défini comme tel:
 
"void CBmp2Png::png_my_error(png_structp png_ptr, png_const_charp message )"
 
vous aurez deviner mon pb: 'png_create_write_struct()' attend un pointeur de fonction différent du mien car le mien appartient à une classe (et donc le pointeur de l'objet fait partie implicitement des params, voilà pourquoi le compilateur me fait cette erreur).
 
Ma question est la suivante: sachant que je ne peux pas redéfinir le type de la fonction passé en param dans 'png_create_write_struct()' (car elle fait partie d'une lib assez complexe) y-a-t-il un moyen de simple de conserver une possibilité d'accès aux membres de mon objet de type CBmp2Png à l'intérieur de la fonc 'png_my_error()' ? peut-on tromper le compilateur au niveau des params de la fonction avec un certain type de cast ?? kkchose de ce genre ?? merci d'avance à ceux qui essaieront de m'aider !!

Reply

Marsh Posté le 07-03-2002 à 11:22:17   

Reply

Marsh Posté le 07-03-2002 à 11:43:54    

Soit ta fonction est une fonction statique de ta classe,
Soit c'est une fonction globale amie de ta classe.
 
Dans les deux cas ton appel marchera...
 
Apres comment recuperer un poiteur sur ta classe ?
une variable gloable pointant sur ta classe, ou utiliser l'un des arguments de la fonction : soit dans png_struct_def soit dans le char*.
 
Bien sur j'imagine que la struct est predefinie, et que le char * est un message exterieur...
 
Il faut donc deriver png_struct_def pour y ajouter le pointeur que tu souhiates... Bien sur si cette structure est en C tu risque d'etre oblige de simuler l'heritage avec les moyens du C, c'est a dire de construire une nouvelle struct avec comme premier element une struct png_struct_def puis ensuite tu ajoutes ce dont tu as besoin...
 
Une fois dans ton call-back il ne te reste plus qu'a "down-caster" png_struct_def pour obtenir ta structure, et alors tu as acces au elements suplementaires que tu as ajoute...
 
Certes ce n'est pas hyper propre...

Reply

Marsh Posté le 07-03-2002 à 12:13:13    

"
Soit ta fonction est une fonction statique de ta classe,  
Soit c'est une fonction globale amie de ta classe.
"
 
je peux pas faire une fonction statique car à l'intérieur je vais accéder à params non statiques de ma classe, donc il me reste la seconde solution (c celle à laquelle je pensais mais je ne voyais pas comment passer mon pointeur d'objet..).
 
Ton idée de créer une nouvelle struct dérivé de "png_struct_def" est vraiment excellente, comme c une définition en C je vais comme tu dis devoir mettre cette struct en premier param... mais j'ai peur que ça ne puisse pas fonctionner car comme le suggère la ligne:
 
" png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, fn, png_my_error, png_my_warning );"  
 
c la fonc "png_create_write_struct()" qui alloue le pointeur de  
'png_struct_def' ... et il est ensuite directement envoyé tel quel à la fonc... faut-t-il alors que j'ajoute moi-même le pointeur de l'objet derrière avec un realloc() ? c décidement pas propre et j'ai peur que ça ne marche pas (si jamais la fonc d'allocation appelle elle-même les foncs "png_my_error()" c foutu :(...)
 
ça va être chaud tout ça... en tout cas merci BENB :) !

Reply

Marsh Posté le 07-03-2002 à 12:31:45    

je viens de pense qu'ne plus si realloc déplace le pointeur c aussi foutu ... mince , comment faire ???

Reply

Marsh Posté le 07-03-2002 à 12:45:41    

ben je sais pas ce que fais exactement png_create_write_struct (mes déboire avec la libpng remonte a un peu loin, deja :D )mais a la rigueur si elle ne fait que te creer un pointeur sur un structure correctement remplie, t'aura juste a recopier les param retourné dans ta structure a toi

Reply

Marsh Posté le 07-03-2002 à 12:48:55    

sinon truc tout con tout simple, pas beau c'est de faire deux bouts statics dans ta classe CBMP2PNG
 
 
class CBMP2PNG
{
 
..
 
 
 
static CBMP2PNG * m_lpCurrentInstance;
static void png_my_error(...);
}
 
 
et donc ton png_my_error retrouvera l'instance courrante via lpCurrentInstance que tu aura pris soin d'initialiser a this avant de commencer a farfouiller avec libpng....
 
 
c pas sublime mais ca a le merite d'etre simple :D

Reply

Marsh Posté le 07-03-2002 à 13:06:42    

le pb avec ta solution chrisbk c ke je voulais à terme que plusieurs histance de la classe CBmp2Png puissent être déclaré au sein d'un même programme (en fait je projette de faire un activeX se servant de cette classe), or avec le static je ne peux avoir qu'une instance à la fois (car les fonctions statiques n'accède pas au pointeur 'this';), sinon ça foire...  
 
sinon par ailleurs j'ai modifier mon code:
" png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, fn, png_my_error, png_my_warning );
 
 /******************************* crut pas propre du tout ******************** /
 // on réalloue de l'espace pour y caser notre pointeur d'objet
 void* new_png_ptr;
 new_png_ptr = realloc(png_ptr, sizeof(MyPngStruct));
 if(png_ptr != new_png_ptr) {
  strcpy(Error, "Realloc foired" );
  return 0;
 }
 
 MyPngStruct *my_png_struct = (MyPngStruct*)new_png_ptr;
 my_png_struct->CBmp2Pngp = this;
 //****************************************************************************/
"
 
et en fait si ça compile sans prob (dans mes foncs "png_my_error()" et "png_my_warning()" je récupère le pointeur en castant en MyPngStruct) par contre à l'exécution ça foire (truc opération non conforme ou du genre) au moment de l'appel à:
"png_write_info( png_ptr, info_ptr );"
 
ma struct MyPngStruct est définie comme telle:
"// on simule une struct dérivée de png_structp
typedef struct my_ptr_png_struct_
{
 png_structp png_ptr;
 CBmp2Png* CBmp2Pngp;
} MyPngStruct;"
 
any ideas ??

 

[jfdsdjhfuetppo]--Message édité par ZZZzzz--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-03-2002 à 14:28:56    

Une methode de classe, statique, ou une methode globale amie de la classe sont rigoureusement equivalente du point de vue code... mais pas dans la semantique... a toi de voir : dans les deux cas il te faut un pointeur sur la classe pour acceder aux membres non statiques.
 
Je ne connais pas la libpng, mais n'y a-t-il pas des champs libres dans la structure png_struct_def (des void *) ou alors un champs nom unique
 
Tu pourrais alors reprendre l'idee de la globale, ou la solution de chrisbk mais avec une map (STL) ou une hashTable faisant le lien entre nom => pointeur...
C'est un peu lourd, mais efficace...
 
sinon essaye la technique de chrisbk sur la recopie de la struct, mais audela du risque immediat, cela peut poser un risque en maintenance (si dans une version ulterieure de la lib la struct change ou n'est plus alloue de la meme maniere...

Reply

Marsh Posté le 07-03-2002 à 15:18:19    

BENB> oui tu as raison pour la fonc statique et la fonc amie, j'y ai repensé plus tard...
en fait chui un gros bouffon car je viens de me rendre compte que le param 'fn' dans:
 
"png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, fn, png_my_error, png_my_warning"
 
correspondait justement à ce pointeur utilisateur !!! (je pensais qu'il devait contenir le nom du fichier écrit), désolé de vous avoir fait perdre votre temps... maintenant j'ai un autre prob, le processus reste actif quand je ferme l'applic de conversion, mais j'arriverai à me débrouiller.. merci de m'avoir aider !

Reply

Marsh Posté le 07-03-2002 à 16:04:54    

ZZZzzz a écrit a écrit :

BENB> oui tu as raison pour la fonc statique et la fonc amie, j'y ai repensé plus tard...
en fait chui un gros bouffon car je viens de me rendre compte que le param 'fn' dans:
 
"png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, fn, png_my_error, png_my_warning"
 
correspondait justement à ce pointeur utilisateur !!! (je pensais qu'il devait contenir le nom du fichier écrit), désolé de vous avoir fait perdre votre temps... maintenant j'ai un autre prob, le processus reste actif quand je ferme l'applic de conversion, mais j'arriverai à me débrouiller.. merci de m'avoir aider !  




Non, tu n'est pas un gros Bouffon, le probleme que tu cites est courrant, et meme si pour toi il se finit plutot bien, et bien il en aidera d'autres... enfin je le souhaite...
 
On ne se ridiculise qu'en ne posant pas la question a laquelle on n'a pas la reponse...

Reply

Marsh Posté le 07-03-2002 à 16:04:54   

Reply

Marsh Posté le 07-03-2002 à 16:40:15    

merci BENB ;)
 il est en effet très courant que les problèmes (ou bugs) les plus "bêtes" soient les plus dures à résoudre (en tout cas en ce qui me concerne)...

Reply

Sujets relatifs:

Leave a Replay

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