Le lundi 13 mars, Frédéric a écrit :
> bool (*m_TestRecAlignment)(TModuleRec *Rec);
> bool (*m_Compile)(
> TModuleRec *Rec,
> char* Source,
> bool DirectivesOnly,
> bool ParseStampDirective
> );
> // is declared as int in the specs for tokenizer v1.16 but is
> // actually a byte.
> byte (*m_Version)();
Bon, visiblement le C et le C++ c'est pas pareil sur ce point. Moi je
suis C, mais j'ai essayé de jouer avec le compilo C++ (g++ 3.4.1).
(void *) m_TestRecAlignment = dlsym(m_libt, "TestRecAlignment");
donne
error: ISO C++ forbids cast to non-reference type used as lvalue
C'est en gros le message d'erreur que tu avais, en plus clair. Si
j'enlève le cast à gauche :
error: invalid conversion from `void*' to `bool (*)(TModuleRec*)'
OK, je remets le cast, mais à droite, comme tout le monde, et là il est
content. Après tout c'est plus logique de caster la valeur au type de la
variable d'accueil que le contraire. Donc, le code qui plaît à g++ :
m_libt = dlopen(TOKENIZER_SO, RTLD_LAZY);
if (m_libt) {
m_TestRecAlignment = (bool (*)(TModuleRec *))
dlsym(m_libt, "TestRecAlignment");
m_Compile = (bool (*)(TModuleRec *, char*, bool, bool))
dlsym(m_libt, "Compile");
m_Version = (byte (*)()) dlsym(m_libt, "Version");
}
Si tu ne trouves pas ça très lisible (normal si tu as pas bu le C au
biberon), fais des typedefs pour ces types de fonctions.
--
Edgar Bonet Maison : 04 76 21 29 16 Bureau : 04 76 88 10 96
3 rue Jean Prévost Mobile : 06 77 19 79 39 Fax : 04 76 88 11 91
38000 Grenoble guilde@??? www.edgar-bonet.org