 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Loïc MICHEL Guest
|
Posted: Mon Sep 22, 2003 10:24 am Post subject: Problème avec les compositions de fonctions |
|
|
Bonjour à tous,
Je travaille avec kdevelop 3.1.0 sous Mandrake linux 9.1. J'essaie
d'utiliser des fonctions dans d'autres fonctions, par exemple :
double fe (double x);
double f (double x, double fe, double a){
return fe(a)-a; }
Ceci etant un fichier externe déclaré dans main.cpp
Le compilateur me retourne : "fe cannot be used as a fonction"
La littérature consacrée au language ne précise pas comment effectuer ces
compositions. Que faire ?
Par avance, merci.
L.M.
|
|
| Back to top |
|
 |
Richard Delorme Guest
|
Posted: Mon Sep 22, 2003 11:31 am Post subject: Re: Problème avec les compositions de fonctions |
|
|
Loïc MICHEL a écrit :
| Quote: | Bonjour à tous,
Je travaille avec kdevelop 3.1.0 sous Mandrake linux 9.1. J'essaie
d'utiliser des fonctions dans d'autres fonctions, par exemple :
double fe (double x);
^^
double f (double x, double fe, double a){
^^<- problème
return fe(a)-a; }
Ceci etant un fichier externe déclaré dans main.cpp
Le compilateur me retourne : "fe cannot be used as a fonction"
|
Un des paramètres de la fonction s'appelle aussi fe et il cache la fonction
de même nom. A priori, tu veux juste :
double fe(double x);
double f(double a) {
return fe(a) - a;
}
--
Richard
|
|
| Back to top |
|
 |
