Bonjour à tous,
Peut on eclairer ma lenterne sur les unions s'il vous plait ?!
J'ai fait le tour des cours sur le site mais je suis un peu dans le flou.
Bonjour à tous,
Peut on eclairer ma lenterne sur les unions s'il vous plait ?!
J'ai fait le tour des cours sur le site mais je suis un peu dans le flou.
T'es sûr d'avoir bien cherché ?
Structures, unions et énumérations.
Oui c'est le cours que j'avais vu.Envoyé par jbarreau-mainson
Mais je ne vois pas trop à quoi cela sert ou plutot comment s'en servir...
Tu ne sais pas t'en servir ou tu ne vois pas leurs utilités ? Dans le premier cas je ne vois pas ce que je pourrai faire pour toi car il y a déjà des exemples dans le cours il me semble. Dans le deuxième cas, tu n'as juste pas encore assez d'expérience pour te rendre compte de leur utilité. Ne brusque pas les choses, ça viendra avec le temps. Ou bien j'ai encore mal compris la question ?
Eh bien en fait je ne voit pas la difference avec une structure, mis à part le fait que les champs d'une union partagent le même espace mémoire.
J'ai en fait un long qui a une valeur forcée, j'affiche la valeur de ce long à travers ce code :
Et j'aimerais à partir de là pouvoir déterminer msw, lsw, lsb et msb.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 typedef unsigned char uchar; int main() { long lg; lg = 0x12345678; uchar *pc; write(1,"lg = ", 5); for(pc = (uchar *)(&lg);pc < (uchar *)(&lg + 1); pc++) { printf("%.2X ", 0xFF&(*pc)); } }
On m'impose d'utiliser struct et union mais je bloque un peu ...
Je pensais me diriger vers 3 struct :
1 long lng; // Mot entier
2 short shrt; // MSW & LSW
1 char tab[3]; // Tab de 4 éléments : (lsb et msb)*2
Je ne sais pas si c'est très clair![]()
Bin volià la différence ! Dans une structure, les champs ne se chevauchent pas. Dans une union, on ne peut "activer" qu'un champ à chaque utilisation de l'union.Eh bien en fait je ne voit pas la difference avec une structure, mis à part le fait que les champs d'une union partagent le même espace mémoire.
Pour ce qu'on te demande de faire, c'est ta méthode qui est la bonne car portable (mais dans tous les cas on ne peut savoir si le premier octet est le msb ou le lsb qu'en sachant la plateforme sur laquelle on est. sur un processeur x86, premier octet en mémoire = lsb). Tu peux faire une version non portable en utilisant les unions avec la méthode que je vais te montrer un peu plus bas. L'idée c'est d'aller faire quelque chose comme ceci :
L'utilisation d'une union permet de ne pas avoir à faire un memcpy.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 typedef struct bbbb_s { unsigned char b0; unsigned char b1; unsigned char b2; unsigned char b3; } BBBB; ... long lg = 0x12345678; BBBB b; // Sachant qu'un long fait 4 octets et un BBBB tout de même, // on peut copier tous les bits de lg vers b et lire facilement // le msb, le lsb, etc. memcpy(&b, &lg, 4); printf("lsb = %.2x\n", b.b0); printf("msb = %.2x\n", b.b3);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <stdio.h> typedef struct bbbb_s { unsigned char b0; unsigned char b1; unsigned char b2; unsigned char b3; } BBBB; typedef struct ww_s { unsigned short w0; unsigned short w1; } WW; union lng { long lg; BBBB b; WW w; }; int main() { union lng u; u.lg = 0x12345678; printf("lsb = %.2x\n", u.b.b0); printf("msb = %.2x\n", u.b.b3); printf("lsw = %.2x\n", u.w.w0); printf("msw = %.2x\n", u.w.w1); return 0; }
Pour la réponse à ton problème, voir plus haut.
Pour l'utilité, en voici un mini-exemple..
Soit une donnée que tu manipules, qui peut prendre n'importe quelle valeur int, long, float, double, char.
Si tu veux faire un "objet" ayant cette valeur, et le manipuler de manière "transparente", tu as 2 choix..
Structure :
Union :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef struct _pValue { int i ; long l ; float f ; double d ; char c ; } Value ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef union _pValue { int i ; long l ; float f ; double d ; char c ; } Value ;
Dans le premier cas, la taille sera la somme des tailles (au moins), dans le second la plus grande (sizeof(double) ).
Si donc tu n'as pas besoin d'optimisation, ou que ta "modélisation" est peu importante, la structure marche bien.
Si par contre tu as (auras) beaucoup d'objets en mémoire, et/ou que ta "modélisation" (objet) est importante, tu prendras l'union, qui demande beaucoup moins de mémoire et qui est plus "object-like"...
![]()
Partager