2013-03-18 2 views
0

아래 코드는 유연한 배열 구성원 ("This line")을 사용하기 때문에 SDCC에서 컴파일을 거부합니다.가변 길이 구조 참조 방법

/** header of string list */ 
typedef struct { 
    int nCount; 
    int nMemUsed; 
    int nMemAvail; 
} STRLIST_HEADER; 

/** string list entry data type */ 
typedef struct { 
    int nLen; 
    char str[];     // This line 
} STRLIST_ENTRY; 

/** string list data type */ 
typedef struct { 
    STRLIST_HEADER header; 
    STRLIST_ENTRY entry[];   // This line 
} STRLIST; 

int main() 
{ 
    return 0; 
} 

그러나, 액세스 내가 가지고있는 데이터는 이미이 방법을 (내가 스택 스매싱하지 포인터를 통해 기존의 메모리를 액세스하고 있습니다)을 설정하고, 구조체 포인터를 사용하는 것은 매우 깨끗한 코드를하게된다. 불행히도 SDCC는 이것을 좋아하지 않습니다. 코드에서 깔끔하게 컴파일 될 메모리 구조를 참조 할 수있는 또 다른 방법은 무엇입니까? 행복 컴파일러를 유지

typedef struct { 
    int nLen; 
    char str[1]; 
} STRLIST_ENTRY; 

:

+0

표준에 따라 유연한 배열 구성원이있는 구조는 배열의 구조 또는 요소의 멤버가 아니어야합니다. 따라서 'STRLIST'는 유효하지 않습니다. –

+0

@ 대니얼 피셔 알아. 표준에 따라이 코드를 다시 작성하는 가장 좋은 방법은 무엇입니까? – thirtythreeforty

+0

좋은 질문입니다. 'char str []; 행을 표시했다는 것은 SDCC가 유연한 배열 멤버를 전혀 좋아하지 않는다고 의심하게 만듭니다. 이 경우 내가 볼 수있는 유일한 옵션은 배열의 고정 크기를 설정하거나 포인터를 사용하여 지역을 포기하는 것입니다. 유연한 배열 멤버를 받아들이지 만 재귀 적으로는 받아 들일 수 없다면'STRLIST'에서'unsigned entry [];를 속여서 사용할 수 있습니다. 또한 완전히 만족스럽지 않습니다. –

답변

1

일반적인 방법은 배열 구성원에게 크기를 제공하는 것입니다.

편집 : --std-c99 또는 --std-sdcc99 스위치를 사용하여 SDCC에서 원본 코드를 이해할 수 있습니까?

+0

알겠습니다 ... 한 가지 문제. 나는'sizeof (STRLIST_ENTRY)'변수 멤버없이 구조체의 크기를 반환하고 싶습니다. (이 코드는 이미 이것을 허용하는 다른 컴파일러 용으로 작성되었습니다!)이 작업을 수행하는 버전 ('str [0]')이 있습니까? 아니면 보드 전체에서 'sizeof (...) - 1'코드를 수정해야합니까? – thirtythreeforty

+0

@ gh403 : 아마도 원래 코드를 이해하도록 SDCC를 설득 할 수 있습니다. 편집 된 대답을 참조하십시오. – RichieHindle

+0

No :(나는 경고 186 : 유연한 배열 멤버를 가진 구조체를 잘못 사용했다 .' 다음에'error 200 : field '항목'incomplete type has'을 가지고 있는데 둘 다 두 번째'//이 줄 '을 참조한다. – thirtythreeforty

0
typedef struct { 
    int nLen; 
    char *str;      
} STRLIST_ENTRY; 

이 방법으로 malloc 배열을 사용할 준비가되었습니다. 모든 대문자를 사용하여 구조체 이름을 정의하는 특별한 이유가 있습니까? 보통 이들은 대부분의 코딩 표준에서 소문자입니다.

+0

배열을 malloc 할 수 없습니다. 데이터가 이미 메모리에 저장되어 있습니다. – thirtythreeforty