Maintenant que notre structure est définie dans le .h, on va pouvoir l'utiliser dans une fonction de notre fichier .c.
Voici comment créer une variable de type Coordonnees (la structure qu'on a définie plus haut) :
Code : C | #include "main.h" // Inclusion du .h qui contient les prototypes et structures
int main(int argc, char *argv[])
{
struct Coordonnees point; // Création d'une variable appelée "point" de type Coordonnees
return 0;
}
|
Nous avons ainsi créé une variable "point" de type Coordonnees. Cette variable est automatiquement composée de 2 sous-variables : x et y (son abscisse et son ordonnée).
On est obligés de mettre le mot "struct" lors de la définition de la variable ?
Oui, cela permet à l'ordinateur de différencier un type de base (comme "int") d'un type personnalisé, comme "Coordonnees".
Toutefois, les programmeurs trouvent un peu lourd de mettre le mot "struct" à chaque définition de variable personnalisée. Pour régler ce problème, ils ont inventé une instruction spéciale :
le typedef.
Le typedef
Retournons dans le fichier .h qui contient la définition de notre structure Coordonnees.
Nous allons ajouter une instruction appelée typedef qui sert à créer un alias de structure, c'est-à-dire à dire que telle chose est équivalente à écrire telle autre chose.
Nous allons ajouter une ligne commençant par typedef juste avant la définition de la structure :
Code : C | typedef struct Coordonnees Coordonnees;
struct Coordonnees
{
int x;
int y;
};
|
Cette ligne doit être découpée en 3 morceaux (non je n'ai pas bégayé le mot "Coordonnees"

) :
- typedef : indique que nous allons créer un alias de structure.
- struct Coordonnees : c'est le nom de la structure dont vous allez créer un alias (c'est-à-dire un "équivalent").
- Coordonnees : c'est le nom de l'équivalent.
En clair, cette ligne dit "Ecrire le mot
Coordonnees est désormais équivalent à écrire
struct Coordonnees". En faisant cela, vous n'aurez plus besoin de mettre le mot struct à chaque définition de variable de type Coordonnees.
On peut donc retourner dans notre main et écrire tout simplement :
Code : C | int main(int argc, char *argv[])
{
Coordonnees point; // L'ordinateur comprend qu'il s'agit de "struct Coordonnees" grâce au typedef
return 0;
}
|
Je vous recommande de faire un typedef comme je l'ai fait ici pour le type Coordonnees. La plupart des programmeurs font comme cela. Ca leur évite d'avoir à écrire le mot "struct" partout, et vu que ce sont des feignasses ça les arrange

(je rigole hein les gars, tapez pas

)
Modifier les composantes de la structure
Maintenant que notre variable point est créée, nous voulons modifier ses coordonnées.
Comment accéder au x et au y de point ? Comme cela :
Code : C | int main(int argc, char *argv[])
{
Coordonnees point;
point.x = 10;
point.y = 20;
return 0;
}
|
On a ainsi modifié la valeur de point, en lui donnant une abscisse de 10 et une ordonnée de 20. Notre point se situe désormais à la position (10 ; 20) (c'est comme cela qu'on note une coordonnée en mathématiques

)
Pour accéder donc à chaque composante de la structure, vous devez écrire :
Code : C | variable.nomDeLaComposante
|
Le point fait la séparation entre la variable et la composante.
Si on prend la structure "Personne" de tout à l'heure et qu'on demande le nom et le prénom, on devra faire comme ça :
Code : C 1
2
3
4
5
6
7
8
9
10
11
12
13 | int main(int argc, char *argv[])
{
Personne utilisateur;
printf("Quel est votre nom ? ");
scanf("%s", utilisateur.nom);
printf("Votre prenom ? ");
scanf("%s", utilisateur.prenom);
printf("Vous vous appelez %s %s", utilisateur.prenom, utilisateur.nom);
return 0;
}
|
Code : Console | Quel est votre nom ? Dupont
Votre prenom ? Jean
Vous vous appelez Jean Dupont |
On envoie la variable "utilisateur.nom" à scanf qui écrira directement dans notre variable "utilisateur".
On fait de même pour "prenom", et on pourrait aussi le faire pour l'adresse, l'âge et le sexe, mais j'ai la flemme de le faire ici (je dois être programmeur, c'est pour ça

).
Vous auriez pu faire la même chose sans connaître les structures, en créant juste une variable nom et une autre "prenom".
Mais l'intérêt ici est que vous pouvez créer une autre variable de type "Personne" qui aura aussi son propre nom, son propre prénom etc etc

