所以,我正在写一些代码,使用动态数组来做一些线性代数的事情,我有一个问题.我需要一些函数来同时对FLOAT_VECTRUCTS和DOUBLE_VECTRUCTS进行操作,这两个 struct 的定义如下:

struct float_vector{
  int size_cap;
  int current_size;
  
  float *data;
};

struct double_vector{
  int size_cap;
  int current_size;
  
  double *data;
};

我想要在这两种类型上使用的函数之一是SUM_VECTRUCTS,其定义如下:

int sum_vectors(struct double_vector *vector1, struct double_vector *vector2, struct double_vector *buffer){
  
  // Check if vectors, including buffer, are the same size
  if ((vector1->current_size != vector2->current_size)||(vector1->current_size != buffer->current_size)){
    fprintf(stderr, "ERROR: Vectors and buffer are not the same size");
    return -1;
  }

  // Main loop and calculations
  for (int i = 0; i < vector1->current_size; i++){
    buffer->data[i] = vector1->data[i] + vector2->data[i];
  }
  return 0;
}

有没有什么"好"的办法呢?

先谢谢你.

所以,我想使用_Generic,但我认为它太难调试了,而且会变得非常不可读.

我还想过使用联合,这样我只能有一个"向量" struct ,但我放弃了,因为它不能解决必须编写两个做相同事情的函数的问题.

编辑:

正如一些 comments 者所说,这可能是XY问题的一个例子.因此,我将更好地解释我是如何解决这个问题的:

我正在编写一些代码来用C语言在OpenGL中进行一些渲染,因此,我需要一些方法来存储我想要渲染的三角形顶点的坐标.我已经有很多使用这些动态数组(向量和矩阵)的代码,所以我想重用这些代码.

推荐答案

我需要一些函数来同时对浮点向量和双向量进行运算

可能的方法:

  1. 直接解决方案:创建函数对:sum_vectors_float(), sum_vectors_double().为了最大限度地减少调试/维护几乎相同的代码所做的工作,请将它们放在一起.

  2. 如上所述,还创建了sum_vectors()个使用_Generic来指导代码 Select .这简化了函数的调用.

  3. 只有当一个人有许多相同的函数,而这些函数只有struct种类型不同时,这种方法才有意义.创建3.C文件:一个包含int sum_vectors(FP *vector1, FP *vector2, FP *buffer)的文件.包括第一个.c文件的#define FP struct float_vector #define sum_vectors_float排在第二.具有#define FP struct double_vector #define sum_vectors_double的第三个文件,并且包括第一个.不要直接编译第一个.c文件.


不要使用void *%的方法.失败的类型就是失败的容错类型判断.


  • 研究<tgmath.h>如何执行类似的任务.

  • 在我看来,由于float个 routine 和double个 routine 几乎相同,OP正在寻找一种不重复函数实现源代码的方法.尽管这是令人钦佩的,但更重要的目标是简化和改善用户对这些功能的使用.这是OP没有与代码讨论的问题.

C++相关问答推荐

CC crate 示例不会与C函数链接

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

Apple Libm的罪恶功能

ISO_C_BINDING,从Fortran调用C

什么C代码将确定打开的套接字正在使用的网络适配器?

丑陋的三重间接:可扩展的缓冲区管理 struct

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

C在声明带有值的数组时,声明大小有用吗?

为什么我会收到释放后堆使用错误?

FRIDA-服务器成为端口扫描的目标?

在句子中转换单词的问题

如何用c语言修改shadow文件hash部分(编程)?

如何在提取的索引中分配空值?

按长度对argv中的单词进行排序

试图创建一个基本的Word克隆,但遇到了障碍

gdb - 你能找到持有内部 glibc 锁的线程吗?

使用替代日历打印日期

如何修复数组数据与列标题未对齐的问题?

为什么需要struct in_addr

Codewars Kata 掷骰子的不稳定行为