2013-03-18 48 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不喜歡這樣。什麼是我可以引用我的代碼中的內存結構的另一種方式,它會乾淨地編譯?

+0

根據標準,具有靈活數組成員的結構不得是數組結構或元素的成員。所以'STRLIST'無效。 – 2013-03-18 22:47:01

+0

@DanielFischer我知道。重寫這段代碼的最好方法是什麼,以便它符合標準? – thirtythreeforty 2013-03-18 22:48:01

+0

好問題。你標記'char str [];'行讓我懷疑SDCC根本不喜歡靈活的數組成員?在這種情況下,我看到的唯一選擇是爲數組設置一個固定的大小,或者使用指針(並放棄局部性)。如果它接受靈活的數組成員,但不是遞歸地,你可以在'STRLIST'中作弊並使用'unsigned entry [];'。雖然也不完全令人滿意。 – 2013-03-18 23:14:07

回答

1

通常的辦法是給陣列構件的尺寸:

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

這令編譯器高興。

編輯:您可以使用--std-c99--std-sdcc99開關使SDCC瞭解您的原始代碼嗎?

+0

我看到......一個問題。我希望'sizeof(STRLIST_ENTRY)'返回沒有變量成員的結構體的大小。 (這段代碼已經寫入了一個不同的編譯器,允許這個!)有沒有這樣的版本('str [0]'也許?)會這樣做?或者,我應該只用'sizeof(...) - 1'來修改代碼嗎? – thirtythreeforty 2013-03-18 22:25:56

+0

@ gh403:也許你可以說服SDCC瞭解你的原始代碼 - 請參閱我編輯的答案。 – RichieHindle 2013-03-18 22:32:30

+0

否:(我得到'警告186:無效的使用靈活數組成員的結構',後面跟着'錯誤200:字段'入口'有不完整的類型',都是指第二個'//這條線' – thirtythreeforty 2013-03-18 22:42:13

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

我會這樣做,malloc陣列準備好使用它。是否有任何特定的原因使用全部大寫來定義結構名稱?通常這些在大多數編碼標準中都是小寫字母。

+0

我不能'malloc'數組,數據已經存在內存中了。 – thirtythreeforty 2013-03-18 23:35:10