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 :

declaration d'une structure


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 11
    Points
    11
    Par défaut declaration d'une structure
    salut ,
    svp concernant la déclaration d'une structure en c
    j'ai pas compris quel est la différence entre mettre le nom de la structure au début ,avant le '{' ,ou après le '}' à la fin, après la définition ?
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct person {
    int id;
    char[10] name;
    };
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct {
    int id;
    char[10] name;
    } person ;
    quand on doit utiliser chaqu'une deux ?
    en déclarant un nouveau type (typedef) le quel des notations on utilise ?
    en déclarant une variable locale normale lequel est le plus correct ?

    merci inifiniment

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Bonjour,

    Pour faire simple :
    Déclaration d'une "structure X"

    Déclaration d'une instance X d'une structure anonyme

    Déclaration d'une instance X2 et d'un pointeur X3 d'une/sur une "structure X1"

    Déclaration d'un type X correspondant à une structure anonyme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct s_X {} X;
    Déclaration d'un type X correspondant à une structure s_X (utilisé lorsqu'on a besoin d'un pointeur sur la structure à l'intérieur même de la structure).

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    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 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Bonjour,

    Citation Envoyé par Neckara Voir le message
    Déclaration d'un type X correspondant à une structure anonyme

    Déclaration d'un type X correspondant à une structure s_X (utilisé lorsqu'on a besoin d'un pointeur sur la structure à l'intérieur même de la structure).
    Es-tu sûr de ces deux derniers exemples ?

    Citation Envoyé par faiez2012 Voir le message
    svp concernant la déclaration d'une structure en c
    j'ai pas compris quel est la différence entre mettre le nom de la structure au début ,avant le '{' ,ou après le '}' à la fin, après la définition ?
    Pour étoffer les définitions de Neckara, il faut voir la définition d'une structure comme une définition de type en général, type qui peut être ensuite utilisé pour instancier n'importe quelle variable. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int                                    a; /* a est un entier */
        float                                  b; /* b est un réel en virgule flottante */
        struct { int x; int y; int z; }        c; /* c est une structure */

    Bien que ce soit facultatif, tu peux nommer cette structure, pour te permettre de réutiliser ce type plus loin sans avoir à le redéfinir en entier à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        struct vecteur { int x; int y; int z; }   c;

    Ça te permet ensuite d'instancier directement des variables mais également de faire d'autres définitions de types ou de fonctions. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        struct vecteur v1,v2,v3;
        struct vecteur additionne_vecteurs (struct vecteur, struct vecteur);
     
        …
     
        v3 = additionne_vecteurs (v1,v2);

    … où v1, v2 et v3 sont chacune une structure de type « vecteur » et où additionne_vecteurs est une fonction qui reçoit deux vecteurs en argument et en renvoie la somme.

    Donc pour répondre à ta question :
    • Le symbole avant le bloc entre accolades est le nom de la structure ;
    • Le ou les symboles après le bloc entre accolades sont les variables instanciées.


    Il faut signaler que lorsque tu utilises « struct », les trois entités qui suivent (le nom de structure, le bloc qui la définit et les instances) sont tous facultatifs, pour peu que l'expression ait toujours du sens :

    Exemple 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        struct { int x; int y; int z; } a;
    … définit une variable « a » comme une structure ayant trois membres, mais cette structure est anonyme. Il est possible d'accéder aux membres de a mais on ne peut pas définir de nouvelles structures « b », « c », « d », etc. du même type sans re-saisir l'expression ci-dessus en entier ;

    Exemple 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        struct vecteur v1,v2,v3;
    … définit de nouvelles instances d'une structure « vecteur » définie en amont ;

    Exemple 3 :
    … indique que « point » est d'ores et déjà un nom de structure mais que celle-ci sera définie plus tard ! C'est utile lors de références croisées, lorsque tu définis deux structures A et B, et que « A » contient un pointeur vers une instance de B et que « B » contient un pointeur vers une instances de A, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        struct A;
        struct B;
     
        struct A { int        x; 
                   struct B   *ptr_b; };
     
        struct B { int        x; 
                   struct A   *ptr_a; };

    Note également que c'est parce que tu peux ajouter des instances après des définitions mais que ces instances sont facultatives qu'il faut impérativement terminer l'expression avec un point-virgule pour lui dire que tu as fini. C'est pour cela que le C t'oblige à mettre toujours mettre ce point-virgule après l'accolade fermante dans le cas des structures alors que justement, dans les autres cas, une accolade fermante et un point-virgule sont redondants. C'est parce que l'expression n'est pas complète.


    Enfin, il faut parler du cas de typedef très largement utilisé dans ce contexte. « typedef » permet de créer un « alias » sur un nom de type quand celui est trop compliqué. Ce mot-clé utilise exactement la même syntaxe et la même grammaire qu'une déclaration de variable ordinaire. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int                entier; /* entier est une variable de type int */
     
        …
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        typedef int        entier; /* entier est maintenant un alias de int */
     
        entier             a,b,c;  /* a, b et c sont également des int */

    Et au vu de ce qui a été présenté ci-dessus, tu peux tout-à-fait t'en servir pour faire un alias sur une structure que tu définis à la volée, et faire disparaître le mot-clé « struct » lors des instanciations ultérieures. En plus, comme il n'y a pas d'ambiguïté, les noms de structures (donc suivant le mot-clé « struct ») peuvent très bien être les mêmes que les noms de types ou de variables. Si bien que l'on voit souvent écrit des choses comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        typedef struct vecteur { int x; int y; int z; } vecteur; /* « vecteur » est désormais un alias de « struct vecteur » */
     
        int            a,b,c;    /* a, b et c sont des entiers */
        vecteur        v1,v2,v3; /* v1, v2 et v3 sont des vecteurs. */

    Cette manière de présenter les choses, qui simplifie considérablement la lecture et permet de faire croire au programmeur que « vecteur » est un type natif est pour ainsi dire omniprésente en programmation orientée objet. Elle est désormais automatique en C++ lorsque tu utilises « struct » ou « class » sans avoir à utiliser typedef, ainsi que dans les langages qui lui sont postérieurs.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Es-tu sûr de ces deux derniers exemples ?
    <mode prof=ON>C'était pour voir si les lecteurs suivaient </mode>
    Non, j'ai complètement oublier le mot clé "struct", j'ai honte de moi

    Je vais éditer tout de suite, désolé

Discussions similaires

  1. Declarer une structure dans une methode
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 08/12/2008, 23h59
  2. Réponses: 6
    Dernier message: 29/04/2006, 21h37
  3. declaration d'une structure dans la class TForm1
    Par mdtdamien dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/02/2006, 19h51
  4. Réponses: 6
    Dernier message: 14/02/2006, 12h29
  5. Réponses: 1
    Dernier message: 09/02/2006, 12h03

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