IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

A quoi servent les structures ?


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2013
    Messages : 20
    Points : 16
    Points
    16
    Par défaut A quoi servent les structures ?
    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 ?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par marcous Voir le message
    Bonsoir

    j'ai pas compris les structures , j'ai lu et relu les exemples et les cours de de site mais j'ai rien compris aux structures . A quoi elle servent??


    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;

  3. #3
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    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

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 777
    Points
    23 777
    Par défaut
    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 :

    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;
    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 :

    … 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
    1
    2
    3
        x.i = y.i;
        x.f = y.f;
        x.c = y.c;
    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
    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;
    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 ?

    Si tu veux additionner deux vecteurs avec une fonction telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AdditionneVecteurs (float x1,float y1,float z1,float x2,float y2,float z2);
    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
    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);
    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.

    Attention quand même à rester sobre en mémoire si tu choisis cette approche pour ne pas faire sauter la pile.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 728
    Points : 31 050
    Points
    31 050
    Billets dans le blog
    1
    Par défaut
    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.

  6. #6
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    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 :
    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);
    au debut non plus je comprenais pas a quoi ça servait ,
    mais en pratique les classes et les structures sont une invention de genie pouvant clarifier et simplifier beaucoup l ecriture d un programme !

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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.

  8. #8
    Membre régulier Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Points : 81
    Points
    81
    Par défaut
    Je ne crois pas que ceci soit du C valide, ça ressemble plus à du code C++.
    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.

  9. #9
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    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++ !

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 777
    Points
    23 777
    Par défaut
    Citation Envoyé par Metalman Voir le message
    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. :-)

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    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

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 777
    Points
    23 777
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    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.
    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.

    D'ailleurs l'exemple de nyergk... moi je n'ai jamais vu ça en C
    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.

  13. #13
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 396
    Points : 20 507
    Points
    20 507
    Par défaut
    Citation Envoyé par marcous Voir le message
    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 ?
    tout simplement à créer un agrégat de données
    Pour éviter d'avoir des données disparates

Discussions similaires

  1. à quoi servent les .dsm ?
    Par fidji dans le forum Delphi
    Réponses: 4
    Dernier message: 14/06/2006, 19h37
  2. [MySQL] A quoi servent les réferences entre les tables??
    Par Alain15 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/02/2006, 16h19
  3. A quoi servent les index dans une BDD ?
    Par Melvine dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 25/10/2005, 12h14
  4. [CR 10] A quoi servent les Templates Fields ?
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 10/11/2004, 10h52
  5. [C#] A quoi servent les interfaces???
    Par sof_nns dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/10/2004, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo