comment créer un pointeur de function en Cocoa

GenoseGenose Membre
13:34 modifié dans API AppKit #1
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

Réponses

  • muqaddarmuqaddar Administrateur
    13:34 modifié #2
    Attention à  l'ortographe Genose.  ;)  :o
    J'ai eu du mal à  te lire.
  • ChachaChacha Membre
    13:34 modifié #3
    Bonjour,

    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

  • GenoseGenose Membre
    13:34 modifié #4
    si je reprend tes propos Chacha alors un Tableau de pointeur de fonctiion

    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 ?
  • mpergandmpergand Membre
    13:34 modifié #5
    p_f[2]= CFBundleGetFunctionPointerForName(....);


    y a pas d'erreur là  !

    et pour appeler la fonction:
    p_f[2](floatValue,doubleValue);

    c'est tout :-*
  • GenoseGenose Membre
    13:34 modifié #6
    Vous aller ;D ou  :o mais j'ai compris ou cela n'aller pas c'etait mon index dans les parametres de CFBundleGetFunctionPointerForName.

    j'avais ecris

    p_f[2]= (p_f_t)CFBundleGetFunctionPointerForName(MyCFBundle,CFSTR("FunctionExterne")); :p

    et pas

    p_f[2]= (p_f_t)CFBundleGetFunctionPointerForName(MyCFBundle[2],CFSTR("FunctionExterne")); B)

    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
Connectez-vous ou Inscrivez-vous pour répondre.