On peut donc faire :
Code : C | Personne joueur1, joueur2;
|
... et stocker ainsi les informations sur chaque joueur.
Mais le C, c'est plus fort encore ! On peut créer un tableau de Personne !
C'est facile à faire :
Code : C
Et ensuite, vous accédez par exemple au nom du joueur n°0 en tapant :
Code : C
L'avantage d'utiliser un tableau ici, c'est que vous pouvez faire une boucle pour demander les infos du joueur 1 et du joueur 2, sans avoir à répéter 2 fois le même code. Il suffit de parcourir le tableau joueur et de demander à chaque fois nom, prénom, adresse...
Exercice : créez ce tableau de type Personne et demandez les infos de chacun grâce à une boucle (qui se répète tant qu'il y a des joueurs). Faites un petit tableau de 2 joueurs pour commencer, mais si ça vous amuse vous pourrez agrandir la taille du tableau plus tard.
Affichez à la fin du programme les infos que vous avez recueillies sur chacun des joueurs
Ce code est facile à écrire, vous n'avez pas besoin de correction, vous êtes des grands maintenant
Initialiser une structure
Pour les structures comme pour les variables, tableaux et pointeurs, il est vivement conseillé de les initialiser dès leur création pour éviter qu'elles ne contiennent "n'importe quoi". En effet, je vous le rappelle, une variable qui est créée prend la valeur de ce qui se trouve en mémoire là où elle a été placée. Parfois cette valeur est 0, parfois c'est un résidu d'un autre programme qui est passé par là avant vous et la variable vaut une valeur qui n'a aucun sens, comme -84570.
Pour rappel, voici comment on initialise :
- Une variable : on met sa valeur à 0 (ça c'est simple).
- Un pointeur : on met sa valeur à NULL. NULL est en fait un #define situé dans stdlib.h qui vaut généralement 0, mais on continue à utiliser NULL par convention sur les pointeurs pour bien voir qu'il s'agit de pointeurs et non de variables ordinaires.
- Un tableau : on met chacune de ses valeurs à 0.
Pour les structures, ça va un peu ressembler à l'initialisation d'un tableau qu'on avait vue. En effet, on peut faire à la déclaration de la variable :
Code : C | Coordonnees point = {0, 0};
|
Cela mettra, dans l'ordre, point.x = 0 et point.y = 0.
Revenons à la structure Personne (qui contient des chaînes). Vous avez aussi le droit d'initialiser une chaîne en mettant juste
"" (rien entre les guillemets). Je ne vous ai pas parlé de cette possibilité dans le chapitre sur les chaînes je crois, mais il n'est jamais trop tard pour l'apprendre

On peut donc initialiser dans l'ordre nom, prenom, adresse, age et garcon comme ceci :
Code : C | Personne utilisateur = {"", "", "", 0, 0};
|
Toutefois, j'utilise assez peu cette technique personnellement. Je préfère envoyer par exemple ma variable point à une fonction initialiserCoordonnees qui se charge de faire les initialisations pour moi sur ma variable.
Toutefois, pour faire cela il faut envoyer un pointeur de ma variable. En effet si j'envoie juste ma variable, une copie en sera réalisée dans la fonction (comme pour une variable de base) et la fonction modifiera les valeurs de la copie et non celle de ma vraie variable. Revoyez le "fil rouge" du chapitre sur les pointeurs si vous avez un trou de mémoire à ce sujet
Il va donc falloir apprendre à utiliser des pointeurs sur des structures (hummm ça donne faim ça

).
Nous allons justement voir comment faire ça maintenant
