En fait pour tous mes paramétres j'ai une variable et un pointeur.
Au départ, je lie ce pointeur à mon paramétre.
Mais je peux aussi lier ce pointeur à un autre double défini par ailleurs.
C'est l'interet de cette méthode.
Par la suite, dans mes calcul d'ondes, je n'utilise pas ma variable Amp
(qui est définie uniquement pour le cas ou l'amplitude de mon onde ne
change pas), mais *PAmp (de maniére à pouvoir utiliser un paramétre ou une
sortie d'un autre objet générateur d'onde ou autre)
Ya une erreur dans mon raisonnement?
En fait pour tous mes paramétres j'ai une variable et un pointeur.
Au départ, je lie ce pointeur à mon paramétre.
Mais je peux aussi lier ce pointeur à un autre double défini par ailleurs.
C'est l'interet de cette méthode.
Par la suite, dans mes calcul d'ondes, je n'utilise pas ma variable Amp
(qui est définie uniquement pour le cas ou l'amplitude de mon onde ne
change pas), mais *PAmp (de maniére à pouvoir utiliser un paramétre ou une
sortie d'un autre objet générateur d'onde ou autre)
Ya une erreur dans mon raisonnement?
En fait pour tous mes paramétres j'ai une variable et un pointeur.
Au départ, je lie ce pointeur à mon paramétre.
Mais je peux aussi lier ce pointeur à un autre double défini par ailleurs.
C'est l'interet de cette méthode.
Par la suite, dans mes calcul d'ondes, je n'utilise pas ma variable Amp
(qui est définie uniquement pour le cas ou l'amplitude de mon onde ne
change pas), mais *PAmp (de maniére à pouvoir utiliser un paramétre ou une
sortie d'un autre objet générateur d'onde ou autre)
Ya une erreur dans mon raisonnement?
"Pascal Pizeine" a écrit dans le message de
news: dgubqu$ga0$En gros, j'ai un ensemble de générateurs d'ondes (éventuellement avec
des interconnections) et je peux changer la forme d'onde émise par
chacun de ces générateurs sans changer leurs interconncections...
Qu'en penses tu?
Tu pourrais avoir un objet générateur d'onde dont l'un des membre serait
une onde. Si tu changes de forme d'onde tu modifie cette variable.
Ca ressemble à ce que je tentais non?
Utiliser un indice permettant de choisir une fonction dans un tableau de
pointeur de fonctions.
Je pensait à une variable de type
"Pascal Pizeine" <pascal.pizeine@milesys.fr> a écrit dans le message de
news: dgubqu$ga0$1@s1.news.oleane.net...
En gros, j'ai un ensemble de générateurs d'ondes (éventuellement avec
des interconnections) et je peux changer la forme d'onde émise par
chacun de ces générateurs sans changer leurs interconncections...
Qu'en penses tu?
Tu pourrais avoir un objet générateur d'onde dont l'un des membre serait
une onde. Si tu changes de forme d'onde tu modifie cette variable.
Ca ressemble à ce que je tentais non?
Utiliser un indice permettant de choisir une fonction dans un tableau de
pointeur de fonctions.
Je pensait à une variable de type
"Pascal Pizeine" a écrit dans le message de
news: dgubqu$ga0$En gros, j'ai un ensemble de générateurs d'ondes (éventuellement avec
des interconnections) et je peux changer la forme d'onde émise par
chacun de ces générateurs sans changer leurs interconncections...
Qu'en penses tu?
Tu pourrais avoir un objet générateur d'onde dont l'un des membre serait
une onde. Si tu changes de forme d'onde tu modifie cette variable.
Ca ressemble à ce que je tentais non?
Utiliser un indice permettant de choisir une fonction dans un tableau de
pointeur de fonctions.
Je pensait à une variable de type
fptronde fonction [5];
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
fptronde fonction [5];
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
fptronde fonction [5];
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Son intérêt est dans la fonction virtuelle pure, qui permettra
d'accéder à ses classes dérivées depuis le tableau.
Son intérêt est dans la fonction virtuelle pure, qui permettra
d'accéder à ses classes dérivées depuis le tableau.
Son intérêt est dans la fonction virtuelle pure, qui permettra
d'accéder à ses classes dérivées depuis le tableau.
/* Note : cette macro pourraît
/* Note : cette macro pourraît
/* Note : cette macro pourraît
"cyrcocq" a écrit dans le message de news:
4332c7f0$0$309$Toujours pas d'amélioration... J'ai pas trouvé une site sur lequel je
pourrais trouver la réponse à mon probléme. Là, j'ai vraiment besoin d'un
coup de main!
Je t'ai fait un petit exemple qui n'est pas aboutit
mais qui exploite l'opérateur ( ) qui peut être utile
dans ton cas.
"cyrcocq" <cyrcocq@...> a écrit dans le message de news:
4332c7f0$0$309$7a628cd7@news.club-internet.fr...
Toujours pas d'amélioration... J'ai pas trouvé une site sur lequel je
pourrais trouver la réponse à mon probléme. Là, j'ai vraiment besoin d'un
coup de main!
Je t'ai fait un petit exemple qui n'est pas aboutit
mais qui exploite l'opérateur ( ) qui peut être utile
dans ton cas.
"cyrcocq" a écrit dans le message de news:
4332c7f0$0$309$Toujours pas d'amélioration... J'ai pas trouvé une site sur lequel je
pourrais trouver la réponse à mon probléme. Là, j'ai vraiment besoin d'un
coup de main!
Je t'ai fait un petit exemple qui n'est pas aboutit
mais qui exploite l'opérateur ( ) qui peut être utile
dans ton cas.
On Thu, 22 Sep 2005 13:41:25 +0200, "cyrcocq" :fptronde fonction [5];
Et un jour, tu ajouteras une fonction, et, ne te souvenant plus de la
signification (ou de l'existence) de ce "5", tu ne le modifieras
pas... et boum !
Je corrige donc cette faute de frappe :
std::vector <fptronde> fonction;
Autre souci : indexer ton tableau avec des entiers ne me paraît pas
adéquat. Que diable le "3" de "fonction[3]" ou de "type=3" peut-il
bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes fonctions dans
un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la fonction,
Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index pourra être le
texte affiché dans le menu, pour éviter les intermédiaires :
typedef std::string Index;
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Comme un foncteur.
Note : la solution ci-dessous peut n'être pas optimale. L'exécution le
dira...
#include <map>
template <class Index, class Contenu> class MapPointeurs
{
// Je déteste l'interface de std::map<> et son operator[] non-const,
// donc je l'encapsule pour redéfinir l'interface
public:
void AjouteElement (Index const& index, Contenu* ptr)
{
assert (data.find (index) == data.end());
// L'élément n'existe pas déjà
data[index]= ptr;
}
Contenu const& operator[] (Index const& index)
{
Data::const_iterator it= data.find (index);
assert (it != data.end());
return *((*it).second);
}
private:
typedef typename std::map <Index, Contenu*> Data;
Data data;
};
/* Note : cette macro pourraît n'en être pas une (i.e. on met le code
directement dans la classe), mais je l'ai laissée telle quelle pour
des raisons de symétrie.
Son intérêt est dans la fonction virtuelle pure, qui permettra
d'accéder à ses classes dérivées depuis le tableau.
*/
#define MACROFONCTEURS_INITIALISATION
class BaseFoncteur
{ public: virtual void operator() (double) const= 0;
virtual ~BaseFoncteur(){} };
typedef MapPointeurs <IndexFoncteurs, BaseFoncteur> MapFoncteurs;
MapFoncteurs map_foncteurs;
/* La macro déclare la fonction en elle-même, et crée un objet
dérivant de BaseFoncteur, dont la seule utilité est d'appeler la
fonction. L'objet s'inscrit lui-même dans le tableau.
*/
#define MACROFONCTEURS_DECLARE_FONCTION(nom_fonction, index, classe)
void nom_fonction (double);
class FONCTEUR_##nom_fonction;
friend class FONCTEUR_##nom_fonction;
class FONCTEUR_##nom_fonction: public BaseFoncteur
{
public:
FONCTEUR_##nom_fonction (classe& objet_)
: objet (objet_)
{ objet.map_foncteurs.AjouteElement (index, this); }
void operator() (double x) const
{ return objet.nom_fonction (x); }
private:
classe& objet;
};
FONCTEUR_##nom_fonction objet_FONCTEUR_##nom_fonction;
/* Je n'ai pas trouvé le moyen d'éviter cette macro. D'ailleurs, si
quelqu'un le connaît, ça m'intéresse...
*/
#define MACROFONCTEURS_INTEGRATION_FONCTION( nom_fonction)
objet_FONCTEUR_##nom_fonction (*this)
class onde
{
private:
typedef std::string IndexFoncteurs;
MACROFONCTEURS_INITIALISATION
MACROFONCTEURS_DECLARE_FONCTION (sinusoide, "Sinusoïde", onde)
MACROFONCTEURS_DECLARE_FONCTION (carree, "Carrée", onde)
public:
onde();
void LancerFonction (IndexFoncteurs const& index, double x)
{ // Un exemple (assez bidon) d'utilisation de ce machin
map_foncteurs[index](x);
}
};
onde::onde ()
: MACROFONCTEURS_INTEGRATION_FONCTION (sinusoide)
, MACROFONCTEURS_INTEGRATION_FONCTION (carree)
/* Détail intéressant : si jamais tu oublies une de ces lignes, le
compilateur râlera -- "Can't find default constructor for..." */
{
}
void onde::sinusoide (double x)
{
// do something with
x;
}
void onde::carree (double x)
{
// do something with
x;
}
int main()
{
onde mon_onde;
mon_onde.LancerFonction ("Carrée", 12);
}
On Thu, 22 Sep 2005 13:41:25 +0200, "cyrcocq" <cyrcocq@...>:
fptronde fonction [5];
Et un jour, tu ajouteras une fonction, et, ne te souvenant plus de la
signification (ou de l'existence) de ce "5", tu ne le modifieras
pas... et boum !
Je corrige donc cette faute de frappe :
std::vector <fptronde> fonction;
Autre souci : indexer ton tableau avec des entiers ne me paraît pas
adéquat. Que diable le "3" de "fonction[3]" ou de "type=3" peut-il
bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes fonctions dans
un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la fonction,
Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index pourra être le
texte affiché dans le menu, pour éviter les intermédiaires :
typedef std::string Index;
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Comme un foncteur.
Note : la solution ci-dessous peut n'être pas optimale. L'exécution le
dira...
#include <map>
template <class Index, class Contenu> class MapPointeurs
{
// Je déteste l'interface de std::map<> et son operator[] non-const,
// donc je l'encapsule pour redéfinir l'interface
public:
void AjouteElement (Index const& index, Contenu* ptr)
{
assert (data.find (index) == data.end());
// L'élément n'existe pas déjà
data[index]= ptr;
}
Contenu const& operator[] (Index const& index)
{
Data::const_iterator it= data.find (index);
assert (it != data.end());
return *((*it).second);
}
private:
typedef typename std::map <Index, Contenu*> Data;
Data data;
};
/* Note : cette macro pourraît n'en être pas une (i.e. on met le code
directement dans la classe), mais je l'ai laissée telle quelle pour
des raisons de symétrie.
Son intérêt est dans la fonction virtuelle pure, qui permettra
d'accéder à ses classes dérivées depuis le tableau.
*/
#define MACROFONCTEURS_INITIALISATION
class BaseFoncteur
{ public: virtual void operator() (double) const= 0;
virtual ~BaseFoncteur(){} };
typedef MapPointeurs <IndexFoncteurs, BaseFoncteur> MapFoncteurs;
MapFoncteurs map_foncteurs;
/* La macro déclare la fonction en elle-même, et crée un objet
dérivant de BaseFoncteur, dont la seule utilité est d'appeler la
fonction. L'objet s'inscrit lui-même dans le tableau.
*/
#define MACROFONCTEURS_DECLARE_FONCTION(nom_fonction, index, classe)
void nom_fonction (double);
class FONCTEUR_##nom_fonction;
friend class FONCTEUR_##nom_fonction;
class FONCTEUR_##nom_fonction: public BaseFoncteur
{
public:
FONCTEUR_##nom_fonction (classe& objet_)
: objet (objet_)
{ objet.map_foncteurs.AjouteElement (index, this); }
void operator() (double x) const
{ return objet.nom_fonction (x); }
private:
classe& objet;
};
FONCTEUR_##nom_fonction objet_FONCTEUR_##nom_fonction;
/* Je n'ai pas trouvé le moyen d'éviter cette macro. D'ailleurs, si
quelqu'un le connaît, ça m'intéresse...
*/
#define MACROFONCTEURS_INTEGRATION_FONCTION( nom_fonction)
objet_FONCTEUR_##nom_fonction (*this)
class onde
{
private:
typedef std::string IndexFoncteurs;
MACROFONCTEURS_INITIALISATION
MACROFONCTEURS_DECLARE_FONCTION (sinusoide, "Sinusoïde", onde)
MACROFONCTEURS_DECLARE_FONCTION (carree, "Carrée", onde)
public:
onde();
void LancerFonction (IndexFoncteurs const& index, double x)
{ // Un exemple (assez bidon) d'utilisation de ce machin
map_foncteurs[index](x);
}
};
onde::onde ()
: MACROFONCTEURS_INTEGRATION_FONCTION (sinusoide)
, MACROFONCTEURS_INTEGRATION_FONCTION (carree)
/* Détail intéressant : si jamais tu oublies une de ces lignes, le
compilateur râlera -- "Can't find default constructor for..." */
{
}
void onde::sinusoide (double x)
{
// do something with
x;
}
void onde::carree (double x)
{
// do something with
x;
}
int main()
{
onde mon_onde;
mon_onde.LancerFonction ("Carrée", 12);
}
On Thu, 22 Sep 2005 13:41:25 +0200, "cyrcocq" :fptronde fonction [5];
Et un jour, tu ajouteras une fonction, et, ne te souvenant plus de la
signification (ou de l'existence) de ce "5", tu ne le modifieras
pas... et boum !
Je corrige donc cette faute de frappe :
std::vector <fptronde> fonction;
Autre souci : indexer ton tableau avec des entiers ne me paraît pas
adéquat. Que diable le "3" de "fonction[3]" ou de "type=3" peut-il
bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes fonctions dans
un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la fonction,
Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index pourra être le
texte affiché dans le menu, pour éviter les intermédiaires :
typedef std::string Index;
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Comme un foncteur.
Note : la solution ci-dessous peut n'être pas optimale. L'exécution le
dira...
#include <map>
template <class Index, class Contenu> class MapPointeurs
{
// Je déteste l'interface de std::map<> et son operator[] non-const,
// donc je l'encapsule pour redéfinir l'interface
public:
void AjouteElement (Index const& index, Contenu* ptr)
{
assert (data.find (index) == data.end());
// L'élément n'existe pas déjà
data[index]= ptr;
}
Contenu const& operator[] (Index const& index)
{
Data::const_iterator it= data.find (index);
assert (it != data.end());
return *((*it).second);
}
private:
typedef typename std::map <Index, Contenu*> Data;
Data data;
};
/* Note : cette macro pourraît n'en être pas une (i.e. on met le code
directement dans la classe), mais je l'ai laissée telle quelle pour
des raisons de symétrie.
Son intérêt est dans la fonction virtuelle pure, qui permettra
d'accéder à ses classes dérivées depuis le tableau.
*/
#define MACROFONCTEURS_INITIALISATION
class BaseFoncteur
{ public: virtual void operator() (double) const= 0;
virtual ~BaseFoncteur(){} };
typedef MapPointeurs <IndexFoncteurs, BaseFoncteur> MapFoncteurs;
MapFoncteurs map_foncteurs;
/* La macro déclare la fonction en elle-même, et crée un objet
dérivant de BaseFoncteur, dont la seule utilité est d'appeler la
fonction. L'objet s'inscrit lui-même dans le tableau.
*/
#define MACROFONCTEURS_DECLARE_FONCTION(nom_fonction, index, classe)
void nom_fonction (double);
class FONCTEUR_##nom_fonction;
friend class FONCTEUR_##nom_fonction;
class FONCTEUR_##nom_fonction: public BaseFoncteur
{
public:
FONCTEUR_##nom_fonction (classe& objet_)
: objet (objet_)
{ objet.map_foncteurs.AjouteElement (index, this); }
void operator() (double x) const
{ return objet.nom_fonction (x); }
private:
classe& objet;
};
FONCTEUR_##nom_fonction objet_FONCTEUR_##nom_fonction;
/* Je n'ai pas trouvé le moyen d'éviter cette macro. D'ailleurs, si
quelqu'un le connaît, ça m'intéresse...
*/
#define MACROFONCTEURS_INTEGRATION_FONCTION( nom_fonction)
objet_FONCTEUR_##nom_fonction (*this)
class onde
{
private:
typedef std::string IndexFoncteurs;
MACROFONCTEURS_INITIALISATION
MACROFONCTEURS_DECLARE_FONCTION (sinusoide, "Sinusoïde", onde)
MACROFONCTEURS_DECLARE_FONCTION (carree, "Carrée", onde)
public:
onde();
void LancerFonction (IndexFoncteurs const& index, double x)
{ // Un exemple (assez bidon) d'utilisation de ce machin
map_foncteurs[index](x);
}
};
onde::onde ()
: MACROFONCTEURS_INTEGRATION_FONCTION (sinusoide)
, MACROFONCTEURS_INTEGRATION_FONCTION (carree)
/* Détail intéressant : si jamais tu oublies une de ces lignes, le
compilateur râlera -- "Can't find default constructor for..." */
{
}
void onde::sinusoide (double x)
{
// do something with
x;
}
void onde::carree (double x)
{
// do something with
x;
}
int main()
{
onde mon_onde;
mon_onde.LancerFonction ("Carrée", 12);
}
Donc si je comprends bien (Stan et Fabien) l'approche tableau de pointeur de
fonction est a remplacer par une approche de foncteur.
Mais c'est frustrant de ne pas avoir réussi à utiliser le tableau de
pointeur de fonction!...
Donc si je comprends bien (Stan et Fabien) l'approche tableau de pointeur de
fonction est a remplacer par une approche de foncteur.
Mais c'est frustrant de ne pas avoir réussi à utiliser le tableau de
pointeur de fonction!...
Donc si je comprends bien (Stan et Fabien) l'approche tableau de pointeur de
fonction est a remplacer par une approche de foncteur.
Mais c'est frustrant de ne pas avoir réussi à utiliser le tableau de
pointeur de fonction!...
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
Faut dire que je débute l'aspect objet, je ne sais pas si je peux déjà dire
que j'ai commencé la librairie standard...
J'ai bien l'impression que vous étes d'accord sur cet aspect! Tant pis pour
ma tentative d'assimilation progressive
Decidemment, c'est frustrant de ne pas avoir trouvé/compris la méthode pour
utliser ce tableau de pointeur de fonction
typedef void (onde::*fptronde) (double);
fonction[0]=&onde::sinusoide;
// J'initialise le premier pointeur de mon tableau
fonction[0] (t);
[snip quelques dizaines de lignes de code]
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
Faut dire que je débute l'aspect objet, je ne sais pas si je peux déjà dire
que j'ai commencé la librairie standard...
J'ai bien l'impression que vous étes d'accord sur cet aspect! Tant pis pour
ma tentative d'assimilation progressive
Decidemment, c'est frustrant de ne pas avoir trouvé/compris la méthode pour
utliser ce tableau de pointeur de fonction
typedef void (onde::*fptronde) (double);
fonction[0]=&onde::sinusoide;
// J'initialise le premier pointeur de mon tableau
fonction[0] (t);
[snip quelques dizaines de lignes de code]
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
Faut dire que je débute l'aspect objet, je ne sais pas si je peux déjà dire
que j'ai commencé la librairie standard...
J'ai bien l'impression que vous étes d'accord sur cet aspect! Tant pis pour
ma tentative d'assimilation progressive
Decidemment, c'est frustrant de ne pas avoir trouvé/compris la méthode pour
utliser ce tableau de pointeur de fonction
typedef void (onde::*fptronde) (double);
fonction[0]=&onde::sinusoide;
// J'initialise le premier pointeur de mon tableau
fonction[0] (t);
[snip quelques dizaines de lignes de code]