gpt4 book ai didi

c - 函数中的变量输入类型

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:35 25 4
gpt4 key购买 nike

我想对 vector 执行不同的操作,例如,将它们相加,但我不知道编译时的 vector 类型(intfloat)。我的要求是在引擎盖下使用的类型是指定的类型,因为两个 int 相乘所需的时间与两个 double 相乘所用的时间不同。一种选择是为每种类型设置一个函数,但我正在探索其他方法,比如尝试重用相同的函数。因为 c 是静态类型的,所以这对我来说并不简单。

我重用相同功能的方法如下。比方说,我想添加两个一维 vector ,它们可以是任何类型:

int a[] = {1, 2, 3};
int b[] = {4, 5, 6};

或者也可以是:

float a[] = {1, 2, 3};
float b[] = {4, 5, 6};

所以我想添加两个 vector ,但使用在编译时不知道类型的通用函数。我的第一个想法是在函数声明中使用 void*,一旦进入函数内部,就将 vector 转换为正确的类型。但是,我的实现看起来很糟糕。

void testVariableInput(void *a, void *b, void *out, int m, int type)
{
int *aInt, *bInt, *outInt;
float *aFloat, *bFloat, *outFloat;
double *aDouble, *bDouble, *outDouble;

if (type == 1)
{
aInt = (int*)a;
bInt = (int*)b;
outInt = (int*)out;

for (int i = 0; i < m; i++)
{
outInt[i] = aInt[i] + bInt[i];
}
}
else if (type == 2)
{
aFloat = (float*)a;
bFloat = (float*)b;
outFloat = (float*)out;

for (int i = 0; i < m; i++)
{
outFloat[i] = aFloat[i] + bFloat[i];
}
}
else if (type == 3)
{
aDouble = (double*)a;
bDouble = (double*)b;
outDouble = (double*)out;

for (int i = 0; i < m; i++)
{
outDouble[i] = aDouble[i] + bDouble[i];
}
}

if (type == 1)
{
out = (void*)outInt;
}
else if (type == 2)
{
out = (void*)outFloat;
}
else if (type == 3)
{
out = (void*)outDouble;
}
}

然后调用函数。不确定是否需要 (void*) 转换。

float a[] = {1, 2, 3};
float b[] = {4, 5, 6};
float c[] = {0, 0, 0};
testVariableInput((void*)a, (void*)b, (void*)c, 3, 2);

注意最后一个参数2是类型1=int,2=float,3=double

我找不到任何相关的例子。这有什么设计模式吗?或者也许有更简单的存档方法?

最佳答案

Or maybe there is a simpler way of archiving this?

考虑选项是为每种类型设置一个函数,该函数由相同的函数调用。

void testVariableInput_int(const int *a, const int *b, int *out, int m) {
while (m > 0) {
m--;
out[m] = a[m] + b[m];
}
}

// Like-wise for the other 2
void testVariableInput_float(const float *a, const float *b, float *out, int m) {...}
void testVariableInput_double(const double *a, const double *b, double *out, int m){...}


void testVariableInput(void *a, void *b, void *out, int m, int type) {
switch (type) {
case 1 : testVariableInput_int(a, b, out, m); break;
case 2 : testVariableInput_float(a, b, out, m); break;
case 3 : testVariableInput_double(a, b, out, m); break;
}
}

示例使用

float a[] = {1, 2, 3};
float b[] = {4, 5, 6};
float c[] = {0, 0, 0};
#define N (sizeof c/sizeof c[0])
#define TYPE_FLOAT 2
testVariableInput(a, b, c, N, TYPE_FLOAT);

在 C 中,利用 void * 无需强制转换即可转换为任何对象指针以及无需强制转换即可将任何对象指针转换为 void *也是 Actor 。

Advanced

研究 _Generic 以避免需要 int 类型

未经测试的示例代码:

#define testVariableInput(a, b, c) _Generic(*(a), \
double: testVariableInput_double, \
float: testVariableInput_float, \
int: testVariableInput_int, \
default: testVariableInput_TBD, \
)((a), (b), (c), sizeof (a)/sizeof *(a))

float a[] = {1, 2, 3};
float b[] = {4, 5, 6};
float c[] = {0, 0, 0};
testVariableInput(a, b, c);

_Generic 使用起来有点棘手。对于 OP,我建议坚持使用非 _Generic 方法。

关于c - 函数中的变量输入类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com