C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Constantes modifiables en C++
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Pierre Maurette
Guest





PostPosted: Wed Apr 21, 2004 4:19 pm    Post subject: Constantes modifiables en C++ Reply with quote



Bonjour,
Il est fréquent que des variables (de tous types) soient initialisées
par la lecture d'un fichier INI par exemple, voire un calcul ou
l'appel d'une fonction en début de programme.
Il peut arriver que ces "constantes" soient modifiables
"exceptionnellement" par un utilisateur identifié (on peut alors se
ramener au précédent, par clôture/initialisation).
Il me semble normal de conserver le statut const à ces variables. Pour
l'instant, j'utilise quelques cast, et ça roule.

J'aimerais connaître la stratégie des uns et des autres face à ce
petit problème.
--
Merci,

Pierre
Back to top
Falk Tannhäuser
Guest





PostPosted: Wed Apr 21, 2004 4:50 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote



Pierre Maurette wrote:
Quote:

Bonjour,
Il est fréquent que des variables (de tous types) soient initialisées
par la lecture d'un fichier INI par exemple, voire un calcul ou
l'appel d'une fonction en début de programme.
Il peut arriver que ces "constantes" soient modifiables
"exceptionnellement" par un utilisateur identifié (on peut alors se
ramener au précédent, par clôture/initialisation).
Il me semble normal de conserver le statut const à ces variables. Pour
l'instant, j'utilise quelques cast, et ça roule.

J'aimerais connaître la stratégie des uns et des autres face à ce
petit problème.
Solution possible :

- Encapsuler ces variables dans une (des) classe(s) en les déclarant 'private' ;
- Modification uniquement par des fonctions membres de la classe (peut-être
uniquement le constructeur) ;
- Les accéder par des fonctions membres qualifiées 'const' et qui renvoient
les contenues de ces variables soit par valeur, soit par référence sur 'const'.

Le cas échéant, ces classes devraient être des singletons.

À +
Falk

Back to top
Pierre Maurette
Guest





PostPosted: Thu Apr 22, 2004 3:56 am    Post subject: Re: Constantes modifiables en C++ Reply with quote



Falk Tannhäuser <falk.tannhauser (AT) crf (DOT) canon.fr> typa:

Quote:
Pierre Maurette wrote:

Bonjour,
Il est fréquent que des variables (de tous types) soient initialisées
par la lecture d'un fichier INI par exemple, voire un calcul ou
l'appel d'une fonction en début de programme.
Il peut arriver que ces "constantes" soient modifiables
"exceptionnellement" par un utilisateur identifié (on peut alors se
ramener au précédent, par clôture/initialisation).
Il me semble normal de conserver le statut const à ces variables. Pour
l'instant, j'utilise quelques cast, et ça roule.

J'aimerais connaître la stratégie des uns et des autres face à ce
petit problème.
Solution possible :
- Encapsuler ces variables dans une (des) classe(s) en les déclarant 'private' ;
- Modification uniquement par des fonctions membres de la classe (peut-être
uniquement le constructeur) ;
- Les accéder par des fonctions membres qualifiées 'const' et qui renvoient
les contenues de ces variables soit par valeur, soit par référence sur 'const'.

Le cas échéant, ces classes devraient être des singletons.
Merci.

En fait, je me mélangeais les neurones hors de toute situation réelle
de programation avec des cast de const.
Dans ma vrai vie, j'utilise C++Builder et un composant TDataModule en
appliquant votre solution.
--
Pierre

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Apr 22, 2004 9:04 am    Post subject: Re: Constantes modifiables en C++ Reply with quote

Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote


Quote:
Il est fréquent que des variables (de tous types) soient initialisées
par la lecture d'un fichier INI par exemple, voire un calcul ou
l'appel d'une fonction en début de programme. Il peut arriver que ces
"constantes" soient modifiables "exceptionnellement" par un
utilisateur identifié (on peut alors se ramener au précédent, par
clôture/initialisation). Il me semble normal de conserver le statut
const à ces variables. Pour l'instant, j'utilise quelques cast, et ça
roule.

Je suis curieux comment. Si j'écris :

extern int const i = 0 ;

et j'essaie plus tard à modifier la variable, au moyen de :

const_cast< int& >( i ) = 1 ;

j'ai un comportement indéfini, qui en fait ne marche pas toujours.

En ce qui concerne les variables initialisées à partir des fichiers de
configuration (.ini ou d'autres -- aussi depuis la registry sous
Windows), j'utilise une classe singleton qui contient la
configuration -- c-à-d que je lis le fichier une fois, et le maintient
dans un std::set (ou un tableau haché). Normalement, l'interface du
singleton ne donne pas d'accès en écriture aux éléments dans ce
tableau ; pour le modifier, il faut appeler une fonction spécial avec le
nom du fichier.

