2010-12-03 20 views
0

私は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].attributesIAS_Attrib_List_t*
  • *(IAS_Database[class].attributes)を入力しているので、これはあるはず(*(IAS_Database[class].attributes))[attr]
  • IAS_Attrib_t*[]すなわち IAS_Attrib_List_tを入力していますタイプがある IAS_Attrib_t*
  • (*(IAS_Database[class].attributes))[attr]->nameは私がテーブルを照会しようとすると、しかし、私は戻ってmspgccからinvalid use of array with unspecified boundsを得るタイプUBYTE*

でなければなりません。 (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))しかしこれはちょっと汚い感じです。私は本当にそれを正しい方法で行う正しい構文を理解したいと思います。

答えて

0

気にしないでください。 私の完全な欲求不満で、私はここに置いたすべての変種バーを試してみたようです。 (*(IAS_Database[class].attributes))[attr]実際には正常に動作し、(*IAS_Database[class].attributes)[attr]のように表現されていても動作します。コンパイラは最初のポインタ(UBYTE **になっています)が実際にリストであり、ポインタ型にインデックスを適用しようとしていたと誤って考えています不完全です)。

-1
typedef IAS_Attrib_t* IAS_Attrib_List_t[]; 

なぜこれらの角かっこを使用していますか?内部の番号を使用するか削除してください

+0

リストの長さがIAS_Attrib_List_t型のすべてのインスタンスで同じではないため、角括弧内に配置することができないため、角括弧を使用しています。 – Thomas

+0

私はそれが配列 の#include 構造体S { int型A、B、Cの要素の未定義の数を持つことが合法的ではないと思いました。 }; typedef struct s * p []; int main(void) { return 0; } –

+0

c99に未定義の要素数を含めることはできますが、制限があり、コンパイラはその参照にメモリを割り当てません。最も有用な場所はtypedefです。ここでコンパイラは配列の各メンバーがどのくらいの大きさであるかを知ることができますが、要素数は知りません。 – Thomas

関連する問題