Page 1 sur 1

Nom d'une fonction

Posté : mar. 18 mars 2014, 22:08
par xavans
Bonjour,
je cherche comment récupérer le nom d'un fonction passée en tant qu'argument d'une autre fonction:

Exemple :

Code : Tout sélectionner

real afficher_nom_fonction(real F(real x))
{

label("$F(x)$",(1,1));

}


Dans label("F(x)"...etc, j'aimerais remplacer la lettre F par le nom de la fonction F, c'est à dire quelque chose du style F.name , par exemple, puisque ma fonction F peut avoir différents noms .

Mais je n'arrive pas à trouver la propriété qui donne le nom d'une fonction...

Quelqu'un a une idée?

Bonne journée,
Xavier .

Re: Nom d'une fonction

Posté : mer. 19 mars 2014, 01:05
par GM
Bonsoir,
il pourrait être utile de savoir dans quel cadre cela va être utile...
car on peut se demander pourquoi tu ne peux pas définir simultanément une chaine de caractère associée à chaque nouvelle fonction créée.

Une solution qui m'a traversé l'esprit pour gérer tes fonctions : les traiter comme des objets qui ont des "attributs" (c'est à dire des "caractéristiques intrinsèques de l'objet" : nom, xmin, xmax, ...) et des "méthodes" (c'est à dire des "fonctions intrinsèques à l'objet" : draw, ...) :

Figure asymptote cd5c3c79cdfc168e1d04f5b076ab6248
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. ///////////////////////////////////////////////////
  2. //// Une classe d'objets pour gérer des fonctions
  3. ///////////////////////////////////////////////////
  4. import graph;
  5. struct fonction {
  6. string nom;
  7. real expression(real x);
  8. real xmin;
  9. real xmax;
  10. void operator init(string nom, real expression(real x), real xmin, real xmax){
  11. this.nom=nom;
  12. this.expression=expression;
  13. this.xmin=xmin;
  14. this.xmax=xmax;
  15. }
  16. void draw(bool affichernom=true, Label autrenom="...",
  17. real xmin=xmin, real xmax=xmax,
  18. pen stylo=currentpen){
  19.  
  20. Label lab = (autrenom.s=="...") ? Label(this.nom,Relative(1)) : autrenom;
  21. if (!affichernom) lab=null;
  22. draw(lab,graph(this.expression,xmin,xmax),stylo);
  23. }
  24. }
  25. ///////////////////////////////////////////////////
  26. ///////////////////////////////////////////////////
  27. ///////////////////////////////////////////////////
  28. ///////////////////////////////////////////////////
  29. size(5cm);
  30.  
  31. // Une définition classique de fonction, nommée f
  32. real f(real x){return x^2;};
  33. // Une liste de 4 objets de type 'fonction'
  34. // (avec une fonction définie précédemment et 3 fonctions anonymes (opérateur new))
  35. fonction mesfonctions[] =
  36. {
  37. fonction("$f$",f,-1,1),
  38. fonction("$g$",new real(real x){return x^2-1;},-1,1),
  39. fonction("$h$",new real(real x){return x^2-2;},-1.5,1.5),
  40. fonction("$k$",new real(real x){return x^2-3;},-2,2)
  41. };
  42. /// Deux courbes avec une mise en forme personnalisée
  43. mesfonctions[0].draw(false,-.5,.5,4bp+red);
  44. mesfonctions[1].draw(Label("$C_g$",Relative(0)),-1.5,1.5,4bp+green);
  45. /// Les 4 courbes, dans le style par défaut
  46. for(fonction f:mesfonctions) f.draw();


Il va de soi... que l'exemple proposé n'a rien de finalisé : il se veut un début d'exemple démonstratif de ce que l'on peut faire dans la création d'un nouveau type d'objet.

Re: Nom d'une fonction

Posté : mer. 19 mars 2014, 18:52
par maurice
Bonsoir,

pour répondre j'avais essayé ça :

Code : Tout sélectionner

struct fct {
  string nom;
  real f(real x);
  void operator init(string nom, real f(real x)){
    this.nom = nom;
    this.f = f;
  }
}

fct f = fct("$f$", real (real x) {return x^2;});

void affiche_nom(fct f) {
  label(f.nom, (1,1));
}

affiche_nom(f);


Il manquait le new dans la définition de f.
Peut-on avoir plus d'explication quant à l'usage du new ?

Bruno

Re: Nom d'une fonction

Posté : mer. 19 mars 2014, 22:25
par xavans
Bonjour,

et merci pour vos deux réponses, qui sont fort instructives .


En fait, je voulais éviter d'avoir à créer un nouvel objet qui contiendrait la fonction elle même ( par exemple real F(real x)(return x^2;)) et le nom de la fonction sous forme d'une chaîne de caractères ( qui serait alors "F").

Je me disais que ce serait pratique de pouvoir récupérer directement le nom de la fonction ( soit "F") sans avoir à créer de chaine de caractères ;
mais je vois que ce n'est pas possible.


Je me pose la même question que Bruno à propos de "new".

Bonne soirée,

Xavier .

Re: Nom d'une fonction

Posté : mer. 19 mars 2014, 23:28
par GM
Bonsoir,

maurice a écrit :Peut-on avoir plus d'explication quant à l'usage du new ?


Pas une grande explication de ma part... car je n'ai pas creusé la spécificité d'un new d'Asymptote par rapport au new du C++, dont Asymptote utilise une partie de la syntaxe.

Mais on peut au moins donner une explication basique, à savoir que... quand on veut passer une fonction en argument d'une autre, on a le choix entre
  • la définir et la nommer préalablement (comme f dans mon exemple que j'ai modifié) et se contenter de donner son nom en argument ;
  • ou... la passer comme une fonction anonyme avec l'opérateur new.

Si vous faites des recherches sur l'opérateur new en C++, vous pourrez lire qu'il y est question de subtilités au niveau de l'allocation dynamique de mémoire... mais comme je le disais, je ne sais pas ce que le new d'Asymptote a gardé des propriétés du new du C++. Il faudrait qu'un spécialiste (que je ne suis pas) se penche sur les sources d'Asymptote pour pouvoir nous en dire plus.

Re: Nom d'une fonction

Posté : jeu. 20 mars 2014, 04:53
par maurice
GM a écrit :Bonsoir,

maurice a écrit :Peut-on avoir plus d'explication quant à l'usage du new ?


Pas une grande explication de ma part... car je n'ai pas creusé la spécificité d'un new d'Asymptote par rapport au new du C++, dont Asymptote utilise une partie de la syntaxe.

Mais on peut au moins donner une explication basique, à savoir que... quand on veut passer une fonction en argument d'une autre, on a le choix entre
  • la définir et la nommer préalablement (comme f dans mon exemple que j'ai modifié) et se contenter de donner son nom en argument ;
  • ou... la passer comme une fonction anonyme avec l'opérateur new.



Merci je n'en demandais pas plus.

Bruno

Re: Nom d'une fonction

Posté : jeu. 20 mars 2014, 08:10
par xavans
Pour moi aussi,
c'est une réponse largement suffisante .

Merci,
Xavier .