--
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
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Pierre Maurette
Guest





PostPosted: Thu Apr 22, 2004 11:00 am    Post subject: Re: Constantes modifiables en C++ Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] typa:

Quote:
Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote in message
news:<jr6d80d3obj9eudc10gnvt56jhlaq8j52h (AT) 4ax (DOT) com>...

Il est fréquent que des variables (de tous types) soient initialisées
par la lecture d'un fichier INI par exemple, voire un calcul ou
l'appel d'une fonction en début de programme. Il peut arriver que ces
"constantes" soient modifiables "exceptionnellement" par un
utilisateur identifié (on peut alors se ramener au précédent, par
clôture/initialisation). Il me semble normal de conserver le statut
const à ces variables. Pour l'instant, j'utilise quelques cast, et ça
roule.

Je suis curieux comment. Si j'écris :

extern int const i = 0 ;

et j'essaie plus tard à modifier la variable, au moyen de :

const_cast< int& >( i ) = 1 ;

j'ai un comportement indéfini, qui en fait ne marche pas toujours.
Je faisais parfois des trucs comme:

const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? Wink
Mais peu importe, voir ma réponse au post de Falk.

Quote:
En ce qui concerne les variables initialisées à partir des fichiers de
configuration (.ini ou d'autres -- aussi depuis la registry sous
Windows), j'utilise une classe singleton qui contient la
configuration -- c-à-d que je lis le fichier une fois, et le maintient
dans un std::set (ou un tableau haché). Normalement, l'interface du
singleton ne donne pas d'accès en écriture aux éléments dans ce
tableau ; pour le modifier, il faut appeler une fonction spécial avec le
nom du fichier.
Pour les INI, j'utilise la classe TIniFile (avec l'avantage d'avoir

une TRegistryIniFile, qui facilite le basculement d'un choix à
l'autre).

Pierre

Back to top
Falk Tannhäuser
Guest





PostPosted: Thu Apr 22, 2004 11:38 am    Post subject: Re: Constantes modifiables en C++ Reply with quote

Pierre Maurette wrote:
Quote:
Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? Wink

const int tt = 0;
int main()
{
*const_cast<int*>(&tt) = 20;
// ou simplement
//const_cast<int&>(tt) = 21;
return 0;
}

chez moi, ça passe la compilation sans broncher (gcc 3.3.1 Cygwin
sous Windows 2000) - le const_cast est là pour dire au compilo
de la fermer !
Par contre, à l'exécution, ce programme m'affiche "Signal 11"
(sous Linux: "Memory fault") sans qu'il y ait un std::cout
ou printf dedans - magique non ?

À plus
Falk

Back to top
Pierre Maurette
Guest





PostPosted: Thu Apr 22, 2004 1:17 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

Falk Tannhäuser <falk.tannhauser (AT) crf (DOT) canon.fr> typa:

Quote:
Pierre Maurette wrote:
Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? ;-)

const int tt = 0;
int main()
{
*const_cast<int*>(&tt) = 20;
// ou simplement
//const_cast<int&>(tt) = 21;
return 0;
}

chez moi, ça passe la compilation sans broncher (gcc 3.3.1 Cygwin
sous Windows 2000) - le const_cast est là pour dire au compilo
de la fermer !
Par contre, à l'exécution, ce programme m'affiche "Signal 11"
(sous Linux: "Memory fault") sans qu'il y ait un std::cout
ou printf dedans - magique non ?
1 - Au temps pour moi, les seuls tests "réels" que j'ai fait sont en

C. Les casts à la C++ compilent, mais après, c'est la guerre.
2 - Justement, j'avais posté parce que les cast me gênaient. C'est une
grosse bêtise, il y a uns solution dans chacun des langages à base de
retour de pointeur (ou reference) const, ou de getters.

Ce qui se passe dans:
*const_cast<int*>(&tt) = 20;
ou
int*ptt = const_cast<int*>(&tt);
*ptt = 45;
C'est qu'en castant à la barbare, on finit par initialiser une
pointeur (non const), temporaire dans le premier cas, à l'adresse d'un
const int. Si cette adresse est dans un segment read-only, on est de
la baise. Exception ou même "rien" (semble être le cas sous XP).

Pierre

Back to top
Michel Michaud
Guest





PostPosted: Thu Apr 22, 2004 1:30 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

