Implementer une fonction C

MulotMulot Membre
20:48 modifié dans API AppKit #1
Bon, première petite chose qui me chagrine. J'ai un NSMutableArray qui contient des objets "Operation", cet objet operation à  plusieurs attributs comme la valeur, si c'est une opération de débit ou de crédit et autres choses.

Je voudrais classer ces opération dans mon tableau selon plusieurs critères (par type d'opération, par valeur etc...), ce tableau d'opérations est en fait un compte.

Plutôt que de faire un tri "à  la main" avec un énumérateur, j'ai vu que la classe NSArray disposait de la méthode suivante :

- (NSArray *)sortedArrayUsingFunction:(int (*)(id, id, void *))comparator context:(void *)context


Pour l'utiliser il faut implanter sa propre version de la fonction de tri, qui est d'une forme C classique :

int intSort(id num1, id num2, void *context)<br />{<br />&nbsp; &nbsp; int v1 = [num1 intValue];<br />&nbsp; &nbsp; int v2 = [num2 intValue];<br />&nbsp; &nbsp; if (v1 &lt; v2)<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedAscending;<br />&nbsp; &nbsp; else if (v1 &gt; v2)<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedDescending;<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; return NSOrderedSame;<br />}<br />


Jusque là , ça va. Le problème est que je n'arrive pas à  intégrer cette fonction standard dans ma une de mes classes (je le comprend en même temps, la syntaxe diffère des messages), et ni dans une classe "protocole", qui ne reconnaà®t pas la syntaxe de la fonction, je n'ai vu que des protocoles avec des méthodes et non des fonctions. J'ai aussi pensé à  un simple fichier .c couplé à  un .h pour déclarer cette fonction mais ça me parait un peu tiré par les cheveux.

Comment et où puis-je implémenter cette fonction ?

Merci par avance.

Réponses

  • schlumschlum Membre
    20:48 modifié #2
    Dans n'importe quel .m ...
    L'Objective-C inclut le C.
  • MulotMulot Membre
    20:48 modifié #3
    Fichtre, je n'y comprend plus rien, je viens de recopier coller l'exemple de l'API , entre deux de mes méthodes de ma classe, et ça compile, alors qu'avant j'avais le droit à  des erreurs, étrange, en tout cas je te remercie pour ta rapidité et ton efficacité, et surtout honte sur moi, c'était la première chose qui m'est venue à  l'esprit, je me disais, ben suffit juste de la déclarer et l'implémenter comme une méthode, et bien oui.

    En tout cas, merci beaucoup Schlum !
  • MalaMala Membre, Modérateur
    20:48 modifié #4
    dans 1182280377:

    J'ai aussi pensé à  un simple fichier .c couplé à  un .h pour déclarer cette fonction mais ça me parait un peu tiré par les cheveux.

    En règle générale c'est ce qu'on préfère faire. C'est pour éviter de mélanger les torchons et les serviettes entre ce qui est objet et ce qui ne l'est pas. Mais comme le dit schlum, ça passe partout puisque l'Objective-C dérive du C.

    Si tu avais des erreurs et que ça a disparu cela venait peut-être juste d'une petite erreur de syntaxe. Le compilateur donne parfois des erreurs en séries assez déconcertantes si on oublie un point virgule, une accolade ou autre.
  • BruBru Membre
    20:48 modifié #5
    Rien à  voir.

    Dans un fichier .m (donc Obj-C), tout ce qui est entre @interface ou @implementation et @end, c'est de l'Objective-C. Tout ce qui est à  l'extérieur, c'est du C.

    Donc tu peux faire dans le même fichier :
    <br />// je déclare une fonction C...<br />void UneFonctionC();<br /><br />// puis j&#39;implémente les méthodes de ma classe<br />@implementation UneClasse<br />- (void)uneMethode<br />{<br />&nbsp; &nbsp; // ici j&#39;appelle ma méthode C<br />&nbsp; &nbsp; UneFonctionC();<br />}<br />@end<br /><br />// enfin, j&#39;implémente ma fonction C<br />void UneFonctionC()<br />{<br />&nbsp; &nbsp; // fonction C qui fait des choses...<br />&nbsp; &nbsp; return;<br />}<br />
    


    Dans le cas de Mulot, sa fonction C qui permet de personnaliser une fonction de tri sur NSArray peut être implantée dans le même fichier où se trouve la méthode sortedArrayUsingFunction:.

    .
  • schlumschlum Membre
    20:48 modifié #6
    Oui da... Il serait logique de mettre en dehors de @implementation...
    Ceci-dit, ça passe aussi quand c'est à  l'intérieur  :o
  • AliGatorAliGator Membre, Modérateur
    20:48 modifié #7
    Au fait, si tu ne comptes trier ton tableau qu'en fonction des champs de chacun de tes objets "Operation", pourquoi passer par une fonction C et non pas des NSSortDescriptors ?

    Si tu as défini des accesseurs dans ta classe Operation (genre [tt]-(int)debit[/tt], [tt]-(NSDate)date[/tt], etc.), normalement il te suffit de créer un SortDescriptor par exemple indiquant que tu veux trier selon la key "debit", par ordre croissant, puis d'appliquer le tri sur ton tableau avec [tt]sortedArrayUsingDescriptors[/tt].

    Du coup, plus besoin de fonction C.

    A moins que ton tri soit bien plus complexe que ça (et encore que tu peux te démerder pour créer un accesseur / une clé dans ta classe Operation qui retournera une valeur indiquant son ordre de tri, par exemple [tt]-(int)montant[/tt] qui retourne (credit-debit), etc.
  • MalaMala Membre, Modérateur
    20:48 modifié #8
    dans 1182297970:
    Rien à  voir.

    Je n'ai pas compris le contexte de ta réponse. J'ai dit une bêtise quelque part?
  • BruBru Membre
    20:48 modifié #9
    dans 1182343471:

    dans 1182297970:
    Rien à  voir.

    Je n'ai pas compris le contexte de ta réponse. J'ai dit une bêtise quelque part?


    Non.
    Je répondais à  la citation que tu avais toi même répondu...
    Oui, je sais, c'est tiré par les cheveux...

    Le "rien à  voir" étant en réponse surtout au fait de séparer le C de l'Obj-C.

    .
  • MulotMulot Membre
    20:48 modifié #10
    dans 1182331304:

    Au fait, si tu ne comptes trier ton tableau qu'en fonction des champs de chacun de tes objets "Operation", pourquoi passer par une fonction C et non pas des NSSortDescriptors ?


    En fait pour le coup je me suis "inspiré" de Java avec ses classes Comparator d'Array List à  implémenter, c'est ce que j'ai trouvé de plus probant pour faire mon tri, qui se fait selon des valeurs "bidons" de l'objet Operation.
    En effet j'ai bien des accesseurs pour chacun de mes attributs d'une Operation.

    J'ai en effet vu les NSSortDescriptor, mais sur le coup le path key m'a quelque peu embêté, faut dire que je n'ai pas cherché dans cette voie très longtemps, je vais donc essayer avec cette solution.

    Petite question, y'a-t-il un moyen de récupérer ces jolies pages d'exemple de l'ADC pour les "inclure" dans l'API de XCode, pour pouvoir l'utiliser loin du monde ?!

    @Bru:

    Oui effet c'est bien plus propre de faire ça en dehors de la classe, mais donc dans ce cas je ne pense pas que faire un protocol pour ces quelques fonctions de tri propre à  mon code ne soit super efficace.


    En tout cas merci bien de votre participation, et encore pardon d'avoir sûrement du oublier une piote accolade ou point virgule quelques lignes plus haut.
  • MalaMala Membre, Modérateur
    juin 2007 modifié #11
    dans 1182354146:

    Petite question, y'a-t-il un moyen de récupérer ces jolies pages d'exemple de l'ADC pour les "inclure" dans l'API de XCode, pour pouvoir l'utiliser loin du monde ?!

    Va voir dans /Developer/ADC Reference Library/index.html sur ton disque dur. ;)

    Sinon, tu peux aussi y accéder par XCode via le menu Help->Documentation. Si tu disposes d'un compte ADC (si ce n'est pas le cas tu peux en créer un gratuitement sur le site d'Apple) tu pourras télécharger les dernières mise à  jour à  mesure qu'elles sortent (aussi bien pour Xcode que pour la doc).

    Edit: tu as aussi /Developer/Examples sur ton disque ou tu retrouves pas mal de projets XCode disponibles sur le site d'Apple.
  • MulotMulot Membre
    20:48 modifié #12
    A oui c'est déjà  présent sur le dur, bien vu. Faut dire que ça fait seulement un an que j'ai mon mac, et là  je viens de débuter l'utilisation de XCode, j'ai de nouvelles (bonnes) surprises tout les jours, ça change de certains autres Os en tout cas.

    Pour pas flooder:

    En effet les SortDescriptor marchent vraiment bien, c'est bien vu comme code, pas la peine de mettre les mains dans le cambouis !

    Par contre j'ai une petite question à  poser, par rapport à  la "KVC-Compliant".Pour utiliser les SortDescriptor sur une collection il faut que les objets de celle-ci soient KVC-Compliant, et donc que la classe implémente pas de méthode. Cela fonctionne t-il dans mon cas étant donné que ma classe hérite de NSObject ?
Connectez-vous ou Inscrivez-vous pour répondre.