Parcours récursif d'un Graph

FloFlo Membre
06:43 modifié dans API AppKit #1
Bonjour,

Je désire mettre en place une sorte de "background updating" sur un graph de donnée. Une bonne solution m'a semblé d'écrire une méthode récursive qui tournerai dans un thread et se déclencherai à  intervalle régulier.

En gros, à  chaque update, le graph est parcouru deux fois :
- une première pour récupérer les infos nécessaires à  la construction d'un objet NSURL
- une deuxième pour mettre a jour chaque noeud en fonction des infos récupérées sur le web sous forme de fichier CSV.

Je me suis laissé dire que les appels de méthodes étaient lents en objective-c, j'ai donc pensé à  des procédures C ou à  encapsuler une procédure C dans une Objective-c avec les pointeurs de fonctions(IMP).

J'ai essayé de placer une procédure C et à  chaque fois le compilateur crie... Et j'avoue ne pas avoir bien compris la manipulation des pointeurs de fonction, même après lecture de la doc de NSObject un peu succincte et pauvre en exemple il faut bien l'avouer...

Quelqu'un aurait-il un exemple simple et clair à  me conseiller ?

Merci d'avance.

Réponses

  • Philippe49Philippe49 Membre
    mars 2009 modifié #2
    dans 1237026059:


    J'ai essayé de placer une procédure C et à  chaque fois le compilateur crie... Et j'avoue ne pas avoir bien compris la manipulation des pointeurs de fonction, même après lecture de la doc de NSObject un peu succincte et pauvre en exemple il faut bien l'avouer...


    En C , en voici un modèle simple

    #include &lt;stdio.h&gt;<br />#include &lt;math.h&gt;<br />typedef double  (*FONCTION)(double );<br /><br />void printValue(FONCTION f,double x);<br />double maFonction (double x);<br /><br />int main(void) {<br />	printValue(sin,M_PI_2);<br />	printValue(cos,M_PI_2);<br />	printValue(maFonction,2.);<br />	return 0;	<br />}<br /><br />void printValue(FONCTION f,double x) {<br />	printf(&quot;%.2f&#092;n&quot;,f(x));<br />}<br /> <br />double maFonction (double x) {<br />	return x*x;<br />}
    
  • FloFlo Membre
    06:43 modifié #3
    Merci pour ta réponse,

    Je me demande juste comment intégrer ce genre de chose dans mon projet, dois-je faire un fichier .c à  part ou il y a-t-il un moyen d'intégrer tout ça dans un fichier .m d'une classe existante ?

    Que représente FONCTION ? Est-ce une macro ? Un type définit en C ? Ce que je souhaite c'est juste appeler une fonction récursive écrite en C dans une méthode d'instance en objective-c...
  • CeetixCeetix Membre
    06:43 modifié #4
    Tiens Flo un post qui traite de ça où je me demandais la même chose ;)

    ICI
  • AliGatorAliGator Membre, Modérateur
    mars 2009 modifié #5
    FUNCTION est un typedef que Philippe49 a défini au début de son code (1ère ligne), définissant un pointeur de fonction.

    Mais je pense que c'est pas la peine de se prendre le chou avec ça pour ce qui t'es nécessaire. L'Objective-C n'étant qu'une surcouche du C, il suffit d'appeler ta fonction C comme tu appellerais n'importe quelle autre fonction C dans un programme C. D'ailleurs je suis sûr que tu l'as déjà  fait sans t'en rendre compte, en particulier avec NSLog(...) qui est une fonction C et non une méthode Objective-C !

    Exemple (avec une méthode de calcul de factorielle bateau juste pour l'exemple)
    // Ta méthode C, récursive justement<br />unsigned long fact(unsigned long x)<br />{<br />  if (x&lt;=1) return 1;<br />  return x*fact(x-1);<br />}<br /><br />// Une méthode Objective-C qui va appeler ta méthode C (entre autres).<br />-(void)calculerFactorielleDe:(NSInteger)x etAjouter:(NSInteger)y<br />{<br />   unsigned long res = fact(x); // appel à  la fonction C &quot;fact&quot;<br />   res += y;<br />   [self setNewValue:res]; // appel à  la méthode Objective-C &quot;setNewValue:&quot; sur l&#39;objet &quot;self&quot; : on voit la différence de syntaxe<br />}
    


    ---

    [EDIT]
    PS : Passer par les "IMP" est une solution surtout quand on a besoin d'appeler beaucoup de fois une méthode Objective-C, pour éviter l'overhead du mécanisme d'envoi de messages à  chaque boucle par exemple. On récupère dans une variable de type IMP directement un pointeur vers la fonction C (celle qui sera créée par le compilateur lorsqu'il va transformer le code Objective-C en code intermédiaire C) correspondant à  la méthode Objective-C qui nous intéresse, comme ça dans la boucle on appelle directement la fonction C plutôt que d'utiliser les messages Objective-C. Mais ça convient bien à  une grosse boucle, mais pas à  un appel récursif puisque pour la boucle on peut déclarer et initialiser une variable IMP avant le début de la boucle et l'utiliser dedans ensuite, mais pour une méthode récursive, où stocker la variable IMP ? Dans la méthode récursive ? Ca ne va pas puisqu'on devra la recalculer à  chaque fois... Dans la méthode qui l'appelle ? Mais dans ce cas on n'y a plus accès dans la méthode récursive qui doit d'auto-appeler... Du coup l'intérêt est vachement plus limité voire inexistant pour ce cas de figure, contrairement au cas d'une grosse boucle.
  • FloFlo Membre
    06:43 modifié #6
    Merci les gars, c'est vachement plus clair d'un seul coup !
Connectez-vous ou Inscrivez-vous pour répondre.