Jerome Fuselier Guest
|
Posted: Mon Sep 22, 2003 12:01 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
Bonjour
| Quote: |
Je travaille avec kdevelop 3.1.0 sous Mandrake linux 9.1. J'essaie
d'utiliser des fonctions dans d'autres fonctions, par exemple :
double fe (double x);
^^
double f (double x, double fe, double a){
^^<- problème
return fe(a)-a; }
Ceci etant un fichier externe déclaré dans main.cpp
Le compilateur me retourne : "fe cannot be used as a fonction"
Un des paramètres de la fonction s'appelle aussi fe et il cache la fonction
de même nom. A priori, tu veux juste :
double fe(double x);
double f(double a) {
return fe(a) - a;
}
|
Je pense qu'il cherche plutôt à passer une fonction comme paramêtre. La syntaxe est un peu compliquée
pour pouvoir l'expliquer dans un message, je vous indique donc une adresse qui explique clairement comment faire.
http://www.ann.jussieu.fr/courscpp/Sections/Sect05-H0.html
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Sep 22, 2003 2:30 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
"Loïc MICHEL" <loic.michel54 (AT) wanadoo (DOT) fr> wrote
| Quote: | Je travaille avec kdevelop 3.1.0 sous Mandrake linux 9.1. J'essaie
d'utiliser des fonctions dans d'autres fonctions, par exemple :
double fe (double x);
double f (double x, double fe, double a){
return fe(a)-a; }
Ceci etant un fichier externe déclaré dans main.cpp
Le compilateur me retourne : "fe cannot be used as a fonction"
|
Ce n'est pas trop clair ce que tu cherches à faire, mais dans ta
fonction f, fe est un paramètre de type double, et non une fonction.
Si le but est d'appeler la fonction fe, il suffit de changer le nom du
paramètre, afin que la fonction reste visible.
Si le but est d'appeler une fonction passée comme paramètre, il faut
déclarer que le paramètre est un pointeur à une fonction, et non un
double :
double
f( double x, double (*fe)( double ), double a )
{
return (*fe)(a) - a ;
}
En C++, en revanche, il est bien plus fréquent d'utiliser un objet
fonctionnel, soit au moyen d'un template, soit en tant que classe de
base abstraite.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Sep 23, 2003 11:42 am Post subject: Re: Problème avec les compositions de fonctions |
|
|
Jerome Fuselier <jerome.fuselier (AT) xrce (DOT) xerox.com> wrote
| Quote: | Je pense qu'il cherche plutôt à passer une fonction comme paramêtre.
La syntaxe est un peu compliquée pour pouvoir l'expliquer dans un
message,
|
Tu rigoles ?
La syntaxe en soi n'a rien de compliqué. Ce qui rend parfois les choses
compliquées, c'est l'utilisation de la syntaxe en contexte -- une
syntaxe simple, embriquée dans une autre syntaxe simple, embriquées ...
finit par être compliqué. Déclarer un pointeur à une fonction qui
renvoie un pointeur à une fonction, par exemple...
C'est là, évidemment, que les typedef vient au secours :
typedef double (*PtrAMaFnc)( double ) ;
double
f( double a, PtrAMaFnc fnc )
{
return (*fnc)( a ) ;
}
Mais peut-être tu voulais dire qu'en général, les priorités des nombreux
opérateurs C++ n'est pas facile à tenir en tête. Là, j'avoue être
d'accord. Alors, dans la doute, je mets des parenthèses. (En
l'occurance, ils sont nécessaires ci-dessus. Mais j'en mets parfois sans
savoir s'ils sont nécessaires ou non.)
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Sep 23, 2003 11:53 am Post subject: Re: Problème avec les compositions de fonctions |
|
|
Jerome Fuselier <jerome.fuselier (AT) xrce (DOT) xerox.com> wrote
| Quote: | Je travaille avec kdevelop 3.1.0 sous Mandrake linux 9.1. J'essaie
d'utiliser des fonctions dans d'autres fonctions, par exemple :
double fe (double x);
^^
double f (double x, double fe, double a){
^^<- problème
return fe(a)-a; }
Ceci etant un fichier externe déclaré dans main.cpp
Le compilateur me retourne : "fe cannot be used as a fonction"
Un des paramètres de la fonction s'appelle aussi fe et il cache la
fonction de même nom. A priori, tu veux juste :
double fe(double x);
double f(double a) {
return fe(a) - a;
}
Je pense qu'il cherche plutôt à passer une fonction comme paramêtre.
|
P'êt' ben qu'oui, P'êt' ben que non.
Le problème, c'est qu'il n'a pas bien expliqué le problème. Alors, je
rappelle le propos de Dijkstra : « Besides a mathematical inclination,
an exceptionally good mastery of one's native tongue is the most vital
asset of a competent programmer ». Avant de maîtriser le C++, il faut
maîtriser le français (ou l'anglais, ou ...). Si on ne sait pas formuler
le problème d'une façon précise, on ne saurait jamais le résoudre. (Et
je ne vise pas le posteur initial uniquement. C'est malheureusement un
problème général.)
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 23, 2003 12:04 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
| Quote: | typedef double (*PtrAMaFnc)( double ) ;
double
f( double a, PtrAMaFnc fnc )
{
return (*fnc)( a ) ;
}
Mais peut-être tu voulais dire qu'en général, les priorités des nombreux
opérateurs C++ n'est pas facile à tenir en tête. Là, j'avoue être
d'accord. Alors, dans la doute, je mets des parenthèses. (En
l'occurance, ils sont nécessaires ci-dessus. Mais j'en mets parfois sans
savoir s'ils sont nécessaires ou non.)
|
En l'occurence, elles ne sont pas nécessaires
return fnc(a);
-- Gaby
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Tue Sep 23, 2003 12:37 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de
news:d6652001.0309230353.6376fb81 (AT) posting (DOT) google.com...
| Quote: | Le problème, c'est qu'il n'a pas bien expliqué le problème. Alors, je
rappelle le propos de Dijkstra : « Besides a mathematical inclination,
an exceptionally good mastery of one's native tongue is the most vital
asset of a competent programmer ». Avant de maîtriser le C++, il faut
maîtriser le français (ou l'anglais, ou ...). Si on ne sait pas formuler
le problème d'une façon précise, on ne saurait jamais le résoudre.
|
Pourtant, la connaissance d'une ou plusieurs solutions est souvent un
préalable à la bonne formulation du problème. C'est la définition d'un
problème pervers : un problème qu'on ne peut formuler qu'une fois l'avoir
résolu.
L'incapacité à exprimer correctement un problème n'est pas toujours liée à
des lacunes linguistiques, hélas...
Chris
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 23, 2003 7:47 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | On 23 Sep 2003 14:04:57 +0200, Gabriel Dos Reis
[email]dosreis (AT) cmla (DOT) ens-cachan.fr[/email]> wrote:
En l'occurence, elles ne sont pas nécessaires
return fnc(a);
D'ailleurs je trouve le terme "pointeur de/sur une fonction" plutôt
mal choisi, puisqu'un pointeur de fonction n'est pas vraiment un
pointeur (pas convertible en void*)
|
je ne comprends pas cette partie de l'argumentation. Que penses-tu
que pointeur veut dire, en C++ ?
| Quote: | et ne s'utilise pas comme un
pointeur (pas besoin de l'opérateur "*")...
|
Ça, c'est une invention du comité en ANSI C ; une invention que le
Père a refusé de suivre en ce qui concerne les pointeurs sur membre.
-- Gaby
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Tue Sep 23, 2003 8:22 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
Fabien LE LEZ wrote:
| Quote: | D'ailleurs je trouve le terme "pointeur de/sur une fonction" plutôt
mal choisi, puisqu'un pointeur de fonction n'est pas vraiment un
pointeur (pas convertible en void*)
|
std::cout peut se convertir en void*, donc std::cout est un pointeur !
--
Loïc
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Tue Sep 23, 2003 8:24 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
Gabriel Dos Reis wrote:
| Quote: | Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| et ne s'utilise pas comme un
| pointeur (pas besoin de l'opérateur "*")...
Ça, c'est une invention du comité en ANSI C ; une invention que le
Père a refusé de suivre en ce qui concerne les pointeurs sur membre.
|
Ce qui a pour effet d'introduire une brisure de symétrie. Y avait-il un
autre intérêt qu'une histoire de goût à faire ce choix ?
--
Loïc
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 23, 2003 8:38 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Quote: | Gabriel Dos Reis wrote:
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| et ne s'utilise pas comme un
| pointeur (pas besoin de l'opérateur "*")...
Ça, c'est une invention du comité en ANSI C ; une invention que le
Père a refusé de suivre en ce qui concerne les pointeurs sur membre.
Ce qui a pour effet d'introduire une brisure de symétrie.
|
S'il y a brisure de symétrie, je ne suis pas certain qu'il soit du
côté de C++ (à part retenir la règle de ANSI C pour compatibilité).
C++ de ce point de vue là (i.e. pointer sur membre) est 100% cohérent
avec C classique et le principe général que si on a un pointeur alors
appliquer * permet d'accéder à la valeur pointée.
| Quote: | Y avait-il un
autre intérêt qu'une histoire de goût à faire ce choix ?
|
Voir ci-dessus.
-- Gaby
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 23, 2003 9:59 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
"Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:
| Quote: | "Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message news:
bkqa1r$vrn$1 (AT) news-reader4 (DOT) wanadoo.fr...
Fabien LE LEZ wrote:
D'ailleurs je trouve le terme "pointeur de/sur une fonction" plutôt
mal choisi, puisqu'un pointeur de fonction n'est pas vraiment un
pointeur (pas convertible en void*)
std::cout peut se convertir en void*, donc std::cout est un pointeur !
Sophisme.
|
Nullement. Cela amène simplement Fabien à regarder de plus près son
assertion initiale.
-- Gaby
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Tue Sep 23, 2003 10:51 pm Post subject: Re: Problème avec les compositions de fonctions |
|
|
le Tuesday 23 September 2003 23:59, [email]dosreis (AT) cmla (DOT) ens-cachan.fr[/email] écrivit :
| Quote: | "Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:
| "Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message news:
| bkqa1r$vrn$1 (AT) news-reader4 (DOT) wanadoo.fr...
| > Fabien LE LEZ wrote:
|
| > > D'ailleurs je trouve le terme "pointeur de/sur une fonction" plutôt
| > > mal choisi, puisqu'un pointeur de fonction n'est pas vraiment un
| > > pointeur (pas convertible en void*)
|
| > std::cout peut se convertir en void*, donc std::cout est un pointeur !
|
| Sophisme.
Nullement. Cela amène simplement Fabien à regarder de plus près son
assertion initiale.
|
Fabien : pas convertible en void* => pas vraiment en pointeur
Loïc : ah, mais alors, comme cout est convertible en void *,
cout est un pointeur
C'est implicitement un raisonnement pour justifier que Fabien a tort.
Mais comme il fait dire à l'implication de Fabien ce qu'elle ne veut pas
dire, le raisonnement est faux. (indépendamment de la vérité ou non de
l'assertion initiale de Fabien)
Qu'on appelle ça un sophisme ou pas, c'est une question de Français. Pour ma
part avec les définitions de http://zeus.inalf.cnrs.fr/ je ne sais pas.
--
Sam
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Wed Sep 24, 2003 5:21 am Post subject: Re: Problème avec les compositions de fonctions |
|
|
Dans news:flk77zkzp0.fsf (AT) sel (DOT) cmla.ens-cachan.fr, Gabriel Dos
Reis <dosreis (AT) cmla (DOT) ens-cachan.fr> a écrit :
| Quote: | S'il y a brisure de symétrie, je ne suis pas certain qu'il soit du
côté de C++ (à part retenir la règle de ANSI C pour compatibilité).
C++ de ce point de vue là (i.e. pointer sur membre) est 100%
cohérent avec C classique et le principe général que si on a un
pointeur alors appliquer * permet d'accéder à la valeur pointée.
|
Je ne suis pas certain, * n'est pas le seul opérateur de
déréférencement. On peut voir l'appel de fonction comme une sorte
de déréférencement. Comparons :
int a[100];
int *b= a;
int c= b[0];
int d(int e[]) { return e[0]; }
int f(int *g) { return *g; }
d(a); d(b);
f(a); f(b);
Avec
int A(int);
int (*B)(int)= A;
int C= B(0);
int D(int E(int)) { return E(0); }
int F(int (*G)(int)) { return (*G)(0); }
D(A); D(B);
F(A); F(B);
Ça me semble assez cohérent :-)
(Je sais, je n'ai mis que ce qui est cohérent :-)
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|