【问题标题】:How to return preliminary undefined struct from a function in C?如何从 C 中的函数返回初步的未定义结构?
【发布时间】:2021-10-09 05:53:19
【问题描述】:

一个小sn-p如下图:

struct module SELECT(FILE *f, int id, int db) {
    if (id == 1) {
        module table;
        return table;
    } else if (id == 2) {
        level table;
        return table;
    }
}

如何使函数返回 modulelevel 结构取决于函数处理?

这是我的modulelevel 结构:

typedef struct module {
    int id;
    char name[30];
    int mem_num;
    int cell_num;
    int del;
} module;

typedef struct level {
    int mem_num;
    int cell_count;
    int def;
} level;

调用示例:

str 与关卡结构连接的 IK(例如)。

FILE *tmp = fopen(str, "r");
level res = SELECT(tmp, 1, 1);

【问题讨论】:

  • SELECT 被声明为返回 module,但您在 SELECT 的第 7 行中返回了 level。你期待什么?
  • 你不能。一个函数有一个返回类型。做两个函数。
  • 这看起来像XY Problem
  • 你打算怎么打电话给SELECTEdit 并举个例子。
  • 您可以同时传递指向modulelevel 的指针,然后返回一个标志来说明您设置了哪个,但正如@Jabberwocky 所说,您可能遇到了XY 问题。

标签: c function struct return


【解决方案1】:

您可以使用union

module_or_level SELECT(FILE *f, int id, int db) {
    if (id == 1) {
        module_or_level table = {.type = t_module, .m = ... };
        return table;
    } else if (id == 2) {
        module_or_level table = {.type = t_level, .l = ... };
        return table;
    }
}

typedef struct module {
    int id;
    char name[30];
    int mem_num;
    int cell_num;
    int del;
} module;

typedef struct level {
    int mem_num;
    int cell_count;
    int def;
} level;

enum module_or_level_type {
  t_level,
  t_module
};

typedef struct {
  enum module_or_level_type type;
  union {
    module m;
    level l;
  };
} module_or_level;

调用:

FILE *tmp = fopen(str, "r");
module_or_level res = SELECT(tmp, 1, 1);
switch(res.type) {
case t_module: do_something_with(res.m); break;
case t_level: do_something_with(res.l); break;
}

【讨论】:

    【解决方案2】:

    如何使函数返回模块或层次结构取决于函数处理?

    你不能这样做,在这种情况下甚至不应该尝试。这并不完全正确,您可以使用 void 指针和奇怪的强制转换或使用其他奇怪的方法,但在这种情况下没有任何好处。

    只要有两个不同的函数并根据需要调用它们:

    module SELECT_MODULE(FILE *f, int db) {
        module table;
        ...
        return table;
    }
    
    level SELECT_LEVEL(FILE *f, int db) {
        level table;
        ...
        return table;
    }
    

    FILE *tmp = fopen(str, "r");
    ...
    level res = SELECT_LEVEL(tmp, 1);
    
    ...
    module mod = SELECT_MODULE(tmp, 1);   
    

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 2020-05-31
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      相关资源
      最近更新 更多