2010-12-03 20 views
0

Je suis en train d'écrire une pile IrDA dans c et d'implémenter le composant Information Access Service et j'ai besoin d'une table de correspondance pour les paires classe/clé/valeur. Pour le garder dans un format ordonné, j'essaye de tout mettre dans un initialisateur. le code suivant fonctionne très bien et compile les données pour compacter les tables liées dans la ROM.Problèmes avec les tableaux de longueurs non spécifiées

#define IAS_PTYPE_STRING 0x00 
#define IAS_PTYPE_BYTE 0x01 

typedef struct { 
    UBYTE* name; 
    UBYTE type; 
    UBYTE* value; 
} IAS_Attrib_t ; 

typedef IAS_Attrib_t* IAS_Attrib_List_t[]; 

typedef struct { 
    UBYTE* name; 
    IAS_Attrib_List_t* attributes; 
} IAS_Class_t; 

static const IAS_Class_t IAS_Database[] = { 
    {"IrDA:IrCOMM", 
     &(IAS_Attrib_List_t){ 
      &(IAS_Attrib_t){"Parameters", IAS_PTYPE_STRING, "IrDA:TinyTP:LsapSel"}, 
      NULL, 
     }, 
    }, 
}; 

Cependant, j'ai des problèmes pour récupérer les données. selon les types utilisés, je devrais être capable de faire quelque chose comme ceci:

UBYTE class = 1; 
UBYTE attr = 1; 
UBYTE* name = (*(IAS_Database[class].attributes))[attr]->name; 

c'est parce que

  • IAS_Database[class].attributes est le type IAS_Attrib_List_t*
  • *(IAS_Database[class].attributes) est de type IAS_Attrib_List_t-à-dire IAS_Attrib_t*[]
  • (*(IAS_Database[class].attributes))[attr] devrait être de type IAS_Attrib_t*
  • (*(IAS_Database[class].attributes))[attr]->name devrait être de type UBYTE*

mais lorsque je tente d'interroger la table, je reçois invalid use of array with unspecified bounds retour de mspgcc. Même un hack comme (IAS_Attrib_t*)((IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr)) échoue jusqu'à ce que je jette le db à vide comme (IAS_Attrib_t*)((void*)(IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr)) mais cela se sent si sale. Je voudrais vraiment comprendre la syntaxe correcte pour le faire correctement.

Répondre

0

Peu importe. Dans ma frustration totale, il semble que j'ai essayé toutes les variantes de la barre que j'ai installée ici. (*(IAS_Database[class].attributes))[attr] fonctionne en effet correctement et fonctionne même lorsqu'il est exprimé comme (*IAS_Database[class].attributes)[attr] Je crois que le compilateur supposait à tort que le premier pointeur (étant un UBYTE **) était en fait une liste et essayait d'appliquer l'index à un type de pointeur (où le type est incomplet).

-1
typedef IAS_Attrib_t* IAS_Attrib_List_t[]; 

pourquoi utilisez-vous ces parenthèses? utilisez un numéro à l'intérieur ou retirez-les

+0

J'utilise les parenthèses car la longueur de la liste n'est pas la même pour toutes les instances du type IAS_Attrib_List_t, donc ne peut pas être placée entre parenthèses. – Thomas

+0

Je pensais que ce n'est pas légal d'avoir des éléments typologie définie dans un tableau #include struct s {int a, b, c; }; typedef struct s * p []; int main (vide) { return 0; } –

+0

Il est légal d'avoir un nombre indéfini d'éléments dans c99, mais il y a des restrictions, et le compilateur n'allouera pas de mémoire pour cette référence. l'endroit où il est le plus utile est typedefs où vous voulez que le compilateur sache la taille de chaque membre du tableau mais pas le nombre d'éléments. – Thomas