Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_Function_Types_Struct_Arguments - Fatal编程技术网

C泛型类型作为函数参数输入

C泛型类型作为函数参数输入,c,function,types,struct,arguments,C,Function,Types,Struct,Arguments,所以我有两个不同的结构,其中我要访问的所有属性都是相同的。我还有一个函数,是谁的参数,我希望能够接受两者中的任何一个。例如: typedef struct{ int whatnot = 14; int thing[11]; } TH_CONFIG; typedef struct{ int whatnot = 3; int thing[5]; } TH_CONFIG_2; *_CONFIG var; void fun(*_CONFIG input) {

所以我有两个不同的结构,其中我要访问的所有属性都是相同的。我还有一个函数,是谁的参数,我希望能够接受两者中的任何一个。例如:

typedef struct{
    int whatnot = 14;
    int thing[11];
} TH_CONFIG;

typedef struct{
    int whatnot = 3;
    int thing[5];
} TH_CONFIG_2;

*_CONFIG var;

void fun(*_CONFIG input)
{
    input.whatnot = 5;
}

int main(){
    fun(var);
}
我可能有一点想法,我应该使用void作为我可以进行类型转换的类型,但是我的搜索只产生了关于函数指针、模板和C#的东西

编辑:*配置并不意味着语法正确,它意味着我不知道该怎么做,但它应该是_-CONFIG类型的可能解决方案

  • 只需对它们两个使用长度为11的数组。你的操作系统上的最后6个字节真的用完了吗
  • 让它成为一个动态数组
  • 只需在汇编中编写,您显然不关心C的更高级别
  • 使用支持模板或多态性的C++语言,
  • 只需传入您关心的
    struct
    的参数即可

    虚无乐趣(int*whatnot){ *whatnot=5; }

    int main(){ 乐趣(我的结构等等); 返回0; }

  • 考虑准OO设计的因素

    结构{ 国际等等; }typedef通用

    结构配置1{ 共同的; int thing[11]; };

    结构配置2{ 共同的; int-thing[5]; }

  • 但是如果你坚持

    void fun(void* input) {
        ( (int)(*input) ) = 5;
    }
    
    或者

    注意:这不会通过任何C商店的代码审查。

    可能的解决方案

  • 只需对它们两个使用长度为11的数组。你的操作系统上的最后6个字节真的用完了吗
  • 让它成为一个动态数组
  • 只需在汇编中编写,您显然不关心C的更高级别
  • 使用支持模板或多态性的C++语言,
  • 只需传入您关心的
    struct
    的参数即可

    虚无乐趣(int*whatnot){ *whatnot=5; }

    int main(){ 乐趣(我的结构等等); 返回0; }

  • 考虑准OO设计的因素

    结构{ 国际等等; }typedef通用

    结构配置1{ 共同的; int thing[11]; };

    结构配置2{ 共同的; int-thing[5]; }

  • 但是如果你坚持

    void fun(void* input) {
        ( (int)(*input) ) = 5;
    }
    
    或者


    注意:这不会通过任何C商店的代码审查。

    您可以使用任何指针类型并强制转换它

    如果您访问的所有属性都相同,我猜其中一个是另一个的扩展(因为属性需要与结构的开头具有相同的偏移量)。在这种情况下,您可能需要使用此模式:

    struct base {
      int foo;
      char **strings;
    };
    
    struct extended {
      struct base super;
      double other_stuff;
    };
    

    由于
    super
    位于
    struct extended
    的开头,因此可以将
    struct extended*
    强制转换为
    struct base*
    。当然,您可以通过重复
    struct extended
    开头的相同字段来实现这一点,但随后您会重复自己的操作。

    您可以使用任何指针类型并强制转换它

    如果您访问的所有属性都相同,我猜其中一个是另一个的扩展(因为属性需要与结构的开头具有相同的偏移量)。在这种情况下,您可能需要使用此模式:

    struct base {
      int foo;
      char **strings;
    };
    
    struct extended {
      struct base super;
      double other_stuff;
    };
    

    由于
    super
    位于
    struct extended
    的开头,因此可以将
    struct extended*
    强制转换为
    struct base*
    。当然,您可以通过重复
    struct extended
    开头的相同字段来实现这一点,但随后您会重复自己的操作。

    void fun(*\u CONFIG input)
    -这是一个语法错误。您可能需要了解。这两个结构不兼容;
    int whatnot=3符号不是有效的C;
    *\u配置变量不是有效的C;
    void fun(*\u CONFIG input)
    是无效的C。通常,函数只能在一种类型上工作;否则,它缺乏功能凝聚力。如果必须,您可以通过
    void*
    和其他标识
    void*
    所指类型的内容来传递值。或者您可以使用类型的
    联合。您甚至可以使用
    .whatnot
    成员来确定您正在处理的类型,如果联合中的所有类型都有该成员并且该成员包含单独的值。
    void fun(*\u CONFIG input)
    -这是一个语法错误。您可能需要了解。这两种结构不兼容;
    int whatnot=3符号不是有效的C;
    *\u配置变量不是有效的C;
    void fun(*\u CONFIG input)
    是无效的C。通常,函数只能在一种类型上工作;否则,它缺乏功能凝聚力。如果必须,您可以通过
    void*
    和其他标识
    void*
    所指类型的内容来传递值。或者您可以使用类型的
    联合。您甚至可以使用
    .whatnot
    成员来确定您正在处理的类型,如果联合中的所有类型都存在该成员,并且该成员包含一个单独的值。它们实际上是相同的结构,但具有不同的值和数组长度,我无法真正malloc,需要硬编码。它们实际上是相同的结构,但是由于数组的值和长度不同,我不能真正使用malloc,需要进行硬编码。是的。不能3。四号。不能5。争论太多了,但还是要感谢你第一个不屈不挠的建议。我想这真的解决不了问题吗?我仍然有两个不同的结构没有被输入到一个函数中。不过我可能错了。继续:谢谢你的最后一个建议,这个代码没有被审查。@DanielCardin to be fair 3是唯一屈尊的建议。我很惊讶你的内存如此紧张,对于那些认为自己内存或CPU有限但实际上只是过早优化的人来说,有99对1的问题,所以我必须在这方面努力。你会得到