Algorithmique et Langage C
www.polytech.unice.fr/žvg/index-xidian.html
Granet Vincent - Vincent.Granet@univ-cotedazur.fr
Xi’an - Octobre 2019 - Avril 2020
1/227
Les Structures et Unions
Définition
outil de structuration des données. A l’instar des routines, qui regroupent des instructions, les structures regroupent différents objets pour leur donner une nouvelle sémantique commune.
ce sont des objets structurés qui regroupent des éléments nommés, appelés champs, de types (éventuellement) différents et accessibles par leurs noms.
son
138/227
s t r u c t date {
i n t day, month, year;
c h a r month_name[10];
};
s t r u c t date d;
s t r u c t {
/ anonymous type / d o u b l e real, imag;
} d;
s t r u c t complexe { d o u b l e real, imag;
};
t y p e d e f s t r u c t { d o u b l e real, imag;
} Complexe;
s t r u c t complexe c1;
Complexe c2, c3;
son
Initialisation
les variables de type struct peuvent être initialisées lors de leur déclaration.
initialisation de tous les champs
s t r u c t complexe { d o u b l e real, imag;
} x = { 1.4, 3.5 };
s t r u c t {
/ anonymous type /
i n t day, month, year;
c h a r month_name[10];
} d = { 2, 3, 1997, "March" } ;
initialisation partielle
s t r u c t S1 { i n t x;
s t r u c t { d o u b l e d; c h a r c; } y;
i n t z[5];
};
s t r u c t S1 x = { 1, { 10.9 } };
/
idem struct S1 x = { 1, { 10.9, '\0'}, { 0, 0, 0, 0, 0 } };
/
son
140/227
Accès
l’accès à une donnée de la structure se fait par le nom du champ avec une notation pointée.
Complexe c;
c.real = 12.5; c.imag = 0.5;
Complexe add(Complexe c1, Complexe c2) {
Complexe c = {c1.real+c2.real, c1.imag+c2.imag};
r e t u r n c;
}
s t r u c t person {
c h a r name[NAMESIZE];
l o n g i n t id_number;
s t r u c t date birthdate;
} p;
strcpy(p.name,"John");
p.birthdate.year = 1986;
son
Champs de bits
sont utilisés pour un accès à la mémoire au niveau du bit
les champs doivent être des valeurs de type
unsigned integer à l’intérieur d’un mot machine l’opérateur & ne peut être appliqué à un champ.
Attention : problème de portabilité son
142/227
segment
s page offset
31 29 23 15 0
Virtual address on XBQ−43
s t r u c t virtual_address {
u n s i g n e d offset : 16;
u n s i g n e d page : 8;
u n s i g n e d segment : 6;
u n s i g n e d : 1; / unused /
u n s i g n e d supervisor : 1;
} va;
va.supervisor = 1;
son
Polymorphisme
une même variable peut désigner des valeurs de types différents
x ← 125.75 ....
x ← "hello"
....
x ← x + 1 { valide ?????}
En C, les unions permettent un polymorphisme simplifié
son
144/227
u n i o n DoubleString { d o u b l e d;
c h a r s[MAXSIZE];
};
u n i o n DoubleString x, y;
u n i o n DoubleString {
d o u b l e d;
c h a r s[MAXSIZE];
} x, y;
t y p e d e f u n i o n { / anonymous type / d o u b l e d;
c h a r string[MAXSIZE];
} DoubleString;
DoubleString x, y;
son
Initialisation
les variables de type union peuvent être initialisées lors de leur déclaration.
seul le premier champ peut être initialisé
u n i o n DoubleString {
d o u b l e d;
c h a r s[MAXSIZE];
};
u n i o n DoubleString x = {10.76};
u n i o n DoubleString y = {"toto"}; //erreur de compilation ! ! !
son
146/227
Accès aux champs
comme pour les struct l’accès à une donnée se fait par le nom du champ avec une notation pointée.
un seul champ accessible à la fois
u n i o n { i n t i , d o u b l e d } u;
u.i = 20; //access to u.d allowed, but unde ned ...
u.d = 1.1; //access to u.i allowed, but unde ned
son
Accès aux champs
pour régler le pb précédent, on peut utiliser un sélecteur
s t r u c t person {
c h a r last_name[20], first_name[20];
s t r u c t date birthdate;
enum { f, m } sexe; //sélecteur u n i o n {
c h a r maiden_name[20];
enum { false, true } army;
} info;
} p;
p.sexe = f; strcpy(p.info.maiden_name,"Monroe");
p.sexe = m; p.info.army = false;
i f (p.sexe==f) { / femme / }
e l s e { / homme / }
son
148/227