Du Cocoa dans du Carbon

TchouboudouTchouboudou Membre
23:49 modifié dans API AppKit #1
Bonjour les gens.

J'ai récemment fait une gestion de raccourcis clavier en Carbon. J'ai donc une fonction Carbon. J'aimerais, dans cette fonction, appelé une autre fonction, mais celle-ci, en Cocoa. Je fais donc : [self showWindow]; . Malheuresement, il y a une erreur, me disant que self n'est pas déclaré.

Avez-vous une solution miracle ?

Merci d'avance,
Tchouboudou

Réponses

  • schlumschlum Membre
    août 2007 modifié #2
    Il faut faire l'inverse...

    Renomme tes ".c" en ".m", ça devrait passer...

    PS : du Cocoa dans du Carbon ou l'inverse ne veut rien dire, ce sont des Frameworks...
    On peut dire du C dans de l'Objective-C par contre (Carbon est un Framework C, Cocoa un Framework Objective-C)
  • TchouboudouTchouboudou Membre
    23:49 modifié #3
    Pour le coup du framework, je savais, mais je me serais un peu embrouillé ^^ .

    En fait, à  la base, j'ai une appli Cocoa, et j'insère juste un bout de code en C. Dans une fonction C, j'aimerais mettre du code Obj-C, mais ça ne marche pas...
  • schlumschlum Membre
    23:49 modifié #4
    dans 1186257617:

    Pour le coup du framework, je savais, mais je me serais un peu embrouillé ^^ .

    En fait, à  la base, j'ai une appli Cocoa, et j'insère juste un bout de code en C. Dans une fonction C, j'aimerais mettre du code Obj-C, mais ça ne marche pas...


    Si ta fonction C est dans un .m, ça ne devrait pas poser de problème...
  • Philippe49Philippe49 Membre
    23:49 modifié #5
    dans 1186257617:

    Dans une fonction C, j'aimerais mettre du code Obj-C, mais ça ne marche pas...


    Ceci peut peut-être t'aider

    /* template pour un code C+objective-C  compilable  sur le terminal :
    % gcc mypgm.m -o mypgm -framework Foundation
    */

    #import <Foundation/Foundation.h>


    int main(int argc, char * argv[] ){
    NSAutoreleasePool * pool=[NSAutoreleasePool new];
    // code C et objective C
    [pool release];
    }
  • TchouboudouTchouboudou Membre
    23:49 modifié #6
    Donc, je suis dans un .m et voici ma fonction :
    <br />OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData)<br />{<br />	//Do something once the key is pressed<br />	<br />	[self showWindow];<br />	<br />	return noErr;<br />}
    


    Malheuresement, il y a cette erreur : 'self' undeclared (first use in this function).

    Pourtant, il ne me semble pas qu'il y ait un problème...
  • Philippe49Philippe49 Membre
    23:49 modifié #7
    self ne peut avoir de sens que dans l'implémentation d'une classe,

    @interface maClasse :  laClasseParente
      // les déclarations variables && méthodes
    @end

    @implementation maClasse

      // ici self est une référence à  l'instance de la classe

    @end
  • fouffouf Membre
    23:49 modifié #8
    dans 1186317523:

    Pourtant, il ne me semble pas qu'il y ait un problème...

    Si.
    C est un langage non orienté objet, à  l'inverse de l'Obj-C. Il ya donc des trucs que tu ne peux pas faire en C et qui sont possible en Obj-C. Les appels à  self en font partie : MyHotKeyHandler est en C donc impossible de parler de classe et d'objet. Or self est une variable qui designe l'objet (ou la classe) dont la méthode est appelée. Donc tu ne pourras pas faire appel à  self dans une fonction C.
    Comment remedier à  cela ? C'est pas tres compliqué : soit l'objet auquel tu envoies showWindow: (une NSWindowController à  priori) est un singleton (il n'en existe qu'une seule instance durant toute la "vie" du programme) auquel cas, ce n'est pas très dur (avec l'accesseur de ton singleton), sinon tu peux essayer en passant l'objet en question à  la fonction C grace au pointeur userData (comme les userInfo des notifications en Cocoa si tu connais ...).
  • BruBru Membre
    23:49 modifié #9
    C'est tout comme Fouf ou Schlum (indirectement) l'ont dit.

    Tu dois coder ta fonction callback MyHotKeyHandler dans un fichier .m (au lieu d'un .c, et si possible dans le même fichier que celui qui implémente la classe dont l'objet va installer la fonction callback) et en dehors de @implementation...@end.

    Ensuite, le paramètre userData de la fonction callback peut servir à  transmettre self, c'est à  dire le pointeur de l'objet qui a déclaré le callback.

    Enfin, au lieu d'utiliser self dans la fonction callback, tu utilises userData.

    .
  • TchouboudouTchouboudou Membre
    23:49 modifié #10
    Oki, merci tout le monde...

    Par contre, je mets quoi à  la place de void * ? ça marque une erreur à  chaque fois...
  • BruBru Membre
    23:49 modifié #11
    dans 1186333904:

    Par contre, je mets quoi à  la place de void * ? ça marque une erreur à  chaque fois...


    Est-ce vraiment une "error" et pas plutôt un "warning" (auquel cas tu peux l'ignorer, sinon, faire un cast)...

    .
  • TchouboudouTchouboudou Membre
    23:49 modifié #12
    C'est un warning...
  • schlumschlum Membre
    23:49 modifié #13
    -> cast
  • TchouboudouTchouboudou Membre
    23:49 modifié #14
    Keskec cast ?
Connectez-vous ou Inscrivez-vous pour répondre.