Loading lang_c_07_struct...

enib_small.png LANG-C 07_Struct — Structures de données

Les seuls types que nous ayons manipulés jusqu'alors sont les types de base fournis par le langage.
Il s'agit essentiellement de données numériques (entiers, réels, caractères...) et d'adresses (pointeurs, tableaux, chaînes...).
Le mot-clef typedef (présenté précédemment) permet d'inventer un nouveau nom de type mais celui-ci ne représente rien d'autre qu'un des types déjà existants.
Les tableaux ont la particularité de permettre la désignation de plusieurs valeurs distinctes par une unique variable (et un indice entier), seulement les valeurs d'un même tableau ont toutes un type identique.

Nous verrons ici que le langage C nous offre la possibilité d'aller au-delà de ces quelques types en inventant de nouveaux types de données.
Il s'agit d'agréger plusieurs types existants pour former une structure de données.
Au delà des détails du langage, nous présenterons une démarche de mise en œuvre systématique de cette fonctionnalité.

Bien que ce chapitre ne soit pas conçu comme une expérimentation pratique, n'hésitez cependant pas à incorporer les exemples proposés dans un programme minimal.
{1 #struct } Un nouveau type de données
{2 #usage } Usage effectif d'une structure

Le propos de ce chapitre était d'introduire la notion de structure de données.
Il s'agit d'un moyen de définir de nouveaux types de données par composition de types existants.
Au delà des aspects syntaxiques qui permettent de définir les membres d'une telle structure, le moyen de les initialiser et d'y accéder, nous avons vu que des données de ce type pouvaient être recopiées aussi trivialement qu'avec les types de base.
Une attention particulière a été portée sur l'influence de la disposition des membres d'une structure envers la place qu'elle occupe en mémoire.

Dans un second temps, nous nous sommes concentrés sur les bonnes pratiques qui concernent l'usage de telles structures.
Nous avons vu en particulier qu'elles étaient étroitement liées à la notion de programmation modulaire.
Un tel module est consacré à la mise à disposition de fonctions formant une interface de programmation décrivant le jeu d'opérations usuelles sur le nouveau type de données introduit ; il s'agit de l'encapsulation.
Deux cas extrêmes ont été choisis pour représenter d'une part un type très simple apportant une facilité d'écriture mais ne nécessitant pas de précaution particulières, et d'autre part un type plus élaboré devant garantir la bonne gestion de ressources internes et pour lequel, au contraire, il était indispensable de s'astreindre à un usage strict de l'interface de programmation fournie afin d'éviter des incohérences.

Le recours systématique à une telle interface de programmation assure une bonne maintenabilité du code mais peut introduire un coût en temps d'exécution.
L'usage du qualificatif inline est alors présenté afin d'éliminer, dans les cas qui le méritent, un tel surcoût tout en conservant la maintenabilité offerte par l'encapsulation.

N.B. : Il existe dans le langage C d'autres constructions syntaxiques qui ressemblent à celle des structures.
Leur usage est bien moins courant que celui des structures ; nous ne les présenterons pas dans le cadre de cet enseignement.
Voici en résumé ce dont il s'agit :