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 :

Initialisation statique de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut Initialisation statique de structure
    Bonjour,

    une question de syntaxe (aux limites de ma connaissance du C) à propos de l'initialisation d'une structure :
    Voici mon type struct et son initialisation statique :
    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
    typedef struct  
        {
        struct 
            {
            INT32 id,size ;
            INT32 datum[5] ;
            } data [3] ;
        } tIOdata ;
     
    void foo ( void )
        {
        tIOdata io1 = {{ 12,3,{11,22,33}}} ;
        tIOdata io2 = {{ 12,3,{11,22,33}},{ 13,3,{44,55,66}}} ; // erreur !!
        tIOdata io3 = {{12,5,{1,2,3,4,5}},{13,5,{1,2,3,4,5}},{14,5,{1,2,3,4,5}}} ; // erreur !!
        }
    La déclaration de io1 ne pose pas de problème et le debugger me donne sa valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     io1
        data
            [0]
                id      =   12
                size    =    3
                datum   = { 11, 22, 33, 0, 0 }
            [1]
                id      =   0
                size    =   0
                datum   = { 0, 0, 0, 0, 0 }
            [2]
                id      =   0
                size    =   0
                datum   = { 0, 0, 0, 0, 0 }
    Ce qui est conforme à ce que j'attendais.

    En revanche, la déclaration de io2 échoue : le compilateur (visual 2005) me dit : "error C2078: initialiseurs trop nombreux".
    Et là, je ne comprend pas...
    (même io3 qui ne laisse aucun champ "au hasard" ne passe pas)

    Si quelqu'un a une idée, je suis preneur !
    merci d'avance,
    Hadrien

  2. #2
    Membre extrêmement actif
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void foo ( void )
        {
        tIOdata io1 = {{ 12,3,{11,22,33}}} ;
        tIOdata io2[] = {{ 12,3,{11,22,33}},{ 13,3,{44,55,66}}} ;
        tIOdata io3[] = {{12,5,{1,2,3,4,5}},{13,5,{1,2,3,4,5}},{14,5,{1,2,3,4,5}}} ;
        }
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Il manque des accolades :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tIOdata io1 = { { { 12,3,{11,22,33} } } } ;
    tIOdata io2 = { { {12 , 3 , { 11 , 22 , 33} } , { 13 , 3 , { 44 , 55 ,66 } } } ;
    tIOdata io3 = { { { 12 , 5 , { 1 , 2 , 3 , 4 , 5 } } , { 13 , 5 , { 1 , 2 , 3 , 4 , 5 } } , { 14 , 5 , { 1 , 2 , 3 , 4 , 5 } } } } ;
    L'erreur est due au fait que lorsque tu écris quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... = { { ... } , { ... } } ;
    la virgule se trouve dans les accolades en rouge, cela veut dire qu'il s'agit d'un tableau du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type tableau[taille] = ...
    Or, dans ton exemple, il ne s'agit pas d'un tableau mais d'un simple objet... qui est lui-même composé d'un tableau, contenant lui-même un tableau.

    En fait, d'une manière générale, pour l'initialisation des données, quand on a par exemple une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct
    {
       aaa
       struct str2
       {
          bbb
          struct str1
          {
             ccc
          } objet1[...];
       } objet2[...];
    }
    on englobe bien chaque chose entre des accolades :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element_de_objet1 : ccc
    Ce tableau objet1 est initialisé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { element_1_de_objet1 , ... , element_n_de_objet1 }
    Le tableau objet2 est composé d'un objet bbb et d'un tableau objet1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element_de_objet2 : { bbb , { element_1_de_objet1 , ... , element_n_de_objet1 } }
    On initialise donc objet2 comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { element_1_de_objet2 , ... , element_n_de_objet2 }
    etc...

    Cela permet d'initialiser 1, 2 ou "n" premiers éléments de chaque objet composant chaque imbrication ; il faut donc faire connaitre au compilateur où (début et fin) se trouve chacune d'elle, sinon il est perdu.

    Pour finir, en se servant de la même idée, si on déclare un tableau et qu'on veut l'initialiser, ça se passera pareil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type_structure tableau [ n ] = { element_1_du_tableau , ... , element_n_du_tableau }
    C'est d'ailleurs pour ça que tu avais une erreur, c'était un problème d'imbrication lors de l'initialisation, le compilateur, en voyant la virgule dans la première imbrication, avant pensé à une initialisation de tableau. Or c'était un objet (pas un tableau)... contenant lui-même un tableau.

  4. #4
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Okayyyy !
    je disais bien que c'était à la limite de mes connaissances du C...

    Bon, merci jeroman, je me coucherai moins bête.

    Hadrien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Initialisation d'une structure statique
    Par ottomucha dans le forum C++
    Réponses: 2
    Dernier message: 26/05/2014, 09h34
  2. New n'initialise pas la structure
    Par ShaiLeTroll dans le forum Langage
    Réponses: 3
    Dernier message: 27/12/2007, 18h53
  3. initialisation d'une structure
    Par ryadh.naouar dans le forum C
    Réponses: 3
    Dernier message: 29/10/2007, 15h21
  4. initialisation de ma structure
    Par toniounou dans le forum C++
    Réponses: 12
    Dernier message: 31/08/2007, 00h28
  5. [Initialisation] Remplir une structure une fois
    Par Kimael dans le forum Langage
    Réponses: 14
    Dernier message: 08/06/2004, 15h33

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