Bonsoir,
Je n'ai pas compris les structures. J'ai lu et relu les exemples et les cours de de site mais je n'ai rien compris aux structures. A quoi servent-elles ?
Bonsoir,
Je n'ai pas compris les structures. J'ai lu et relu les exemples et les cours de de site mais je n'ai rien compris aux structures. A quoi servent-elles ?
Elles servent à plusieurs choses, les plus courantes sont les listes chaînées, arbres et pour regrouper différents type de variables. Imagine que tu es en train de créer un jeu vidéo et que tu souhaites créer des personnages, tu peux grâce aux structures, créer un type spécialisé comme par exemple (exemple très simpliste hein) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 typedef struct { float x; float y; } Position_t; typedef struct { int vies; Position_t pos; } Personnage_t;
Si tu dois te faire une idée des structures, il s'agit d'un regroupement de données en une seule.
Si tu es bon en maths:
Tu repères les coordonnées d'un point A sur un graphique par les coordonnées X et Y que tu notes A(X, Y)
avec A ta structure; X et Y tes variables contenues dans la structure.
Si tu es bon en physique/chimie:
Tu désignes une onde avec une amplitude, une pulsation et une phase telles que: y(t)= A.cos(wt+ phi)
avec y(t) ta structure; A, w et phi tes variables contenues dans la structure.
En gros, dès que tu peux utiliser plusieurs variables pour parler d'un même "objet" (on est pas en programmation objet mais bon ), utilises une structure c'est toujours plus simple.
Voila moi, c'est par des images, Franck te l'a très bien expliqué par le code et utilisations.
EDIT: Tu as les accès aux éléments de la structure après (avec des . ou des ->) , on y reviendra si tu comprends déjà un peu mieux
Hello,
Pour compléter ce qui a été dit ci-dessus, sache que lorsque tu déclares une structures, cette déclaration a valeur de définition de type, si bien que tu peux instancier des variables comme tu le ferais avec des types ordinaires. Exemple :
Chacune des variables x, y et z disposent de leurs propres champs i, f et c. C'est utile car la taille d'une structure est connue (sauf cas particuliers), ce qui te permet de copier facilement une variable dans une autre. Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int a,b,c; struct { int i; float f; char c; } x,y,z;
… copie linéairement tout le contenu de l'une dans l'autre, ce qui t'évite un laborieux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part x=y;
Mais surtout, il s'agit en fait des prémisses de ce qui va être la programmation orientée objet : une structure te permet de définir une entité et d'en spécifier les attributs. Ça va notamment te permettre d'implémenter facilement les n-uplets ou « tupples » que l'on connait bien dans les bases de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 x.i = y.i; x.f = y.f; x.c = y.c;
Autres exemples, les plus souvent repris dans ce contexte : les nombres complexes ou les vecteurs. Ce sont des objets qui peuvent être combinés entre eux et qui sont eux-mêmes composites, donc formés de plusieurs parties. Quel outil efficace pourrait-on utiliser en programmation pour les manipuler sans peine ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 struct Personne { char nom [64]; char prenom [64]; unsigned int age; unsigned int taille; }; struct Personne jean,pierre,jacques;
Si tu veux additionner deux vecteurs avec une fonction telle que :
Tu es embêté car ta fonction ne peut pas renvoyer les trois valeurs x, y et z à la fois. Tu es donc obligé d'utiliser des artifices avec lesquels tu vas passer à la fonction les adresses de trois variables extérieures pour que la fonction aille y déposer le résultat. Ou alors, tu écris ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part void AdditionneVecteurs (float x1,float y1,float z1,float x2,float y2,float z2);
Sur le plan sémantique, tu passes bien deux vecteurs à ta fonction qui, elle, t'en renvoie un troisième. Dans les faits, ta fonction a bien un seul type, aussi large soit-il, et rien ne s'oppose à ce qu'elle puisse le renvoyer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct Vecteur { float x; float y; float z; }; struct Vecteur AdditionneVecteurs (struct Vecteur v1, struct Vecteur v2);
Attention quand même à rester sobre en mémoire si tu choisis cette approche pour ne pas faire sauter la pile.
Salut
Imagine un langage sans structure dans lequel tu as envie de gérer une date.
Tu devras alors définir une variable "jour", puis une autre "mois" et une "année". Et tu te traines maintenant partout ces 3 variables dans toutes tes fonctions de manipulation de date.
Tu veux ensuite aller plus loin et gérer une "date de naissance" et une "date de mariage". Tu devras alors définir "jour_naissance", "jour_mariage", "mois_naissance", "mois_mariage", "année_naissance" et "années_mariage". Et te voilà maintenant à te coltiner ces 6 variables. Tu veux par exemple calculer le nombre de jours entre la date de naissance et la date de mariage, tu devras alors passer ces 6 variables à ta fonction de calcul.
Et si on rajoute une date de divorce, date de décès, date du diplôme, etc tu imagines la démultiplication de variables que ces nécessités imposent au niveau de ton code.
De là arrivent les "structures", entités permettant de "regrouper" des éléments qui s'associent de façon logique.
Ainsi, tu définiras une structure "date" contenant "jour", "mois" et "année" puis tu n'auras plus qu'à déclarer tes variables "naissance" et "mariage" du type de cette structure. De facto, les variables "naissance" et "mariage" seront greffées des éléments "jour", "mois" et "année" toujours accessibles mais la manipulation sera aisée. Te suffira juste de passer "naissance" à une fonction pour qu'elle puisse accéder individuellement au jour ou au mois ou à l'année de cette naissance. En plus, en cas d'évolution, tu pourras y rajouter facilement plus tard l'élément "heure" si besoin. De facto, et sans avoir rien à modifier dans ton code, cet élément sera lui-aussi accessible à toutes les fonctions qui traitent d'une date.
Ce concept amènera ensuite plus tard le concept "d'objet" qui peuvent se voir comme des structures qui associent des variables et en plus des fonctions pour les manipuler.
une autre utilisation d une structure est de l utiliser comme une Classe, c est a dire que la structure peut inclure des donnees mais aussi des routines !
par exemple :
au debut non plus je comprenais pas a quoi ça servait ,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 struct IMAGE { int x,y ; BYTE *adress_image ; void Load( const char *nom_image) { routine de chargement d une image } void Affichage(int col, int lig) {routine d affichage de l image } } ; et apres dans le programme on peut declarer une image et l utiliser de façon beaucoup plus simple en pratique !!!! struct IMAGE picture ; picture.load("exemple_image"); picture.affiche(100,100);
mais en pratique les classes et les structures sont une invention de genie pouvant clarifier et simplifier beaucoup l ecriture d un programme !
Je ne crois pas que ceci soit du C valide, ça ressemble plus à du code C++.
Bien sûr, on peut faire plus ou moins la même chose en C, mais de manière détournée.
Il me semble aussi que en C les structures ne peuvent pas accueillir de fonctions, et qu'il faut justement avoir recours aux classes pour ce genre d'utilisation.Je ne crois pas que ceci soit du C valide, ça ressemble plus à du code C++.
En effet !
Mais l'astuce consiste donc à faire un tableau de pointeurs sur fonction (enfin plutôt procédure) dans la structure pour "simuler" le système de vtables des classes C++ !
L'ennui est qu'alors, non seulement ces pointeurs occupent de la place inutilement dans la structure, mais ils sont en plus répliqués dans chacune de ses instances.
Par contre, on invoque la fonction derrière son pointeur en ajoutant des parenthèses contenant les paramètres et, donc, la syntaxe qui en résulte est exactement la même que celle des fonctions-membres du C++. C'est assez étonnant la première fois qu'on le voit et on pense alors soit à une extension du compilateur, soit à un programme écrit dans un environnement qui compile les deux, comme c'est souvent le cas avec Visual C++, alors qu'il s'agit en réalité d'un programme C parfaitement conforme à la norme, même en C89. :-)
Personnellement, je ne trouve pas grand intérêt à utiliser des pointeurs de fonctions dans les structures car de toute manière tu sera obligé d'avoir comme paramètre dans tes fonctions, un pointeur sur la structure, C n'est pas orienté objet et ne possède donc pas de mécanisme tel que l'opérateur this par exemple.
D'ailleurs l'exemple de nyergk... moi je n'ai jamais vu ça en C
Pas nécessairement. Un pointeur de fonction dans une structure, ça peut être très utile. En fait, à partir du moment où tu peux passer un pointeur de fonction en argument à une autre fonction (notamment les callbacks, celle de qsort() en particulier) et que, parallèlement, tu es obligé de transmettre d'autres informations (exemple : longueur des données, nombres d'éléments, traitement demandé, etc.), alors il peut être intéressant de rassembler tout cela dans une structure et d'envoyer celle-ci à ta fonction en un seul morceau.
Dans les classes à sémantique d'entité (je n'aime pas ces notions :-), il est intéressant de pouvoir pointer une fonction custom non prévue à l'avance si certaines données nécessitent un traitement particulier.
Il est probable que nyergk ait commencé directement avec le C++ dans lequel les mots-clés struct et class coexistent, notamment par compatibilité avec le C. Là-bas, ces deux mots-clés sont presqu'équivalents, mais struct définit tous ses membres publics par défaut et en l'absence d'indication contraire alors que class les considère privés.D'ailleurs l'exemple de nyergk... moi je n'ai jamais vu ça en C
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager