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 typeIAS_Attrib_List_t*
*(IAS_Database[class].attributes)
est de typeIAS_Attrib_List_t
-à-direIAS_Attrib_t*[]
(*(IAS_Database[class].attributes))[attr]
devrait être de typeIAS_Attrib_t*
(*(IAS_Database[class].attributes))[attr]->name
devrait être de typeUBYTE*
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.
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
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; } –
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