Les types composés Les enregistrements
En plus des types de base (entier, réels, charactères, etc) il est possible dans la plupart des langages de programmation de définir ses propres types. Il s’agit en fait de rassembler une ou plusieurs variables, qui peuvent être de types différents, et de les regrouper sous un seul nom afin de les manipuler plus facilement.
Exemple Un nombre complexe est un nombre de la forme a + b*i où a et b sont des nombres réels et le symbole i vaut nouveau type complexe: réel a réel b complexe x x.a:
Exemple en C struct complexe { double reel; double imag; }; struct complexe x; x.reel: x.imag:
Où définir un nouveau type Si on défini un nouveau type à l’intérieur d’une fonction alors il ne sera visible qu’à l’intérieur de cette fonction. Pour qu’un type composé soit visible dans toutes les fonctions d’un fichier, il faut le déclarer au début du fichier, à l’extérieur de toute fonction. Note: La même chose s’applique à la déclaration de variables: c’est ce que l’on appelle les variables globales. #include <stdio.h> struct complexe { double reel; double imag; }; fonction(...){ struct complexe x; }
Assignation de structures struct complexe { double reel; double imag; }; struct complexe x; x.reel = 5; x.imag = 3; 5 x.reel: 3 x.imag:
Accéder aux membres d’une structure struct complexe x, y, z; x.reel = 5; x.imag = 3; y = x; z.reel = x.réel; z.imag = 8; 5 x.reel: 3 x.imag: 5 y.reel: 3 y.imag: 5 z.reel: 8 z.imag:
Comparer deux structures 5 x.reel: if (x == y) printf(“Deux structures égales”); if (x != z) printf(“Deux structures differentes”); 3 x.imag: 5 y.reel: 3 y.imag: 5 z.reel: 8 z.imag:
Les structures et les fonctions On peut passer des structures en paramètre. On peut utiliser les structures comme valeur de retour. Contrairement aux tableaux, les structures sont passées par copie.
Exemple struct complexe somme(struct complexe x, struct complexe y) { struct complexe a; a.reel = x.reel + y.reel; a.imag = x.imag + y.imag; return a; }
typedef Dans l’exemple précédent, il est laborieux d’avoir à écrire autant de struct complexe. Le C fournit une fonctionnalité appelée typedef servant à créer des noms de nouveaux types de donnéees. Exemple: typedef struct complexe Complexe Complexe x, y; Le nom Complexe devient synonyme de struct complexe
Les structures contenant des structures Les membres d’un type composé peuvent être eux mêmes des variables de types composé différents. En C, cela se traduit par le fait qu’une structure peut être membre d’une autre structure.
Exemple struct point{ int x; int y; }; struct point p1={2, 1}, p2={8, 5}; y 5 4 3 2 1 p2 p1 x 0 1 2 3 4 5 6 7 8 9
Exemple struct rect{ struct point p1; struct point p2; }; struct rect r ; r.p1.x = p1.x; r.p1.y = p1.y; r.p2.x = p2.x; r.p2.y = p2.y; y 5 4 3 2 1 p2 p1 x 0 1 2 3 4 5 6 7 8 9
Remarque Le type des membres ne peut pas être la structure elle-même. Ainsi l’exemple suivant est invalide. struct objet{ int n; struct objet x; } Mais l’exemple suivant est valide et même très courant struct *objet x;
Les tableaux de structures On peut faire des tableaux de types composés tout comme on peut faire des tableaux de type de base. Exemple: struct complexe tab[1000]; for (i=0; i<1000; i=i+1){ tab[i].reel = 0; tab[i].imag = 0; } ... tab[0].reel tab[1].reel tab[999].reel tab: tab[0].imag tab[1].imag ... tab[999].imag
La taille d’une structure Le nombre d’octets alloués pour chaque variable d’un type composé n’est pas toujour la somme de la taille de ses membres. Exemple: struct exemple{ char c1, c2, c3; int n; } x; Sur sunchb il y a toujours un nombre pair d’octet réservé pour chaque variable (sauf si un seul octet est nécessaire). Donc, 8 octets seront alloués pour x, c’est-à-dire qu’un octet sera perdu.
La taille d’une structure Le C dispose d’un opérateur permettant de déterminer le nombre d’octets nécessaires pour mémoriser un objet du type de son opérande. sizeof expression (L’expresion n’est pas évalué) sizeof (nom de type) exemple: sizeof ‘a’ vaut 1 sizeof (char) vaut 1 sizeof (121+434)/2 vaut 4 sur sunchb sizeof (int) vaut 4 sur sunchb sizeof (struct complexe) vaut 8 sur sunchb
Exemple Supposons qu’une banque utilise un ordinateur pour conserver les principales informations sur ses clients. On associe à chaque client une variable dont le type est une structure qui pourrais ressembler à ce qui suit. structure client{ int folio; char prenom[15]; char nom[15]; int solde; int type_de_compte; char *imprimer; /* ce qui reste à imprimer dans le livret */ int derniere_transaction; };