2013-03-18 51 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