Du Cocoa dans du Carbon
Tchouboudou
Membre
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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)
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...
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];
}
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...
@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
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 ...).
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.
.
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)...
.