2011-05-03 10 views
0

Je fais affaire avec sim pour un cours d'architecture d'ordinateur. J'essaye de compiler le paquet avec MSYS1.1/MinGW avec gcc v4.5.2.Définition de structure imbriquée

Makelog:

In file included from 
    sim-outorder.c:107:0: bpred.h:214:5: 
    error: expected specifier-qualifier-list before 'uint' 
    ... 
    make: *** [sim-outorder.o] Error 1 

J'ai vérifié la ligne 214 dans bpred.h, il y a une définition struct imbriqué:

208 /* branch predictor update information */ 
209 struct bpred_update { 
210 char *pdir1;   /* direction-1 predictor counter */ 
211 char *pdir2;   /* direction-2 predictor counter */ 
212 char *pmeta; /* meta predictor counter */ 
213 struct dir{    /* predicted directions */ 
214 uint bimod : 1; /* bimodal predictor */ 
215 uint twolev : 1; /* 2-level predictor */ 
216 uint meta : 1; /* meta predictor (0..bimod/1..2lev) */ 
217 } dir; 
218 }; 

Quel est le problème avec ce bloc struct? Pourriez-vous s'il vous plaît aider ?? Merci!

+5

Où 'uint' est-il défini? –

+0

struct unsigned int uint; ajouté, le cas est résolu. Merci!! –

Répondre

3

Je crois que vous ne sont pas autorisés de nommer la struct intérieure:

208 /* branch predictor update information */ 
209 struct bpred_update { 
210 char *pdir1;   /* direction-1 predictor counter */ 
211 char *pdir2;   /* direction-2 predictor counter */ 
212 char *pmeta; /* meta predictor counter */ 
213 struct  {    /* predicted directions */ 
/****** ^^^^ --- NO NAME HERE -- THIS IS WHAT YOU MUST CHANGE */ 
214 uint bimod : 1; /* bimodal predictor */ 
215 uint twolev : 1; /* 2-level predictor */ 
216 uint meta : 1; /* meta predictor (0..bimod/1..2lev) */ 
217 } dir; 
218 }; 

Je soupçonne que cela parce qu'un « spécificateur-qualification-list » sonne comme un jeton qui fait partie de quelque chose comme struct dim = {0};.

+0

uint n'est pas défini, la raison en est .. –

1

En C, struct internes ne sont pas autorisés à avoir des noms, cela est dû à la façon dont vous avez besoin de faire référence à des structures en C normalement:

struct A { 
    ... 
}; 

struct B { 
    struct A my_a; 
}; 

Il est donc clair pour un compilateur naïf C si elle est doit attendre une variable ou une déclaration de type.

Il s'agit d'un cas où, en utilisant un compilateur C++, il fonctionnerait comme prévu, car C++ n'attend pas le préfixe de structure pour les décélérations de variables.

La solution consiste à supprimer le nom de la structure interne ou à le déclarer en dehors de l'autre structure.

+0

ce problème est spécifique à toute version g ++? Je vérifie le paquet, il semble qu'il n'y ait pas besoin de déplacer la structure interne. > dir_update_ptr-> dir.meta = (* meta> = 2); –

+0

Je suis désolé, je ne suis pas votre question ... Tout d'abord, la question originale concerne C, pas C++, g ++ est un compilateur C++, pas un compilateur C. En outre, que voulez-vous dire qu'il n'y a pas besoin de déplacer la structure interne? N'avez-vous pas eu une erreur de compilateur? Quoi qu'il en soit, c'était juste l'une des deux options pour résoudre l'erreur du compilateur d'origine. – Arelius

+0

merci, uint définition manquait :-) –

Questions connexes