2015-02-24 1 views
0

Ma structure est définie comme suit:Initialiser un tableau de strucuters avec un tableau comme un élément de la structure en c

typedef struct simpleStruct { 
    int a[2]; 
    int b; 
    int c; 
} simpleStruct; 

Je suis en train de l'initialiser en utilisant les éléments suivants:

simpleStruct simpleTable[] = { 
    {.a[0]= 0, .a[1]= 1, .b = 2, .c = 3}, 
    {.a[0]= 4, .a[1]= 5, .b = 6, .c = 7}, 
}; 

Le compilateur lance une erreur "d'initialisation illégale".

Selon le Spec C99 devraient y être autorisés par désigné Initialiseur (http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html)

J'ai essayé plusieurs autres façons de initialisant et a constaté que cela fonctionne:

simpleStruct simpleTable[] = { 
    {.a = {0,1}, .b = 2, .c = 3}, 
    {.a = {4,5}, .b = 6, .c = 7}, 
}; 

je me demandais si quelqu'un avait un aperçu sur pourquoi la première version n'a pas fonctionné.

Merci.

+0

Quel compilateur utilisez-vous? Votre code compile bien avec 'gcc'. –

+0

Je ne vois pas où dans cette page il est dit '.a [0]' devrait fonctionner? (Il dit que vous pouvez initialiser un tableau de structures avec '[0] .a') – immibis

+0

@DanielKleinstein J'utilise un PowerPC Complier avec C99 Extensions activé – richardnixonthethird

Répondre

0

Cela ressemble à un bogue dans votre compilateur. Les initialiseurs sont corrects, plusieurs désignateurs imbriqués sont autorisés par la norme C. Il y a un exemple dans la section 6.7.9 Initialisation de la dernière version:

EXEMPLE 11 désignateurs peuvent être utilisés pour fournir l'initialisation explicite lorsque des listes sans fioritures initialiseur pourrait être mal compris:

struct { int a[3], b; } w[] = 
     { [0].a = {1}, [1].a[0] = 2 }; 
+0

ressemble à un bug de compilateur, devinez que je dois faire pour l'instant, merci – richardnixonthethird

0

Everything seems fine to me

#include<stdio.h> 

    typedef struct simpleStruct { 
     int a[2]; 
     int b; 
     int c; 
    } simpleStruct; 

    int main() 
    { 
     simpleStruct anObj[]={{{23,30},40,39},{{20,90},20,19}}; 
     printf("%d, %d, %d, %d\n", anObj[0].a[0], anObj[0].a[1], anObj[0].b, anObj[0].c); 
     printf("%d, %d, %d, %d\n", anObj[1].a[0], anObj[1].a[1], anObj[1].b, anObj[1].c); 
     return 0; 
    } 
+0

Je sais que ça marchera, je l'ai mentionné dans ma question. Ma question était de savoir pourquoi l'inverse n'a pas fonctionné. – richardnixonthethird

+0

Okay! J'essaierai. ** Mais pourquoi essayer plusieurs façons de résoudre un problème? ** –

+2

Pour apprendre de nouvelles compétences! C est un jeu sans fin pour les apprenants avides. – chqrlie