Appel à  une méthode Obj-C dans fonction C

respawnrespawn Membre
13:07 modifié dans API AppKit #1
Re Bonjour, encore moi ;-)

Aujourd'hui, j'essaie d'appeler ma fonction
- (IBAction)a_disconnect:(id)sender;
dans un cas spécifique traité dans une fonction C
if (connected_socket == -1) {...}


j'ai essayé des choses telles que
[self a_disconnect:nil];<br />[self a_disconnect:self];<br />[a_disconnect:self];


et il me dit que self n'est pas déclaré ...

Réponses

  • Philippe49Philippe49 Membre
    13:07 modifié #2
    self n'est utilisable que dans l'implémentation des méthodes de la classe, entre @implementation ... @end, ou dans une catégorie.
    Une fonction C peut-être utilisable n'importe où, et donc self n'a pas de sens dans ce contexte.
  • NoNo Membre
    13:07 modifié #3
    dans 1219221246:

    Aujourd'hui, j'essaie d'appeler ma fonction
    - (IBAction)a_disconnect:(id)sender;
    
    dans un cas spécifique traité dans une fonction C
    if (connected_socket == -1) {...}
    

    [...]
    et il me dit que self n'est pas déclaré ...


    2 questions :
    - d'où est appelée ta fonction ? Depuis une méthode ObjC ?
    - quel est le prototype de cette fonction C ?
  • respawnrespawn Membre
    13:07 modifié #4
    Alors, par exemple dans ma fonction
    int connect_card(char *serverhost, unsigned int port){...}
    


    dans le cas ou je ne peux pas me connecter au socket, je souhaiterait appeler ma méthode
    - (IBAction)a_disconnect:(id)sender;
    
    .

    Ensuite, dans plusieurs autres fonctions C telles que
    void check_answer (struct answer *card_answer){...}
    
    , si la connexion est perdue, je souhaiterai faire appel à  cette méthode ...
  • Philippe49Philippe49 Membre
    13:07 modifié #5
    Tu peux changer ton prototype et y glisser une instance d'une classe objective C

    int connect_card(char *serverhost, unsigned int port, MaClasse * uneInstance)

    et dans le code faire
    [uneInstance a_disconnect:nil];
  • Philippe49Philippe49 Membre
    13:07 modifié #6
    M'enfin, c'est pas très beau, ce serait mieux foutu si connect_card était une méthode d'une classe Obj-C, sans doute de celle dans laquelle se trouve définie ton IBAction

    -(int) connect_cardWithHost:(constchar *) serverhost port:(unsigned int) port  ....
  • AntilogAntilog Membre
    août 2008 modifié #7
    dans 1219227779:

    Tu peux changer ton prototype et y glisser une instance d'une classe objective C

    int connect_card(char *serverhost, unsigned int port, MaClasse * uneInstance)

    et dans le code faire
    [uneInstance a_disconnect:nil];


    Dans ce type de problème, c'est exactement ce que je fais:
    int maFonctionC(MaClasse * myself)<br />{<br /> &nbsp; [myself maMethodeObjC];<br />}<br />
    
  • respawnrespawn Membre
    13:07 modifié #8
    Quand vous dà®tes une instance de ma classe, si mon programme s'appelle "Michel", je dois écrire

    int connect_card(char *serverhost, unsigned int port, Michel * coco)

    puis

    [coco a_disconnect:nil];

    ?
  • Philippe49Philippe49 Membre
    13:07 modifié #9
    dans 1219309386:

    Quand vous dà®tes une instance de ma classe, si mon programme s'appelle "Michel", je dois écrire

    int connect_card(char *serverhost, unsigned int port, Michel * coco)

    puis

    [coco a_disconnect:nil];

    ?


    mon programme s'appelle "Michel" ????  ???

    Reprenons au début : tu as créé quel type de projet ? Une FoundationTool, Une Cocoa-Application, une Document-Based Application , une Core-Data Application ?


  • respawnrespawn Membre
    13:07 modifié #10
    :o j'ai créé une Cocoa-Application
  • Philippe49Philippe49 Membre
    août 2008 modifié #11
    Dans cette Cocoa-Application, tu as sans doute créé des classes .

    Si le nom de ton interface est MyView.h, tu mets MyView *

    et pas Michel  :brule: :brule: :brule:
  • respawnrespawn Membre
    13:07 modifié #12
    Ca marche po ...

    Ca plante et ca me ramène dans mon code...

    Pour simplifier un peu, je souhaiterai faire [o_progress stopAnimation:nil];
    Ceci est réalisé dans ma fonction a_disconnect. Si je met [o_progress stopAnimation:nil]; dans une fonction C, il me dit que ce n'est pas déclaré (alors que dans une méthode Obj-C, pas de pb), et si je redéclare (il l'est deja dans le .h) NSProgressIndicator *o_progress en globale, ca ne marche pas, ça fait rien ...
  • Philippe49Philippe49 Membre
    13:07 modifié #13

    Mais ta fonction C elle est où
    • dans un fichier .c indépendant
    • dans une interface .h
    • dans un fichier d'implémentation .m ?

    Où qu'elle soit, il faut que directement, ou indirectement un #import <Cocoa/Cocoa.h> soit actif , de telle sorte qu'à  la compilation la méthode de NSProgressIndicator soit connue.

    De plus, comme dit ci-dessus, le prototype  doit être
    int connect_card(char *serverhost, unsigned int port, NSProgressIndicator * o_progress) {
    }
  • Philippe49Philippe49 Membre
    13:07 modifié #14
    Maintenant tu as peut-être fait

    int connect_card(char *serverhost, unsigned int port,MaClasse * object){
      ...
      [o_progress stopAnimation];
      ...
    }

    avec o_progress qui serait une des variables/outlets de ton objet object ?

    C'est cela ?



  • respawnrespawn Membre
    13:07 modifié #15
    Je n'ai qu'un seul fichier .m (et le .h associé bien sûr) dans lequel se trouvent des fonctions C et des méthodes Obj-C.

    Quand j'appelle [o_progress stopAnimation:nil], soit il me dit qu'il le connait pas si je déclare pas en global, alors qu'il est dans le .h, soit ça fait rien ...
  • Philippe49Philippe49 Membre
    août 2008 modifié #16
    Dis-moi :

    • Le nom de ton fichier .h ,
    • Les #import fait dans ce fichier .h ,
    • L'entête de ta fonction C  : int connect_card ( ............. )
    • Confirme si o_progress est bien une variable déclarée après @interface 


  • respawnrespawn Membre
    13:07 modifié #17
    Fichier .h : TheApp.h
    Import : #import <Cocoa/Cocoa.h>
    #import "MCPKit_bundled/MCPKit_bundled.h"
    #import <netdb.h>
    Je souhaiterai l'appeler dans la fonction : void check_answer (struct answer *card_answer){}
    o_progress est bien déclaré après @interface à  la fois dans le .h
  • Philippe49Philippe49 Membre
    13:07 modifié #18
    dans 1219329520:

    Je souhaiterai l'appeler dans la fonction : void check_answer (struct answer *card_answer){}

    C'est la déclaration de ta fonction C qui ne va pas.

    Dans la fonction C , mets :
    void check_answer (struct answer *card_answer,NSProgressIndicator *progress){
        ...
        [progress stopAnimation];
        ...
    }


    Quand tu appelles cette fontion C dans une méthode de l'implémentation de TheApp, tu fais cet appel :
    check_answer (card_answer,o_progress);


Connectez-vous ou Inscrivez-vous pour répondre.