Dans news:q09f80d9lhfh2fcd4rmemmrl5qpm4rjpoh (AT) 4ax (DOT) com, Pierre
Maurette <maurette.pierre (AT) free (DOT) fr> a écrit :
Quote:
Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? Wink
Mais peu importe, voir ma réponse au post de Falk.

Pour être clair et précis : un const_cast qui enlève un
const n'est correct (i.e. pas « undefined ») seulement
si on sait que l'objet n'est pas const au départ.

--
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
Pierre Maurette
Guest





PostPosted: Thu Apr 22, 2004 2:44 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

"Michel Michaud" <mm (AT) gdzid (DOT) com> typa:

Quote:
Dans news:q09f80d9lhfh2fcd4rmemmrl5qpm4rjpoh (AT) 4ax (DOT) com, Pierre
Maurette <maurette.pierre (AT) free (DOT) fr> a écrit :
Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? Wink
Mais peu importe, voir ma réponse au post de Falk.

Pour être clair et précis : un const_cast qui enlève un
const n'est correct (i.e. pas « undefined ») seulement
si on sait que l'objet n'est pas const au départ.
Voila...

Par exemple, celui-là est correct, je ne l'avais pas posté, parce
qu'un peu gag:

int Nom_a_la_con_pour_ecrire = 123;
const int* P = &Nom_a_la_con_pour_ecrire;
#define Param (*P)
// bla bla
//Param = 5; // Refusé
std::cout << Param << std::endl;

On est certain que la variable existe dans une zone RW.

Pierre

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Apr 22, 2004 4:10 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote

Quote:
kanze (AT) gabi-soft (DOT) fr typa:

Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote in message
news:<jr6d80d3obj9eudc10gnvt56jhlaq8j52h (AT) 4ax (DOT) com>...

Il est fréquent que des variables (de tous types) soient
initialisées par la lecture d'un fichier INI par exemple, voire un
calcul ou l'appel d'une fonction en début de programme. Il peut
arriver que ces "constantes" soient modifiables
"exceptionnellement" par un utilisateur identifié (on peut alors se
ramener au précédent, par clôture/initialisation). Il me semble
normal de conserver le statut const à ces variables. Pour
l'instant, j'utilise quelques cast, et ça roule.

Je suis curieux comment. Si j'écris :

extern int const i = 0 ;

et j'essaie plus tard à modifier la variable, au moyen de :

const_cast< int& >( i ) = 1 ;

j'ai un comportement indéfini, qui en fait ne marche pas toujours.

Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? Wink

Tout à fait. Et il existe bien des cas et des implémentations où ça ne
marche pas -- ou bien, le compilateur voir que tt est const, et
l'utilise directement la valeur d'initialisation, plutôt que de lire la
variable, ou bien, le compilateur met la variable carrément dans un
segment protégé en écriture, qui donne un core à l'affectation.

Note bien que c'est parce que l'objet même est const. Quelque chose du
genre :

int maVar = 0 ;
int const& v = maVar ;

*const_cast< int* >( &maVar ) = 20 ;

est parfaitement légal.

--
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
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu Apr 22, 2004 4:26 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

Pierre Maurette <maurette.pierre (AT) free (DOT) fr> writes:

Quote:
"Michel Michaud" <mm (AT) gdzid (DOT) com> typa:

Dans news:q09f80d9lhfh2fcd4rmemmrl5qpm4rjpoh (AT) 4ax (DOT) com, Pierre
Maurette <maurette.pierre (AT) free (DOT) fr> a écrit :
Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? Wink
Mais peu importe, voir ma réponse au post de Falk.

Pour être clair et précis : un const_cast qui enlève un
const n'est correct (i.e. pas « undefined ») seulement
si on sait que l'objet n'est pas const au départ.
Voila...
Par exemple, celui-là est correct, je ne l'avais pas posté, parce
qu'un peu gag:

int Nom_a_la_con_pour_ecrire = 123;
const int* P = &Nom_a_la_con_pour_ecrire;
#define Param (*P)
// bla bla
//Param = 5; // Refusé
std::cout << Param << std::endl;

Si tu veux jouer a ca, je prefere

int Nom_a_la_con_pour_ecrire = 123;
int& Nom_a_la_con_pour_lire = Nom_a_la_con_pour_ecrire;

(Mais bon, il y a toujours le probleme de l'ordre d'initialisation des
statiques).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Falk Tannhäuser
Guest





PostPosted: Thu Apr 22, 2004 8:22 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

Quote:
int Nom_a_la_con_pour_ecrire = 123;
const int* P = &Nom_a_la_con_pour_ecrire;
#define Param (*P)
ou plus court et sans préprocesseur :

