2010-12-03 2 views
0

나는 IrDA 스택을 c에 작성하고 정보 액세스 서비스 구성 요소를 구현하고 있으며 클래스/키/값 쌍에 대한 찾아보기 테이블이 필요합니다. 질서 정연한 형식으로 유지하기 위해, 나는 그것들을 모두 하나의 초기화 프로그램에 넣으려고합니다. 다음 코드는 잘 작동하고 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, 
     }, 
    }, 
}; 

그러나 데이터를 다시 가져 오는 데 문제가 있습니다. 사용되는 종류에 따라,이 같은 것을 할 수 있어야한다 :

  • IAS_Database[class].attributes 입력 IAS_Attrib_List_t*
  • *(IAS_Database[class].attributes)되어 입력 때문에

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

    이입니다 IAS_Attrib_List_tIAS_Attrib_t*[]

  • (*(IAS_Database[class].attributes))[attr]해야 유형이 IAS_Attrib_t*
  • ,877,내가 테이블을 쿼리 할 때 그러나, 나는 다시 mspgcc에서 invalid use of array with unspecified bounds을 얻을 유형 UBYTE*

해야한다. (IAS_Attrib_t*)((IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr))과 같은 해킹조차도 내가 db를과 같은 void로 캐스팅 할 때까지 실패합니다. 그러나 이것은 매우 더럽습니다. 올바른 방법으로 올바른 구문을 이해하고 싶습니다.

답변

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

는 I는 배열 #INCLUDE 구조체 {S INT의 A, B, C의 요소 정의 번호가 법적 아니다 생각; }; typedef struct s * p []; int 주 (공백) { return 0; } –

+0

c99에 정의되지 않은 수의 요소가있는 것은 합법이지만 제한이 있으며 컴파일러는 해당 참조에 메모리를 할당하지 않습니다. 가장 유용한 곳은 배열의 각 구성원이 얼마나 많은 요소가 아닌지 컴파일러가 알 수있는 typedef입니다. – Thomas