我有以下代码,但它并没有按照预期工作。它可以编译,但在执行时会抛出很多警告和段错误:
#include <stdio.h>
enum output {
A,
B,
C,
D,
};
struct translation {
char *from;
enum output to;
};
struct dictionary {
struct translation *foo;
struct translation *bar;
};
enum language {
ONE,
ANOTHER,
};
struct dictionary languages[] = {
[ONE] = {
.foo = {
{"LF", A},
{"LLF", C},
{"RRF", D},
},
.bar = {
{"L", B},
},
},
[ANOTHER] = {
.foo = {
{"FF", B},
{"RRF", D},
},
.bar = {
{"LF", B},
{"R", C},
{"RR", D},
},
},
};
int main(void)
{
printf("%s\n", languages[ONE].foo[0].from);
return 0;
}
我可能以错误的方式初始化了languages
。
- 我想要一个
languages
数组,其中我可以通过language
访问不同的字典:languages [ONE]
- 我想要使用字典字段访问不同的翻译表格:
languages [ONE] .foo
- 所有通过语言+字段对访问的翻译表格可能具有不同的数组长度,如代码示例所示
这可行吗?我做错了什么?
使用gcc
编译时,我会得到以下(裁剪后的)输出:
asdf.c:27:17: warning: braces around scalar initializer
.foo = {
^
asdf.c:27:17: note: (near initialization for ‘languages[0].foo’)
asdf.c:28:25: warning: braces around scalar initializer
{"LF", A},
^
asdf.c:28:25: note: (near initialization for ‘languages[0].foo’)
asdf.c:28:26: warning: initialization of ‘struct translation *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
[...]
代码的多个部分都有相同的警告/注释。
[]
(没有大小),但那是非法的。如果你愿意,你可以把它发表为答案。虽然在接受之前,我会等待看看是否有一种方法可以使这个工作而不必指定一个足够大以容纳所有翻译的字典表大小。 - Peque