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

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°108747
ZZZzzz
Posté le 07-03-2002 à 11:22:17  profilanswer
 

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

mood
Publicité
Posté le 07-03-2002 à 11:22:17  profilanswer
 

n°108768
BENB
100% Lux.
Posté le 07-03-2002 à 11:43:54  profilanswer
 

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

n°108797
ZZZzzz
Posté le 07-03-2002 à 12:13:13  profilanswer
 

"
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 :) !

n°108805
ZZZzzz
Posté le 07-03-2002 à 12:31:45  profilanswer
 

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

n°108813
chrisbk
-
Posté le 07-03-2002 à 12:45:41  profilanswer
 

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

n°108817
chrisbk
-
Posté le 07-03-2002 à 12:48:55  profilanswer
 

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

n°108828
ZZZzzz
Posté le 07-03-2002 à 13:06:42  profilanswer
 

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]

n°108890
BENB
100% Lux.
Posté le 07-03-2002 à 14:28:56  profilanswer
 

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

n°108943
ZZZzzz
Posté le 07-03-2002 à 15:18:19  profilanswer
 

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 !

n°109015
BENB
100% Lux.
Posté le 07-03-2002 à 16:04:54  profilanswer
 

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

mood
Publicité
Posté le 07-03-2002 à 16:04:54  profilanswer
 

n°109047
ZZZzzz
Posté le 07-03-2002 à 16:40:15  profilanswer
 

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


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

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

 

Sujets relatifs
[java] l editeur le + simple d utilisation pour linux[PHP] Un petit machin tout simple
s'il vous plait: je cherche un programme simple P CODEJ'AI APRIS A PROGRAMMER EN PHP EN 1 SEMAINE : c trop simple
[FORMS] ya moyen de savoir quel ordre SELECT est généré ?ben ca le fait moyen !!!
[JAVASCRIPT/HTML] simple question[JS] -> y a moyen de mettre en memoire une chiene ?
[DIV / HTML] question simple, comment empêcher le retour à la ligne?Question REQUETE mySQL (simple... mais rapide)
Plus de sujets relatifs à : [C/C++] ya-t-il un moyen simple de résoudre mon pb (fonc. statiques) ?


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