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 

variable globale
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
Pascal
Guest





PostPosted: Tue Feb 22, 2005 5:09 pm    Post subject: variable globale Reply with quote



Bonjour,

J'ai besoin d'une variable globale, et je ne sais pas la déclaré.

Dans mon fichier Interface.h, qui contient la classe Interface, j'ai
déclaré une variable globale comme suit:

int varglobale;

#ifndef INTERFACE
#define INTERFACE

class Interface { ... };

#endif

Le problème, c'est qu'à la compilation je me retrouve avec cette erreur:
Interface.o(.bss+0x4):/usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_tree.h:194: multiple definition of `g_TAILLEPAGE'
GestionnaireMV.o(.bss+0x0):/export/home/05gmi3/teapa5/projet/SGBD/GestionnaireMV.cpp:8: first defined here

Et dans mon fichier GestionnaireMV.cpp, j'ai fait un #include
"Interface.h"

D'où vient le pb? ça fait un moment que je cherche en vain.
Back to top
Jean-Fabrice RABAUTE
Guest





PostPosted: Tue Feb 22, 2005 5:20 pm    Post subject: Re: variable globale Reply with quote



Pascal wrote:
Quote:
Bonjour,

J'ai besoin d'une variable globale, et je ne sais pas la déclaré.

Dans mon fichier Interface.h, qui contient la classe Interface, j'ai
déclaré une variable globale comme suit:

int varglobale;

#ifndef INTERFACE
#define INTERFACE

class Interface { ... };

#endif

Le problème, c'est qu'à la compilation je me retrouve avec cette erreur:
Interface.o(.bss+0x4):/usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_tree.h:194: multiple definition of `g_TAILLEPAGE'
GestionnaireMV.o(.bss+0x0):/export/home/05gmi3/teapa5/projet/SGBD/GestionnaireMV.cpp:8: first defined here

Et dans mon fichier GestionnaireMV.cpp, j'ai fait un #include
"Interface.h"

D'où vient le pb? ça fait un moment que je cherche en vain.

En declarant ta variable dans le .h elle sera définie dans chaque
fichier .cpp compilé en .o

Il faut définir ta var globale en "extern" dans ton fichier .h et la
definir normalement dans 1 SEUL FICHIER .cpp !

Donc dans ton .h :

extern int varglobale;

Dans 1 SEUL DE TES .CPP :

int varglobale;


Voila. Ca devrait le faire.

A+

--
Regards / Cordialement

====================
Jean-Fabrice Rabaute
CORE SERVICES :: Software/Web development & Consulting services

http://www.debugbar.com : The most advanced WEB development tool for
Internet Explorer
http://www.core-services.fr - {Enjoy the future today}

Back to top
korchkidu
Guest





PostPosted: Tue Feb 22, 2005 5:25 pm    Post subject: Re: variable globale Reply with quote



Pascal wrote:
Quote:
Bonjour,

J'ai besoin d'une variable globale, et je ne sais pas la déclaré.

Dans mon fichier Interface.h, qui contient la classe Interface, j'ai
déclaré une variable globale comme suit:

int varglobale;

#ifndef INTERFACE
#define INTERFACE

class Interface { ... };

#endif

