나는 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_t
즉IAS_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로 캐스팅 할 때까지 실패합니다. 그러나 이것은 매우 더럽습니다. 올바른 방법으로 올바른 구문을 이해하고 싶습니다.
IAS_Attrib_List_t 유형의 모든 인스턴스에서 목록의 길이가 같지 않으므로 대괄호를 사용하고 있으므로 대괄호 안에 넣을 수 없습니다. – Thomas
는 I는 배열 #INCLUDE 구조체 {S INT의 A, B, C의 요소 정의 번호가 법적 아니다 생각; }; typedef struct s * p []; int 주 (공백) { return 0; } –
c99에 정의되지 않은 수의 요소가있는 것은 합법이지만 제한이 있으며 컴파일러는 해당 참조에 메모리를 할당하지 않습니다. 가장 유용한 곳은 배열의 각 구성원이 얼마나 많은 요소가 아닌지 컴파일러가 알 수있는 typedef입니다. – Thomas