OVH Cloud OVH Cloud

Variable non nommée

15 réponses
Avatar
AG
Bonjour,

Je suis sur un code dans lequel il y a la déclaration suivante, dans
le main :

int a=2;

A A(a);

ou A est une class contenant que des membres statiques:

class A
{
static int a1;
public:
A();
A(int);
static int geta(void);
}


J'ai un peu de mal avec cette "déclaration". En essayant de
comprendre, il s'agit d'une variable non nommée ? Ai-je bon ?

l'acces au membre a1 se fait par A::geta(). J'ai besoin de pouvoir
enregistrer la class dans un fichier. j'ai donc défini :

friend ostream & operator<<(ostream & o, A& m);

mais la variable crée par "A A(a);" n'est pas utilisable par ma
fonction. Pourriez vous m'expliquer pourquoi et dans quels cas on
utilise de telle variable "non nommée" ?

Merci d'avance,

Alexandre.

5 réponses

1 2
Avatar
Sylvain
Michael DOUBEZ wrote on 10/05/2007 12:36:

C'est pas sûr, plus on utilise un générateur de nombres aléatoire entre
plusieurs modules, plus les nombres sont décorrélés (pour un module, ça
correspond à un sampling de la sortie du générateur). Un des meilleur
système que j'ai utilisé était un processus en arrière plan qui générait
des nombre continuellement et de lui en demander un quand on en avait
besoin.


tous les algos un tant soit peu sérieux que je connaisse dispose d'un
pool - calculé en arrière plan ou quand c'est nécessaire (ie quand vide)
- MT19937 utilise un pool de 624 int32 par exemple; pour autant générer
des nombres en continu n'a pas d'intérêt / sens particulier, et la
qualité de la distribution n'est nullement liée à la taille de ce pool,
une implémentation certifiable FIPS basée sur DES aura par exemple un
pool de 20 octets.

Un des intérêts d'avoir une classe de nombre aléatoire est
éventuellement d'en utiliser plusieurs instances initialisés à des seeds
différents pour généré des nombres en les combinant. Ca augmente la
cyclicité du générateur global tout en diminuant la prédictibilité.


je pense plutôt que la qualité de la distribution est inhérente à l'algo
seul, penser améliorer quelque chose en "combinant" a posteriori est
souvent une erreur motivée par le patch sur le patch qui corrigerait
tout (en fait rien).

Un autre est de fournir la reproductibilité des résultats en cas
d'utilisation multithread en utilisant une instance par thread.


ces arguments allant donc dans le sens de déclarations d'instances, non
statiques, je ne suis pas sur de comprendre le "c'est pas sur" initial.

Sylvain.

Avatar
AG
Merci à tous pour vos réponses.

Je comprends qu'il s'agit donc bien de code mal écrit, et que nommer
la variable avec le même nom que celui de la classe est une mauvaise
pratique, qui ne sert à rien sinon à brouiller les pistes. Je note
aussi que c'est autorisé par la norme, et que ça ne risque pas de
casser le code (comportement indéfini, etc...).

Je m'en vais batailler contre cette pratique. Merci pour la solution
du singleton, idiome que je ne connaissait pas (encore).

Alexandre.
Avatar
Fabien LE LEZ
On Thu, 10 May 2007 15:52:44 +0200, "AG" :

Je comprends qu'il s'agit donc bien de code mal écrit, et que nommer
la variable avec le même nom que celui de la classe est une mauvaise
pratique, qui ne sert à rien sinon à brouiller les pistes.


Un autre truc qui est également très douteux : utiliser un
constructeur pour initialiser uniquement des variables statiques.

Je note
aussi que c'est autorisé par la norme, et que ça ne risque pas de
casser le code (comportement indéfini, etc...).


Que se passe-t-il si on fait ceci ?

A A (42);
A b (84);

Avatar
AG
Que se passe-t-il si on fait ceci ?

A A (42);
A b (84);


Certes

Avatar
Michael DOUBEZ
Michael DOUBEZ wrote on 10/05/2007 12:36:

C'est pas sûr, plus on utilise un générateur de nombres aléatoire
entre plusieurs modules, plus les nombres sont décorrélés (pour un
module, ça correspond à un sampling de la sortie du générateur). Un
des meilleur système que j'ai utilisé était un processus en arrière
plan qui générait des nombre continuellement et de lui en demander un
quand on en avait besoin.


tous les algos un tant soit peu sérieux que je connaisse dispose d'un
pool - calculé en arrière plan ou quand c'est nécessaire (ie quand vide)
- MT19937 utilise un pool de 624 int32 par exemple; pour autant générer
des nombres en continu n'a pas d'intérêt / sens particulier, et la
qualité de la distribution n'est nullement liée à la taille de ce pool,
une implémentation certifiable FIPS basée sur DES aura par exemple un
pool de 20 octets.


C'était une application de sécurité. Le Mersenne Twister n'était pas
assez bon, il faut croire. Je ne suis pas un spécialiste mais
intuitivement, j'avais compris que ce genre de technique permettais de
sampler une séquence imprévisible sur le domaine de sortie du générateur
(qui plus tard serait remplacé par un système hardware, c'est peut être
la raison).


Un des intérêts d'avoir une classe de nombre aléatoire est
éventuellement d'en utiliser plusieurs instances initialisés à des
seeds différents pour généré des nombres en les combinant. Ca augmente
la cyclicité du générateur global tout en diminuant la prédictibilité.


je pense plutôt que la qualité de la distribution est inhérente à l'algo
seul, penser améliorer quelque chose en "combinant" a posteriori est
souvent une erreur motivée par le patch sur le patch qui corrigerait
tout (en fait rien).

Un autre est de fournir la reproductibilité des résultats en cas
d'utilisation multithread en utilisant une instance par thread.


ces arguments allant donc dans le sens de déclarations d'instances, non
statiques, je ne suis pas sur de comprendre le "c'est pas sur" initial.


Tu as raison, je pensais au fait qu'utiliser une seule instance de RNG
permettait de le faire fonctionner sur un plus grand domaine. C'est pas
essentiel et sans doute inutile.

Michael.


1 2