OVH Cloud OVH Cloud

[Debutan C++] Retour pointeur

51 réponses
Avatar
PtitMat
Bonjour,

Je voudrais ecrire une fonction qui me retourne un pointeur vers une
variable.
Est-ce possible?
Je vous remercie pour votre aide

Mat.

10 réponses

2 3 4 5 6
Avatar
Pierre Maurette
Fabien LE LEZ a écrit:
[...]
Si tu comptes gérer l'erreur directement dans la fonction, lancer une
exception ne sert à rien.
Hors debug, je pense qu'on peut faire l'économie d'une vérification au

niveau de cette fonction. Si j'ai bien compris, des séquences de 3
entiers OpCode Operand Operand sont lues et interprétées. C'est au
niveau de ce parser qu'il faut décider, et signaler quelque chose du
genre:
"Erreur OpCode à l'adresse [ligne] xxx"
"Erreur à l'adresse [ligne] xxx / Registre hors limites"
etc.
La fonction pourrait lancer une exception traitée ailleurs, mais je
trouve que c'est se compliquer la vie.
--
Pierre

Avatar
kanze
Fabien LE LEZ wrote in message
news:...

On 18 Nov 2004 02:01:50 -0800, :

int&
Ccpu::dToR( int dx )
{
static int* const table[] > > { &pR0, &pR1, &pR2, &pR3, } ;


Je pensais mettre le tableau comme membre de la classe, au lieu de se
traîner les pR0, etc. dans toutes les fonctions membres.


À vrai dire, j'ai fait comme ça parce que je ne sais pas d'où viennent
les pR0, etc. en réalité. S'ils sont des données externes, et une donnée
du problème, c'est la solution ci-dessus que j'utiliserais. S'il sont
propre à ici, et que ce n'est qu'à travers cette fonction qu'on y
accède, ils seraient des variables locales statiques aussi, exactement
comme la table. Si on doit les utiliser aussi directement dans d'autres
contextes, ils pourraient être des variables membres.

Dans tous les cas, je crois que la table serait locale à la fonction.
C'est la fonction qui fournit l'interface du mapping. La table n'est
qu'un détail de l'implémentation de la fonction.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On 18 Nov 2004 02:01:50 -0800, :

Tu n'as aucun moyen d'en être sûr. Le mieux est de lancer une
exception en cas de paramètre incorrect.


Si la validité du paramètre est une précondition, une assertion vaut
mieux qu'une exception.


Mouais...

D'un autre côté, si jamais la condition s'avère fausse dans un cas
tordu et qu'on ne s'en rend compte que chez le client, j'aime autant
qu'il ait un message "Telle fonctionnalité a échoué" avec la
possibilité de rester dans le programme et de sauvegarder ses données,
plutôt qu'un message "assert() failed at line..., vous venez juste de
perdre vos modifications".


Ça dépend de l'application. Il m'arrive souvent en fait d'utiliser des
« assert » maison, surtout dans les applications client, justement pour
avoir un peu de contrôle sur le message d'erreur. Mais pour la reste :
si l'assert échoue, c'est que le programme ne marche pas, et les données
sont probablement corrompues. Dans ce cas-là, je tiens à faire le moins
possible avant de disparaître -- il n'est pas question d'essayer à
exécuter des destructeurs en nettoyant la pile, par exemple.

Mais tout dépend de l'application. J'ai l'habitude des applications plus
ou moins critiques. Où il y a toujours un système de back-up d'une sort
ou d'une autre, qui va réprendre le relai, et où on veut prendre un
minimum absolu de risque avec la possibilité des données corrompues.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Fabien LE LEZ
On Fri, 19 Nov 2004 10:45:49 +0100, Pierre Maurette
:

Hors debug, je pense qu'on peut faire l'économie d'une vérification au
niveau de cette fonction. [...]
C'est au niveau de ce parser qu'il faut décider


J'ai l'impression qu'on a des points de vue différents.
On a ici une fonction qui doit réagir à des arguments. La méthode
canonique est de vérifier les arguments, de façon à s'assurer que la
fonction renvoie quelque chose de sensé.
Si maintenant cette vérification pose des problèmes (par exemple, le
profiler indique qu'elle ralentit sensiblement l'exécution du
programme), alors seulement on peut se poser la question, et
éventuellement supprimer la vérification.


--
;-)

Avatar
Fabien LE LEZ
On 19 Nov 2004 02:11:07 -0800, :

J'ai l'habitude des applications plus
ou moins critiques. Où il y a toujours un système de back-up d'une sort
ou d'une autre


Ça m'aide à comprendre ton point de vue.
Je travaille généralement sur des applications "grand public", et la
plupart des utilisateurs pensent que le mot "backup" désigne une tribu
du Guatemala.


--
;-)

Avatar
drkm
Fabien LE LEZ writes:

On Thu, 18 Nov 2004 21:57:00 +0100, drkm :

Je ne te suis pas ...


C'est un cas d'école : on a un ensemble de données (ici, un tableau de
pointeurs), auquel on ne doit accéder que via une fonction. Dans un
tel cas, on met les données et la fonction dans une classe dont la
seule fonction est de limiter l'accès aux données.


Bof. Si les éléments sont connus à la compilation et qu'une
initialisation de tableau de la sorte :

int & f( int idx ) {
static int datas[] = { a , b , ... } ;
// ...
}

est possible, je ne vois pas l'intérêt. Je vois bien même une TU de
la forme :

Type & f( int idx ) {
static Type datas[] = {
// ... des centaines de valeurs, par exemple générées par un
// petit script externe ou fournies par le consortium Unicode
} ;
// ...
}

ou :

Value & f( Key const & k ) {
typedef std::map< Key , Value > Map ;
static Map::value_type const datas_init[] = {
// ... des centaines de valeurs, par exemple générées par un
// petit script externe ou fournies par le consortium Unicode
} ;
static Map const datas(
beginOf( datas_init ) ,
endOf( datas_init )
) ;
// ...
}

--drkm


Avatar
drkm
Fabien LE LEZ writes:

On Thu, 18 Nov 2004 20:44:49 +0000, PtitMat :

int lPc;
lPc = getPc();


Ce genre de truc, c'est du C. En C++ on écrira plutôt
int lPc= getPc();


[...]

int lPc;
lPc = getPc();//Prend la valeur de Program Counter


;-)

--drkm


Avatar
Fabien LE LEZ
On Fri, 19 Nov 2004 20:34:21 +0100, drkm :

Bof. Si les éléments sont connus à la compilation et qu'une
initialisation de tableau de la sorte :

int & f( int idx ) {
static int datas[] = { a , b , ... } ;
// ...
}

est possible, je ne vois pas l'intérêt.


Ben... En gros, on se retrouve avec des variables globales.

Autant je suis parfaitement d'accord si on renvoie un "int const&",
autant ici je suis plus dubitatif.


--
;-)

Avatar
Fabien LE LEZ
On Fri, 19 Nov 2004 20:34:21 +0100, drkm :

// ... des centaines de valeurs,


non-const ?

par exemple générées par un
// petit script externe ou fournies par le consortium Unicode



--
;-)

Avatar
drkm
Fabien LE LEZ writes:

On Fri, 19 Nov 2004 20:34:21 +0100, drkm :

// ... des centaines de valeurs,


non-const ?


Dans l'exemple auquel je pensais, si. Mais pas forcément.

--drkm


2 3 4 5 6