"Loïc MICHEL" wrote in message news:<bkmilq$qt7$...
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: 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
"Loïc MICHEL" <loic.michel54@wanadoo.fr> wrote in message
news:<bkmilq$qt7$1@news-reader2.wanadoo.fr>...
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@gabi-soft.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
"Loïc MICHEL" wrote in message news:<bkmilq$qt7$...
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: 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
kanze
Jerome Fuselier wrote in message news:...
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: 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
Jerome Fuselier <jerome.fuselier@xrce.xerox.com> wrote in message
news:<3F6EE48F.7070505@xrce.xerox.com>...
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@gabi-soft.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
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: 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
kanze
Jerome Fuselier wrote in message news:...
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 :
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: 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
Jerome Fuselier <jerome.fuselier@xrce.xerox.com> wrote in message
news:<3F6EE48F.7070505@xrce.xerox.com>...
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 :
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@gabi-soft.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
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: 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
Gabriel Dos Reis
writes:
| 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
kanze@gabi-soft.fr writes:
| 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.)
| 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
Christophe Lephay
a écrit dans le message de news:
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
<kanze@gabi-soft.fr> a écrit dans le message de
news:d6652001.0309230353.6376fb81@posting.google.com...
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...
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
Gabriel Dos Reis
Fabien LE LEZ writes:
| On 23 Sep 2003 14:04:57 +0200, Gabriel Dos Reis | 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++ ?
| 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
Fabien LE LEZ <gramster@gramster.com> writes:
| On 23 Sep 2003 14:04:57 +0200, Gabriel Dos Reis
| <dosreis@cmla.ens-cachan.fr> 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++ ?
| 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.
| On 23 Sep 2003 14:04:57 +0200, Gabriel Dos Reis | 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++ ?
| 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
Loïc Joly
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 !
-- Loïc
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 !
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
Loïc Joly
Gabriel Dos Reis wrote:
Fabien LE LEZ 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
Gabriel Dos Reis wrote:
Fabien LE LEZ <gramster@gramster.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 ?