Les structures
Structure
1. Qu’est-ce qu’une structure ?
La structure en programmation est un type de données qui permet de regrouper en une seule unité plusieurs variables éventuellement de types différents. C’est UNE variable qui est un ensemble de variables. C’est très utile pour composer des objets complexes qui réunissent différentes facettes. Par exemple si l’on veut faire un carnet de rendez-vous, chaque rendez-vous suppose des informations du genre :
-
un libellé
-
un lieu
-
une date
-
un horaire de début
-
un horaire de fin
-
une catégorie (bureau, perso, loisir, etc.)
-
etc.
Toutes ces informations peuvent être regroupées au sein d’une structure et plusieurs structures permettront d’avoir plusieurs rendez-vous. L’intérêt ensuite est de pouvoir avoir un nombre illimité de rendez-vous.
Autre exemple dans un jeu vidéo en 2D un ennemi est défini par une position, un déplacement, un type (rampant, grouillant, serpentant, plombant, assommant), un taux d’agressivité, une couleur, une ou plusieurs images, etc. Pour chacune de ces informations, il s’agit premièrement de choisir un type de variable approprié et ensuite de regrouper toutes ces informations au sein d’une structure "ennemi" afin de pouvoir gérer un ou plusieurs ennemis dans le jeu.
Chaque élément de la structure est appelé un "champ". Notre structure rendez-vous a au moins 6 champs et la structure ennemie au moins 8 champs (position et déplacement horizontaux et verticaux, type...).
2. Disposer d’une structure dans un programme
a. Définir un type de structure
À la base pour définir une structure, on utilise le mot-clé struct suivi d’une liste de déclarations de variables (sans initialisation) entre accolades et d’un point-virgule :
struct {
float x,y; // attention pas possible d'initialiser
float dx,dy; // ses variables lors de la définition
int color; // de la structure
char lettre;
};
Tel quel c’est bien un type de structure mais comme il n’a pas de nom, il n’est pas possible de l’utiliser dans tout le programme. Pour nommer son type de structure, il suffit d’ajouter le nom voulu après le mot-clé struct...
Structures et fonctions
1. Retourner une structure
Comme la copie de structure est autorisée, les structures peuvent être prises comme valeur de retour. Soit la structure coord :
typedef struct coord{
int x, y;
}coord;
Voici typiquement une fonction qui permet d’initialiser une structure après sa déclaration n’importe où dans le programme :
coord init_point1()
{
coord t0;
t0.x = rand()%1024;
t0.y = rand()%768;
return t0;
}
Dans la fonction :
-
Une structure du type souhaité est déclarée.
-
Chacun de ses champs est initialisé avec des valeurs aléatoires ou calculées.
-
Pour finir, la structure résultante est retournée au contexte d’appel.
Bien sûr des valeurs peuvent être transmises en paramètres, cela donne par exemple :
coord init_point2(int x, int y)
{
coord t0;
t0.x = x;
t0.y = y;
return t0;
}
Et dans le programme la structure retournée par la fonction est affectée à une structure du contexte d’appel :
#include <stdio.h>
#include <stdlib.h>
int main()
{
coord pt1, pt2;
pt1 = init_point1();
pt2 = init_point2(40, 40);
printf("pt1.x=%d, pt1.y=%d\n"
"pt2.x=%d, pt2.y=%d\n",pt1.x,pt1.y,pt2.x, pt2.y);
return 0;
}
L’appel de init_point1() renvoie une structure coord initialisée avec des valeurs aléatoires et elle est affectée à la variable coord pt1. L’appel de init_point2() renvoie une autre structure coord initialisée avec (40,40) et affectée à la variable coord pt2.
2. Structures en paramètre de fonction
Une structure est passée à un paramètre de fonction de même type par valeur comme n’importe quel autre type de variable. La structure passée est copiée dans le paramètre de la fonction.
Attention !
Soit par exemple la fonction ci-dessous, elle permet de faire progresser de 1 la position horizontale d’un point. Si la position dépasse 1000, elle retourne à 0 :
void modif(coord pt)
{
pt.x++;
if (pt.x>1000)
pt.x=0;
}
Dans un programme l’appel est le suivant :
#include <stdio.h>
#include...