
En C, une struct (ou structure) est un type de données qui permet de regrouper plusieurs variables sous un même nom, même si elles sont de types différents. C’est une sorte de conteneur qui permet d’organiser et de structurer des données de manière logique.
Imaginons qu’il soit nécessaire de créer un personnage dans un jeu vidéo. Ce personnage pourrait avoir plusieurs attributs : un nom, une position dans le jeu (x et y), une santé, et une arme.
Chaque attribut peut être d’un type différent : le nom sera une chaîne de caractères, la position sera composée de deux nombres (x et y), la santé sera un nombre entier et l’arme, une chaîne de caractères.
En utilisant une struct, il est possible de regrouper toutes ces informations dans un seul bloc de données.
La syntaxe pour définir une struct en C est la suivante :
struct Personnage {
char nom[50]; // nom du personnage, jusqu'à 49 caractères
int x, y; // position du personnage dans le jeu (coordonnées)
int sante; // santé du personnage
char arme[30]; // nom de l'arme
};
Ici, une struct nommée Personnage est définie, regroupant quatre attributs : nom, x, y, sante et arme.
Chaque attribut peut être d’un type différent.
Pour déclarer une variable de type Personnage et lui attribuer des valeurs, voici un exemple de code
// Définition de la struct Personnage
struct Personnage {
char nom[50]; // nom du personnage, jusqu'à 49 caractères
int x, y; // position du personnage dans le jeu (coordonnées)
int sante; // santé du personnage
char arme[30]; // nom de l'arme
};
void setup() {
// Initialisation du moniteur série
Serial.begin(9600);
// Création et initialisation d'un personnage
struct Personnage p1;
// Assignation de valeurs aux attributs
// Utilisation de méthodes simples pour la gestion de chaînes de caractères en Arduino
strcpy(p1.nom, "Heros"); // Copie d'une chaîne dans le tableau 'nom'
p1.x = 10; // Position en X
p1.y = 20; // Position en Y
p1.sante = 100; // Santé maximale
strcpy(p1.arme, "Epee"); // Nom de l'arme
// Affichage des informations du personnage
Serial.println("Informations du personnage :");
Serial.print("Nom : ");
Serial.println(p1.nom);
Serial.print("Position : (");
Serial.print(p1.x);
Serial.print(", ");
Serial.print(p1.y);
Serial.println(")");
Serial.print("Santé : ");
Serial.println(p1.sante);
Serial.print("Arme : ");
Serial.println(p1.arme);
}
void loop() {
// Pas de boucle continue nécessaire ici
}
RÉSULTAT:
Informations du personnage : Nom : Heros Position : (10, 20) Santé : 100 Arme : Epee
Dans cet exemple :
p1 de type Personnage est déclarée.p1 sont initialisés : le nom, la position, la santé, et l’arme.PAR EXEMPLE, dans un contexte des jeux vidéo, les struct sont utiles pour organiser les informations liées aux différents objets et entités du jeu.
Par exemple :
struct contenant ses attributs (nom, position, santé, etc.).struct ayant des attributs comme la position, le type d’ennemi, les points de vie, etc.struct pour contenir leurs caractéristiques (type, valeur, quantité, etc.).// Définition de l'énumération pour les types d'ennemis
enum TypeEnnemi {
GOBELIN, // Le type d'ennemi est un gobelin
DRAGON, // Le type d'ennemi est un dragon
SORCIER, // Le type d'ennemi est un sorcier
TROLL // Le type d'ennemi est un troll
};
// Définition de la struct Ennemi
struct Ennemi {
enum TypeEnnemi type; // Type de l'ennemi, représenté par une énumération
int x, y; // Position dans le jeu
int pointsDeVie; // Points de vie de l'ennemi
};
void setup() {
// Initialisation du moniteur série
Serial.begin(9600);
// Création et initialisation d'un ennemi
struct Ennemi e1;
// Assignation de valeurs aux attributs
e1.type = GOBELIN; // Le type de l'ennemi est un Gobelin
e1.x = 50; // Position X de l'ennemi
e1.y = 60; // Position Y de l'ennemi
e1.pointsDeVie = 30; // Points de vie de l'ennemi
// Affichage des informations de l'ennemi
Serial.println("Informations de l'ennemi :");
Serial.print("Type : ");
// Affichage du type d'ennemi en fonction de la valeur de l'énumération
switch (e1.type) {
case GOBELIN:
Serial.println("Gobelin");
break;
case DRAGON:
Serial.println("Dragon");
break;
case SORCIER:
Serial.println("Sorcier");
break;
case TROLL:
Serial.println("Troll");
break;
default:
Serial.println("Inconnu");
break;
}
Serial.print("Position : (");
Serial.print(e1.x);
Serial.print(", ");
Serial.print(e1.y);
Serial.println(")");
Serial.print("Points de vie : ");
Serial.println(e1.pointsDeVie);
}
void loop() {
// Pas de boucle continue nécessaire ici
}
Informations de l'ennemi : Type : Gobelin Position : (50, 60) Points de vie : 30
Voici un exemple qui utilise un tableau de personnages ainsi qu’une fonction pour ajouter de nouveaux personnages.
De plus, nous utiliserons un type enum pour renseigner l’arme du personnage.
De plus, la compilation conditionnelle est utilisée pour déterminer la langue des armes.
#include <Arduino.h>
#define FRANCAIS 1
#define ANGLAIS 2
#define ESPAGNOL 3
#define LANGUE ESPAGNOL
#if (LANGUE == FRANCAIS)
#define TEXTE_EPEE "Épée" // Description pour EPEE
#define TEXTE_BATON_MAGIQUE "Bâton magique" // Description pour BATON_MAGIQUE
#define TEXTE_ARC "Arc" // Description pour ARC
#define TEXTE_HACHE "Hache" // Description pour HACHE
#endif
#if (LANGUE == ANGLAIS)
#define TEXTE_EPEE "Sword" // Description pour EPEE
#define TEXTE_BATON_MAGIQUE "Magic staff" // Description pour BATON_MAGIQUE
#define TEXTE_ARC "Bow" // Description pour ARC
#define TEXTE_HACHE "Axe" // Description pour HACHE
#endif
#if (LANGUE == ESPAGNOL)
#define TEXTE_EPEE "Espada" // Description pour EPEE
#define TEXTE_BATON_MAGIQUE "Bastón mágico" // Description pour BATON_MAGIQUE
#define TEXTE_ARC "Arco" // Description pour ARC
#define TEXTE_HACHE "Hacha" // Description pour HACHE
#endif
// Définition de l'énumération pour les armes
enum Arme {
EPEE, // Épée
BATON_MAGIQUE, // Bâton magique
ARC, // Arc
HACHE // Hache
};
// Définition de la struct Personnage
struct Personnage {
char nom[50]; // Nom du personnage
int x, y; // Position dans le jeu
int sante; // Santé du personnage
enum Arme arme; // Arme du personnage (utilisation de l'énumération)
};
// Taille maximale du tableau de personnages
#define MAX_PERSONNAGES 10
// Table de chaînes de caractères pour décrire les armes
const char* descriptionsArmes[] = {
TEXTE_EPEE,
TEXTE_BATON_MAGIQUE,
TEXTE_ARC,
TEXTE_HACHE
};
// Fonction pour ajouter un nouveau personnage
int ajouterPersonnage(Personnage personnages[], int nbPersonnages, const char* nom, int x, int y, int sante, enum Arme arme) {
if (nbPersonnages < MAX_PERSONNAGES) {
// Ajouter un nouveau personnage dans le tableau
strcpy(personnages[nbPersonnages].nom, nom);
personnages[nbPersonnages].x = x;
personnages[nbPersonnages].y = y;
personnages[nbPersonnages].sante = sante;
personnages[nbPersonnages].arme = arme; // Assignation de l'arme
nbPersonnages++; // Incrémenter le nombre de personnages
} else {
Serial.println("Erreur : Tableau de personnages plein !");
}
return nbPersonnages; // Retourner le nouveau nombre de personnages
}
// Fonction pour afficher les informations des personnages
void afficherPersonnages(Personnage personnages[], int nbPersonnages) {
for (int i = 0; i < nbPersonnages; i++) {
Serial.print("Nom \t\t: ");
Serial.println(personnages[i].nom);
Serial.print("Position \t: (");
Serial.print(personnages[i].x);
Serial.print(", ");
Serial.print(personnages[i].y);
Serial.println(")");
Serial.print("Santé \t\t: ");
Serial.println(personnages[i].sante);
// Utiliser la table de chaînes pour afficher la description de l'arme
Serial.print("Arme \t\t: ");
Serial.println(descriptionsArmes[personnages[i].arme]);
Serial.println();
}
}
void setup() {
// Initialisation du moniteur série
Serial.begin(9600);
// Déclaration d'un tableau de personnages
struct Personnage personnages[MAX_PERSONNAGES];
int nbPersonnages = 0; // Initialisation du nombre de personnages
// Ajouter quelques personnages
nbPersonnages = ajouterPersonnage(personnages, nbPersonnages, "Héros", 10, 20, 100, EPEE);
nbPersonnages = ajouterPersonnage(personnages, nbPersonnages, "Mage", 15, 25, 80, BATON_MAGIQUE);
nbPersonnages = ajouterPersonnage(personnages, nbPersonnages, "Archer", 30, 40, 90, ARC);
// Afficher les informations de tous les personnages
afficherPersonnages(personnages, nbPersonnages);
}
void loop() {
// Pas de boucle continue nécessaire ici
}
RÉSULTAT:
Nom : Héros Position : (10, 20) Santé : 100 Arme : Espada Nom : Mage Position : (15, 25) Santé : 80 Arme : Bastón mágico Nom : Archer Position : (30, 40) Santé : 90 Arme : Arco