int Nom_a_la_con_pour_ecrire = 123;
int const& Param = Nom_a_la_con_pour_ecrire;
Quote:
// bla bla
//Param = 5; // Refusé
std::cout << Param << std::endl;

Falk


Back to top
Falk Tannhäuser
Guest





PostPosted: Thu Apr 22, 2004 8:41 pm    Post subject: Re: Constantes modifiables en C++ Reply with quote

Jean-Marc Bourguet wrote:
Quote:
Si tu veux jouer a ca, je prefere

int Nom_a_la_con_pour_ecrire = 123;
int& Nom_a_la_con_pour_lire = Nom_a_la_con_pour_ecrire;

(Mais bon, il y a toujours le probleme de l'ordre d'initialisation des
statiques).
???

À l'intérieur d'une même unité de compilation, cela ne devrait
jamais poser problème, non ? Puis, pour les entiers et les références
statiques ou globaux, il n'y a pas besoin d'exécuter des constructeurs
/ du code d'initialisation...

Falk


Back to top
Pierre Maurette
Guest





PostPosted: Fri Apr 23, 2004 9:09 am    Post subject: Re: Constantes modifiables en C++ Reply with quote

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> typa:

Quote:
Pierre Maurette <maurette.pierre (AT) free (DOT) fr> writes:
[...]
Par exemple, celui-là est correct, je ne l'avais pas posté, parce
qu'un peu gag:

int Nom_a_la_con_pour_ecrire = 123;
const int* P = &Nom_a_la_con_pour_ecrire;
#define Param (*P)
// bla bla
//Param = 5; // Refusé
std::cout << Param << std::endl;

Si tu veux jouer a ca, je prefere

int Nom_a_la_con_pour_ecrire = 123;
int& Nom_a_la_con_pour_lire = Nom_a_la_con_pour_ecrire;
cons int& Nom_a_la_con_pour_lire = Nom_a_la_con_pour_ecrire;

Wink
De mauvaise foi, je dirais que j'avais proposé un truc qui fonctionne
en C comme en C++.
La vérité, c'est que j'ai le réflexe pointeur.
--
Pierre

Back to top
Pierre Maurette
Guest





PostPosted: Fri Apr 23, 2004 9:14 am    Post subject: Re: Constantes modifiables en C++ Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] typa:

Quote:
Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote in message
news:<q09f80d9lhfh2fcd4rmemmrl5qpm4rjpoh (AT) 4ax (DOT) com>...
[email]kanze (AT) gabi-soft (DOT) fr[/email] typa:

Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote in message
news:<jr6d80d3obj9eudc10gnvt56jhlaq8j52h (AT) 4ax (DOT) com>...

Il est fréquent que des variables (de tous types) soient
initialisées par la lecture d'un fichier INI par exemple, voire un
calcul ou l'appel d'une fonction en début de programme. Il peut
arriver que ces "constantes" soient modifiables
"exceptionnellement" par un utilisateur identifié (on peut alors se
ramener au précédent, par clôture/initialisation). Il me semble
normal de conserver le statut const à ces variables. Pour
l'instant, j'utilise quelques cast, et ça roule.

Je suis curieux comment. Si j'écris :

extern int const i = 0 ;

et j'essaie plus tard à modifier la variable, au moyen de :

const_cast< int& >( i ) = 1 ;

j'ai un comportement indéfini, qui en fait ne marche pas toujours.

Je faisais parfois des trucs comme:
const int tt = 0;
*const_cast<int*>(&tt) = 20;
*(int*)(&tt) = 21;
Ça passe sans avertir sur mes compilos.
Peut-être "par hasard" ? ;-)

Tout à fait. Et il existe bien des cas et des implémentations où ça ne
marche pas -- ou bien, le compilateur voir que tt est const, et
l'utilise directement la valeur d'initialisation, plutôt que de lire la
variable, ou bien, le compilateur met la variable carrément dans un
segment protégé en écriture, qui donne un core à l'affectation.

Note bien que c'est parce que l'objet même est const. Quelque chose du
genre :

int maVar = 0 ;
int const& v = maVar ;

*const_cast< int* >( &maVar ) = 20 ;

est parfaitement légal.
Ce qui est à mon sens un peu embêtant, c'est que les compilateurs

testés n'avertissent pas, et ignorent l'afffection. Si 3 compialteurs
font la même chose, il y a peut-être une raison que m'échappe.
(j'ai vérifié que ce n'est pas l'OS qui zappe l'instruction, comme il
le fait effectivement de certaines instructions privilégiées)
Pierre



Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.