Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的动态代码_C_Dynamic - Fatal编程技术网

C语言中的动态代码

C语言中的动态代码,c,dynamic,C,Dynamic,我有以下代码块用于德语动词练习: if (strcmp(*option, "sein") == 0) *option = linie.sein; if (strcmp(*option, "haben") == 0) *option = linie.haben; if (strcmp(*option, "possessiv") == 0) *option = linie.possessiv; if (strcmp(*option, "reflexiv") == 0)

我有以下代码块用于德语动词练习:

if (strcmp(*option, "sein") == 0)
    *option = linie.sein;

if (strcmp(*option, "haben") == 0)
    *option = linie.haben;

if (strcmp(*option, "possessiv") == 0)
    *option = linie.possessiv;

if (strcmp(*option, "reflexiv") == 0)
    *option = linie.reflexiv;

if (strcmp(*option, "accusativ") == 0)
    *option = linie.accusativ;

if (strcmp(*option, "dativ") == 0)
    *option = linie.dativ;
不过,我想将其浓缩为:

*option = linie.(*option);
或许:

*option = linie.(*option)();
不幸的是,这两种方法都不起作用。有什么想法吗

编辑@dasblinkenlight:

typedef struct
{
    char subjekt[20];
    char sein[20];
    char haben[20];
    char possessiv[20];
    char reflexiv[20];
    char accusativ[20];
    char dativ[20];
} satz;

satz linie =
{
    .subjekt = "",
    .sein = "",
    .haben = "",
    .possessiv = "",
    .reflexiv = "",
    .accusativ = "",
    .dativ = ""
};

char *option = argv[1];

您正在混合编译时和运行时选项。在C语言中,不能直接使用运行时获取的字符串中的标识符。但是,您可以将比较引入不透明函数

char *f(const satz *linie, const char *option)
{
    if (strcmp(option, "sein") == 0)
        return linie->sein;
    else if (strcmp(option, "haben") == 0)
        return linie->haben;
    else if (strcmp(option, "possessiv") == 0)
        return linie->possessiv;
    else if (strcmp(option, "reflexiv") == 0)
            return linie->reflexiv;
    else if (strcmp(option, "accusativ") == 0)
        return linie->accusativ;
    else if (strcmp(option, "dativ") == 0)
        return linie->dativ;
    else
        return NULL;
}

*option = f(&linie, *option);

基里连科的答案很好,对于像你这样的短结构来说效果很好。然而,对于较长的结构,维护所有strcmp调用可能会很麻烦。为了解决这个问题,您可以定义您试图匹配的关键字与结构中相应元素的偏移量之间的关系

struct relation
{
    char keyword[20];
    int offset;
};
#define REL_LEN (7)

struct relation rel[REL_LEN] = {
    {"subjekt", offsetof(satz, subjekt) },
    {"sein", offsetof(satz, sein) },
    {"haben", offsetof(satz, haben) },
    {"possessiv", offsetof(satz, possessiv) },
    {"reflexiv", offsetof(satz, reflexiv) },
    {"accusativ", offsetof(satz, accusativ) },
    {"dativ", offsetof(satz, dativ) }
};
然后可以使用offsetof宏(在stddef.h中)将关键字链接到它在结构中的位置

struct relation
{
    char keyword[20];
    int offset;
};
#define REL_LEN (7)

struct relation rel[REL_LEN] = {
    {"subjekt", offsetof(satz, subjekt) },
    {"sein", offsetof(satz, sein) },
    {"haben", offsetof(satz, haben) },
    {"possessiv", offsetof(satz, possessiv) },
    {"reflexiv", offsetof(satz, reflexiv) },
    {"accusativ", offsetof(satz, accusativ) },
    {"dativ", offsetof(satz, dativ) }
};
最后,使用上面的映射检索字符串的函数可能如下所示

char *lookup_keyword(const satz *linie, const char *option, 
                     const struct relation *rel, size_t rel_size)
{
    int i;
    char *pchar = (char *)linie;

    for (i=0; i<rel_size; i++)
    {
        if (strcmp(option, rel->keyword) == 0)
        {
            pchar += rel->offset;
            return pchar;
        }
        rel++;
    }
    printf("Error: no mapping found matching %s!\n", option);
    return "";
}

请显示
linie
option
容器和循环的定义。你应该真正学习“0-1-Many规则”。不幸的是,这在C语言中是不可能的,因为它没有反射或动态代码功能。关于混合comile time和runtime字符串Kirilenko,你是对的。我会说这是最好的。谢谢你的回答。