|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 160 ![]() |
Bonjour,
J'étudie toujours le même tutorial : http://c.developpez.com/cours/poly-c/?page=page_2 et union me pose un probleme. Si j'ai bien compris, l'attribut de union qui sera le seul à etre apelé est celui qui occupe le plus d'espace. Suis-je bon ou tout a fait en dehors de la plaque? ps : si mon intuition dit juste, a quoi bon utiliser union au lieu de struc? |
|
|
00
|
|
|
#2 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Citation:
Citation:
Un cas typique est la transmision d'événements dans les interfaces graphiques, par exemple avec la XLib : tu peux définir un type « Event » qui est en fait l'union de tous les types d'événements possibles : MouseEvent, ButtonEvent, KeyboardEvent, etc. Dès lors que tu sais quel genre d'événement tu as reçu, tu peux directement aller chercher les informations qui lui sont propres. |
||
|
|
20
|
|
|
#3 |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 160 ![]() |
ok c'est plus claie maintenant, je te remercie
comment plusieurs attribut peuvent occuper le meme espace. Un champ de mémoire serait subdivisable? j'arrive pas a m'imaginer ca |
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Développeur en systèmes embarqués Inscription : mars 2006 Messages : 763 ![]() |
Salut,
Citation:
A+ Pfeuh |
|
|
|
10
|
|
|
#5 | ||
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
c'est pas clair votre explication.
Un exemple du principe. Supposons l'union suivante: Code :
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
||
|
10
|
|
|
#6 | ||||
|
Membre habitué
![]() ![]() anciennement "sopsag" Inscription : février 2011 Messages : 118 ![]() |
Si je puis me permettre d'en rajouter une couche,
voici un petit code qui permet de regarder à quoi ressemble un double : Code :
Code :
Une union, outre le gain de place, permet de faire des transtypages un peu moins crades. Mais attention, en règle générale, les unions sont dangereuses et à proscrire ! Avoir 2 (ou +) variables au même emplacement mémoire, c'est un peu casse-gueule ! ![]() Personnellement, depuis que la mémoire n'est plus une denrée rare, je ne m'en sers plus jamais.
__________________
Captain'Flam anciennement Sopsag, aka Hadrien Win seven 64 / Visual 2010 / Python 2.7 / Eclipse |
||||
|
|
10
|
|
|
#7 |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 160 ![]() |
ok, je n'ai plus qu'a étudier ce qu'est une adresse mémoire en C, et j'aurais compris à 100%
je vous remercie pour vos réponses |
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() |
En gros, il y a deux usages principaux des unions:
L'un est le "union-cast" montré par Captain'Flam, où l'on écrit en tant qu'un membre et on lit en tant qu'un autre. Il n'y a pas grand-chose ici qui soit garanti portable. L'autre usage est pour économiser de l'espace, ou un paramètre de fonction. Imagine une fonction qui peut prendre en paramètre soit un entier, soit une chaîne de caractères. Code C :
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
||
|
|
10
|
|
|
#9 |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 160 ![]() |
Ah, la je comprend moins bien ^^
Est ce que ce que a dit leternel est correcte? Je viens de finir le tuto sur C, et je commence celui de C++ Alors vous pourrez observer mes postes sur le forum C++ débuter à l'occasion. ciao bonsoir |
|
|
00
|
|
|
#10 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Comme on te l'a dit plus haut, il s'agit simplement de faire en sorte que tous les membres d'une union partagent le même espace mémoire. Donc, quand tu remplis l'un d'eux, tu écrases forcément les autres.
Une union est utile lorsque le type d'un paramètre à transmettre ou à renvoyer peut varier d'une situation à l'autre. Ça donne la possibilité au programme de choisir le champ adéquat en fonction des circonstances tout en permettant au compilateur de maintenir la contrainte de type, plutôt que de recourir à un transtypage « (void *) » jamais très propre. C'est déjà pratique en soi lorsqu'il s'agit de types natifs tels que float, int ou pointeurs, mais ça devient crucial lorsque les membres sont eux-mêmes d'autres structures ou unions : il est alors nécessaire qu'ils soient définis comme tels pour que le programme puisse se référer à leurs champs. |
|
|
20
|
|
|
#11 |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 160 ![]() |
ok, I understand now,
Je vous remercie de vos réponses. Je vais essayer de placer quelque union dans mes ancien projet, pour voir ce que ca donne. je vous souhaite de bonne fêtes |
|
|
10
|
|
|
#12 |
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
merci, toi aussi!
Par contre, la démarche "le C d'abord, le C++ après" n'est pas forcément la meilleure idée. Il y a des choses obligatoires en C qui sont à bannir en C++ (notamment dans la gestion de la mémoire). Cependant, oui, il vaut mieux comprendre les outils de bases en premier. A part la syntaxe, l'apport de l'objet en C++ fait de ce dernier un langage fondamentalement différent du C
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
10
|
|
|
#13 |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 160 ![]() |
Bin en fait dans le cours de C++ que voici :
http://cpp.developpez.com/cours/polyCpp/ L'auteur dit explicitement que le C doit etre acqui avant de se plonger dans son tuto, alors les tuto que j'étudie sont: Le langage C Le langage C++ Le C++ pour les pros |
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() |
Ça dépend des cours. Un cours basé sur le C te fera prendre/gardr des mauvaises habitudes s'il n'est pas exceptionnellement bon et exceptionnellement clair sur les pratiques C à oublier en C++.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
Quand, dans le cours, il parle du C, j'imagine qu'il parle des bases (que j'étudierais dans cet ordre):
Les subtilités du C ne sont pas utiles, voire contre-productives, pour le C++. Je pense par exemple à toutes les fonctions de manipulation de chaînes (str...).
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
Copyright © 2000-2013 - www.developpez.com