Le problème, c'est qu'à la compilation je me retrouve avec cette erreur:
Interface.o(.bss+0x4):/usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_tree.h:194: multiple definition of `g_TAILLEPAGE'
GestionnaireMV.o(.bss+0x0):/export/home/05gmi3/teapa5/projet/SGBD/GestionnaireMV.cpp:8: first defined here

Et dans mon fichier GestionnaireMV.cpp, j'ai fait un #include
"Interface.h"

D'où vient le pb? ça fait un moment que je cherche en vain.
Sauf erreur, si tu inclues plusieurs fois ton fichier, tu auras

plusieurs fois la variable varglobale de declaree. En plus, les
variables globales c'est mal, c'est le diable. Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas...Wink). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale. Ca a le merite de m'eviter de faire des
aneries...enfin en tout cas, pour ca...Wink)

K.

Back to top
Pascal
Guest





PostPosted: Tue Feb 22, 2005 6:07 pm    Post subject: Re: variable globale Reply with quote

On Tue, 22 Feb 2005 18:20:21 +0100, Jean-Fabrice RABAUTE wrote:

Quote:
En declarant ta variable dans le .h elle sera définie dans chaque
fichier .cpp compilé en .o

Il faut définir ta var globale en "extern" dans ton fichier .h et la
definir normalement dans 1 SEUL FICHIER .cpp !

Donc dans ton .h :

extern int varglobale;

Dans 1 SEUL DE TES .CPP :

int varglobale;


Voila. Ca devrait le faire.

A+

Salut,

Merci beaucoup, ça marche impeccable.

Back to top
Pascal
Guest





PostPosted: Tue Feb 22, 2005 6:09 pm    Post subject: Re: variable globale Reply with quote

On Tue, 22 Feb 2005 18:25:55 +0100, korchkidu wrote:


Quote:
Sauf erreur, si tu inclues plusieurs fois ton fichier, tu auras
plusieurs fois la variable varglobale de declaree. En plus, les
variables globales c'est mal, c'est le diable. Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas...Wink). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale. Ca a le merite de m'eviter de faire des
aneries...enfin en tout cas, pour ca...Wink)

K.

J'ai voulu le mettre en static, mais il me mettait variable undefined ...
Dans ma classe Truc, j'ai défini :
class Truc {
public:
static int machin;
....
}

Puis dans le .cpp d'une autre classe, j'avais fait un include de Truc.h,
et lorsque j'appelais Truc::machin, il me mettait variable undefined.

Back to top
korchkidu
Guest





PostPosted: Tue Feb 22, 2005 6:21 pm    Post subject: Re: variable globale Reply with quote

Pascal wrote:

Quote:
On Tue, 22 Feb 2005 18:25:55 +0100, korchkidu wrote:



Sauf erreur, si tu inclues plusieurs fois ton fichier, tu auras
plusieurs fois la variable varglobale de declaree. En plus, les
variables globales c'est mal, c'est le diable. Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas...Wink). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale. Ca a le merite de m'eviter de faire des
aneries...enfin en tout cas, pour ca...Wink)

K.


J'ai voulu le mettre en static, mais il me mettait variable undefined ...
Dans ma classe Truc, j'ai défini :
class Truc {
public:
static int machin;
...
}

Puis dans le .cpp d'une autre classe, j'avais fait un include de Truc.h,
et lorsque j'appelais Truc::machin, il me mettait variable undefined.
Dans le cpp il faut que tu la definisses. Tu l'initialises a une valeur

qui va bien:

Truc::mavarglobale = 0.;

par exemple.

K.

Back to top
Loïc Joly
Guest





PostPosted: Tue Feb 22, 2005 7:25 pm    Post subject: Re: variable globale Reply with quote

korchkidu wrote:
Quote:
En plus, les
variables globales c'est mal, c'est le diable.

Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle compromise si
j'utilise cin et cout ?


Quote:
Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas...Wink).

Et quelle est la différence avec une variable globale ?

Pour moi, le principal inconvénient (hors raisons métaphysiques) des
variables globales, c'est que potentiellement n'importe quelle fonction
peut la modifier n'importe quand, ce qui brise toute encapsulation et si
rend l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.

Un autre inconvénient, moindre, et que l'ordre de création de variables
globales définies dans des unités de compilation différentes est non
spécifié.

Dans les deux cas, ta solution n'apporte pas vraiment de solution, et je
ne vois pas en quoi c'est préférable(*) par rapport à de simples
variables globales.

(*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie, mais
qui à part James ici a connu ce genre de compilateur... ;)


--
Loïc


Back to top
korchkidu
Guest





PostPosted: Wed Feb 23, 2005 7:41 am    Post subject: Re: variable globale Reply with quote

Loïc Joly wrote:

Quote:
Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle compromise si
j'utilise cin et cout ?
Si tu te confesses avant, on pourra toujours negocier...Wink


Quote:
Et quelle est la différence avec une variable globale ?

Pour moi, le principal inconvénient (hors raisons métaphysiques) des
variables globales, c'est que potentiellement n'importe quelle fonction
peut la modifier n'importe quand, ce qui brise toute encapsulation et si
rend l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.
Ben pour moi, le principal inconvenient des variables globales, c'est

que l'on peut facilement s'emmeler les pinceaux en la modifiant sans le
vouloir...(ce qui revient a peu pres a ton premier point). Par contre,
si tu ecris Common::mavariable, ca diminue les risques qd meme (hors
raisons metaphysiques bien evidemment...).

Quote:
Un autre inconvénient, moindre, et que l'ordre de création de variables
globales définies dans des unités de compilation différentes est non
spécifié.
Par contre la serieusement, je ne te suis plus. Qu'est ce que ca peut

poser comme probleme ce genre de....problemes? (je precise que c'est une
vraie question..)

Quote:
Dans les deux cas, ta solution n'apporte pas vraiment de solution, et je
ne vois pas en quoi c'est préférable(*) par rapport à de simples
variables globales.
La lisibilite?


Quote:
(*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie, mais
qui à part James ici a connu ce genre de compilateur... Wink
Desole, je suis trop jeune, je n'ai jamais programme sur des cartes a

trous...:D

K.

Back to top
Pascal
Guest





PostPosted: Wed Feb 23, 2005 7:47 am    Post subject: Re: variable globale Reply with quote

korchkidu wrote:

Quote:
Ben pour moi, le principal inconvenient des variables globales, c'est
que l'on peut facilement s'emmeler les pinceaux en la modifiant sans le
vouloir...(ce qui revient a peu pres a ton premier point). Par contre,
si tu ecris Common::mavariable, ca diminue les risques qd meme (hors
raisons metaphysiques bien evidemment...).

Je suis pas du tout d'accord. Mettre une variable static n'a de sens que
si la variable est bien un membre de la classe. Or certaine variable ne
font partie d'aucune classe. Moi je ne trouve pas ça correct de le
mettre dans une classe, et le mettre en static, juste pour ne pas avoir
une variable globale. Ensuite je ne comprends pas ton argumentation.
Comment tu fais pour modif une variable globale sans t'en rendre compte?
Un exemple pour illustrer ton propos serait le bienvenu.

Quote:
La lisibilite?

Au détriment de la cohérence?

--
Pascal

Back to top
Pascal
Guest





PostPosted: Wed Feb 23, 2005 7:55 am    Post subject: Re: variable globale Reply with quote

Loïc Joly wrote:

Quote:
Pour moi, le principal inconvénient (hors raisons métaphysiques) des
variables globales, c'est que potentiellement n'importe quelle fonction
peut la modifier n'importe quand, ce qui brise toute encapsulation et si
rend l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.

Une variable static aussi. Et pour moi ce que tu cites n'est pas un
inconvénient, mais son principal avantage. C'est là toute l'intérêt de
ce genre de variable.

Quote:
(*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie, mais
qui à part James ici a connu ce genre de compilateur... Wink

Effectivment.

--
Pascal

Back to top
Loïc Joly
Guest





PostPosted: Wed Feb 23, 2005 8:51 am    Post subject: Re: variable globale Reply with quote

korchkidu wrote:
Quote:
Loïc Joly wrote:

Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle compromise si
j'utilise cin et cout ?

Si tu te confesses avant, on pourra toujours negocier...Wink

Ah, c'est dans ce sens que ça marche ? Mon père, je vais pêcher,
torture, violer,... pendant les deux prochaines décénies, pourriez vous
me confesser par avance ?

Quote:
Un autre inconvénient, moindre, et que l'ordre de création de
variables globales définies dans des unités de compilation différentes
est non spécifié.

Par contre la serieusement, je ne te suis plus. Qu'est ce que ca peut
poser comme probleme ce genre de....problemes? (je precise que c'est une
vraie question..)

Deux variables globales a et b de type A et B définies dans deux unités
de compilation différentes. Dans le constructeur de A, on fait appel à
l'objet b. Pourtant on n'est pas sur qu'au moment où on crée a, b soit
déjà crée.

Ca arrive en fait relativement souvent.



Quote:
Dans les deux cas, ta solution n'apporte pas vraiment de solution, et
je ne vois pas en quoi c'est préférable(*) par rapport à de simples
variables globales.

La lisibilite?

Mouaip, le fait de pouvoir faire une recherche textuelle facilement sur
toutes les utilisations des variables globales est un plus, mais je
pense qu'on fait tout aussi bien en mettant ces variables dans un
namespace (qui a aussi l'avantage de pouvoir être extensible...) qu'en
en faisant des variables statiques de classe.


Quote:
(*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie,
mais qui à part James ici a connu ce genre de compilateur... ;)

Desole, je suis trop jeune, je n'ai jamais programme sur des cartes a
trous...Very Happy

Pourtant, ton argument ne s'appliquerait pleinement que si c'était le cas.

--
Loïc

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Feb 23, 2005 9:16 am    Post subject: Re: variable globale Reply with quote

Loïc Joly wrote:
Quote:
korchkidu wrote:
En plus, les variables globales c'est mal, c'est le diable.

Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle
compromise si j'utilise cin et cout ?

Certainement. Quant à cerr, en revanche... :-)

Quote:
Perso, moi je prefere faire une classe ou je mets mes
variables globales comme membres statiques (je sais pas si
c'est une bonne idee mais c'est pratique en tout cas...Wink).

Et quelle est la différence avec une variable globale ?

La risque que quelqu'un d'autre en modifie la valeur de façon
inopinément. La risque de conflit de nom est moindre avec la
classe, aussi ; aujourd'hui, il y a des espaces référentiels, ce
n'est que très récemment qu'on pourrait s'en servir dans du code
portable. (J'ai eu des problèmes avec une utilisation dans VC++
6.0. Je ne sais pas d'où venait le problème, mais j'ai ôté les
namespaces du projet, et ça a marché. Or, VC++ 6.0 sert encore
dans beaucoup d'endroits.)

Quote:
Pour moi, le principal inconvénient (hors raisons
métaphysiques) des variables globales, c'est que
potentiellement n'importe quelle fonction peut la modifier
n'importe quand, ce qui brise toute encapsulation et si rend
l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.

Un autre inconvénient, moindre, et que l'ordre de création de
variables globales définies dans des unités de compilation
différentes est non spécifié.

Dans les deux cas, ta solution n'apporte pas vraiment de
solution, et je ne vois pas en quoi c'est préférable(*) par
rapport à de simples variables globales.

Pour le premier inconvénient, rendre la variable membre privée
d'une classe apporte beaucoup.

La vrai question, c'est qui doit se servir de la variable.

--
James Kanze GABI Software
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


Back to top
korchkidu
Guest





PostPosted: Wed Feb 23, 2005 9:18 am    Post subject: Re: variable globale Reply with quote

Pascal wrote:

Quote:
korchkidu wrote:

Je suis pas du tout d'accord. Mettre une variable static n'a de sens que
si la variable est bien un membre de la classe.
Bah si ma classe est justement faite pour "recevoir" les variables

globales...

Quote:
Or certaine variable ne
font partie d'aucune classe.
Si elles sont globales, alors elles font parties de ma classe faite

specialement pour...

Quote:
Moi je ne trouve pas ça correct de le
mettre dans une classe, et le mettre en static, juste pour ne pas avoir
une variable globale.
Mais ce n'est pas UNE classe, mais LA classe...Wink) Pas taper...


Quote:
Ensuite je ne comprends pas ton argumentation.
Comment tu fais pour modif une variable globale sans t'en rendre compte?
Un exemple pour illustrer ton propos serait le bienvenu.
#include


int i = 4;

int plus1(int i);

int main(void)
{
int i = 20;

i = plus1(i);
std::cout<<"Le resultat du programme est: "<
return 0;
}

int plus1(int j)
{
return ++i;
}

Quand tu sais deja quel est le probleme ca aide, qd tu relis ca, c'est
plus difficile.
(Ce code est tire d'une histoire vraie...)

Quote:
La lisibilite?


Au détriment de la cohérence?
Quelle est l'incoherence la dedans?

De plus, si un jour tu as besoin de beaucoup de variables globales, tu
verras assez vite que la possibilite de les voir du premier coup d'oeil
fait gagner un temps non-negligeable.

K.

Back to top
korchkidu
Guest





PostPosted: Wed Feb 23, 2005 9:21 am    Post subject: Re: variable globale Reply with quote

Loïc Joly wrote:

Quote:
korchkidu wrote:

Ah, c'est dans ce sens que ça marche ? Mon père, je vais pêcher,
torture, violer,... pendant les deux prochaines décénies, pourriez vous
me confesser par avance ?
On m'aurait menti??...Very Happy

Ca expliquerait bien des choses....

Quote:
Deux variables globales a et b de type A et B définies dans deux unités
de compilation différentes. Dans le constructeur de A, on fait appel à
l'objet b. Pourtant on n'est pas sur qu'au moment où on crée a, b soit
déjà crée.

Ca arrive en fait relativement souvent.
Oui, oui. C'est tout de suite plus clair avec un exemple.


Quote:
Mouaip, le fait de pouvoir faire une recherche textuelle facilement sur
toutes les utilisations des variables globales est un plus, mais je
pense qu'on fait tout aussi bien en mettant ces variables dans un
namespace (qui a aussi l'avantage de pouvoir être extensible...) qu'en
en faisant des variables statiques de classe.
C'est ce que j'avais fait au debut effectivement. Je devais en plus

rajouter un traitement sur mes variables globales dans certaines
condition alors j'ai mis ca dans une classe finalement. Je suis sur
qu'en fouillant la conception, ya moyen de faire plus propre mais je
n'avais franchement pas le courage de tout casser...

K.

Back to top
Arnaud
Guest





PostPosted: Wed Feb 23, 2005 9:33 am    Post subject: Re: variable globale Reply with quote

korchkidu <korch_ki_du (AT) yahoo (DOT) fr> wrote in message
Quote:
Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas...Wink). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale.

Je ne sais pas du tout si c'est une solution courante, mais j'utilise
une variante de la "classe à variables globales". Souvent, ces
variables globales ne sont pas utilisées par toutes les classes, mais
plutôt par des classes qui n'ont rien à voir les unes avec les autres.
Dans ce cas, je fais quelque chose comme :

class Variables
{ protected : static int var1; };

class BesoinDeVar1 : public Variables
{
// ... ici, on peut utiliser var1 comme une variable membre
};

class PasBesoinDeVar1
{
// ici, rien à faire, var1 est inconnue au bataillon
};

Ca me semble préserver l'encapsulation, il n'y a plus vraiment de
variables globale, mais var1 peut être utilisée à peu près n'importe
où, dans les classes qui doivent y avoir accès.

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.