comment créer un pointeur de function en Cocoa
Genose
Membre
Salut,
je cherche a savoir sil existe un autre moyen plus cocoa que CoreFondation de faire un pointeur de function.
j'ai une classe avec CFBundleGetFunctionPointerForName qui fonctionne tres bien, mais existe une alternative ?
merci de voos lumiere
je cherche a savoir sil existe un autre moyen plus cocoa que CoreFondation de faire un pointeur de function.
j'ai une classe avec CFBundleGetFunctionPointerForName qui fonctionne tres bien, mais existe une alternative ?
merci de voos lumiere
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
J'ai eu du mal à te lire.
Pointeur de fonction ou pointeur de méthode ?
Pour un pointeur de fonction, c'est comme en C. Sinon on peut utiliser @selector et des fonctions du genre "performSelector"
En C:
int f(float x, double y);
typedef int (*p_f_t)(float, double);
p_f_t p_f = &f;
p_f(1, 2); //équivalent à f(1, 2);
En Obj-C, pour des méthodes:
@interface Toto
-(int) f:(id) unObjet;
@end
SEL selecteur = @selector(f;
Toto* toto = [[Toto alloc] init];
[toto performSelector:selecteur withObject:unObjetQuelconque];
//équivalent à [toto f:unObjetQuelconque];
L'approche Objet nécessite que les arguments de la méthode soient des objets pour utiliser performSelector.
Sinon il faut utiliser NSInvocation (plus pénible).
Pour plus de détails, lire "Objective-C programming langage", ou "De C++ à Objective-C". Ce dernier document est formidable ;-)
+
Chacha
se declare:
typedef int (*p_f_t)(float, double);
p_f_t p_f[8];
p_f_t p_fb;
et donc l'assignation est
p_f[3]= &f;
et bien la j'ai donc un soucis car CFBundleGetFunctionPointerForName ne donne pas le fameux pointeur
p_f[2]= CFBundleGetFunctionPointerForName(....);
p_f[2]= (p_f_t*) CFBundleGetFunctionPointerForName(....);
p_f[2]= (p_f_t**) CFBundleGetFunctionPointerForName(....);
p_f[2]= & (p_f_t)CFBundleGetFunctionPointerForName(....); // erreur de compilation
p_f[2]= &CFBundleGetFunctionPointerForName(....); // erreur de compilation
me donne une erreur a l'execution
mais pas
p_fb = (p_f_t) CFBundleGetFunctionPointerForName(....);
qui donne bien mon pointeur et tout va bien.
mais la j'aimerais corrigé ce bug avant de traiter le code au cocoa , quel est monn erreur dans ce code ?
y a pas d'erreur là !
et pour appeler la fonction:
p_f[2](floatValue,doubleValue);
c'est tout :-*
j'avais ecris
p_f[2]= (p_f_t)CFBundleGetFunctionPointerForName(MyCFBundle,CFSTR("FunctionExterne"));
et pas
p_f[2]= (p_f_t)CFBundleGetFunctionPointerForName(MyCFBundle[2],CFSTR("FunctionExterne"));
sans oublier le Type Cast car CFBundleGetFunctionPointerForName renvoye un Void*,
c cool maintenant j'ai 32 'function pointer' et qui s'appelle bien comme prevu
Bon Maintenant aux tours de cocoa :P