私はIrDAスタックをcに書いていて、情報アクセスサービスコンポーネントを実装しています。クラス/キー/値のペアのルックアップテーブルが必要です。整然としたフォーマットでそれを保つために、私はそれをすべて1つのイニシャライザに入れようとしています。次のコードは正常に動作し、ROMのコンパクトなリンクテーブルにデータをコンパイルします。不特定の長さの配列に関する問題
#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,
},
},
};
しかし、私はデータを取り戻すことができません。使用種類に応じて、私はこのような何かを行うことができるはず:
UBYTE class = 1;
UBYTE attr = 1;
UBYTE* name = (*(IAS_Database[class].attributes))[attr]->name;
IAS_Database[class].attributes
がIAS_Attrib_List_t*
*(IAS_Database[class].attributes)
を入力しているので、これはあるはず(*(IAS_Database[class].attributes))[attr]
(*(IAS_Database[class].attributes))[attr]->name
は私がテーブルを照会しようとすると、しかし、私は戻ってmspgccからinvalid use of array with unspecified bounds
を得るタイプUBYTE*
IAS_Attrib_t*[]
すなわち
IAS_Attrib_List_t
を入力していますタイプがある
IAS_Attrib_t*
でなければなりません。 (IAS_Attrib_t*)((IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr))
のようなハックさえも、私がdbをvoidのようにキャストするまで失敗します。(IAS_Attrib_t*)((void*)(IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr))
しかしこれはちょっと汚い感じです。私は本当にそれを正しい方法で行う正しい構文を理解したいと思います。
リストの長さがIAS_Attrib_List_t型のすべてのインスタンスで同じではないため、角括弧内に配置することができないため、角括弧を使用しています。 – Thomas
私はそれが配列 の#include 構造体S { int型A、B、Cの要素の未定義の数を持つことが合法的ではないと思いました。 }; typedef struct s * p []; int main(void) { return 0; } –
c99に未定義の要素数を含めることはできますが、制限があり、コンパイラはその参照にメモリを割り当てません。最も有用な場所はtypedefです。ここでコンパイラは配列の各メンバーがどのくらいの大きさであるかを知ることができますが、要素数は知りません。 – Thomas