gpt4 book ai didi

c - C中的多类型运算函数

转载 作者:行者123 更新时间:2023-12-05 01:32:17 24 4
gpt4 key购买 nike

我正在编写一个函数,它只是计算两个值的总和,

但是这些值的C类型是在参数中指定的,

可以是int, unsigned int, char, unsigned char, float ...

我搜索了一种解决方案,无需编写大量 C 代码来处理所有不同的混合情况。

要清楚的代码是:

void addition(unsigned char type_data_1_uc, void *value_data_1_ptr, 
unsigned char type_data_2_uc, void *value_data_2_ptr,
unsigned char type_result_uc, void *value_result_ptr)
{

/* types :
0 : TYPE_BIT
1 : TYPE_CHAR
2 : TYPE_UNSIGNED_CHAR
3 : TYPE_INT
4 : TYPE_UNSIGNED_INT
5 : TYPE_SHORT_INT
6 : TYPE_UNSIGNED_SHORT_INT
7 : TYPE_LONG
8 : TYPE_UNSIGNED_LONG
9 : TYPE_FLOAT */

/* INT + INT = INT */
if ((type_data_1_uc == 3)
&& (type_data_2_uc == 3)
&& (type_result_uc == 3))
{
*((int *) value_result_ptr) = *((int *) value_data_1_ptr) + *((int *) value_data_2_ptr);
}

/* FLOAT + FLOAT = FLOAT */
if ((type_data_1_uc == 9)
&& (type_data_2_uc == 9)
&& (type_result_uc == 9))
{
*((float *) value_result_ptr) = *((int *) value_data_1_ptr) + *((int *) value_data_2_ptr);
}

/* UNSIGNED CHAR + INT = INT */
if ((type_data_1_uc == 2)
&& (type_data_2_uc == 3)
&& (type_result_uc == 3))
{
*((int *) value_result_ptr) = *((unsigned char *) value_data_1_ptr) + *((int *) value_data_2_ptr);
}

/* ......... */

}


int main(int argc, char **argv)
{

int data_1;
int data_2;
int result;

data_1 = 26;
data_2 = 32;


addition(3, &data_1, 3, &data_2, 3, &result);

printf("result = %d\n", result);

return 0;

}

我想过使用 union 结构,但它并没有解决问题,因为 union 也需要静态转换:

/* UNION DATA */
union data_union
{
char tab_c[4];
unsigned char tab_uc[4];
int i;
unsigned int ui;
short int si;
unsigned short int usi;
long l;
unsigned long ul;
float f;
};


void addition(unsigned char type_data_1_uc, union data_union *value_data_1_ptr,
unsigned char type_data_2_uc, union data_union *value_data_2_ptr,
unsigned char type_result_uc, union data_union *value_result_ptr)
{

/* types :
0 : TYPE_BIT
1 : TYPE_CHAR
2 : TYPE_UNSIGNED_CHAR
3 : TYPE_INT
4 : TYPE_UNSIGNED_INT
5 : TYPE_SHORT_INT
6 : TYPE_UNSIGNED_SHORT_INT
7 : TYPE_LONG
8 : TYPE_UNSIGNED_LONG
9 : TYPE_FLOAT */


/* INT + INT = INT */
if ((type_data_1_uc == 3)
&& (type_data_2_uc == 3)
&& (type_result_uc == 3))
{
(*value_result_ptr).i = (*value_data_1_ptr).i + (*value_data_2_ptr).i;
}

/* FLOAT + FLOAT = FLOAT */
if ((type_data_1_uc == 9)
&& (type_data_2_uc == 9)
&& (type_result_uc == 9))
{
(*value_result_ptr).f = (*value_data_1_ptr).f + (*value_data_2_ptr).f;
}

/* UNSIGNED CHAR + INT = INT */
if ((type_data_1_uc == 2)
&& (type_data_2_uc == 3)
&& (type_result_uc == 3))
{
(*value_result_ptr).i = (*value_data_1_ptr).uc + (*value_data_2_ptr).i;
}

}


int main(int argc, char **argv)
{

static union data_union data_1_union;
static union data_union data_2_union;
static union data_union result_union;

memset(&data_1_union, 0, sizeof(union data_union));
memset(&data_2_union, 0, sizeof(union data_union));

data_1_union.i = 26;
data_2_union.i = 32;


addition(3, &data_1_union, 3, &data_2_union, 3, &result_union);

printf("result_union.i = %d\n", result_union.i);

return 0;

}

有解决这个问题的想法吗?

最佳答案

如果没有一些“痛苦”,您就无法做到这一点,因为 C 是静态类型语言。编译器需要知道变量的类型才能生成正确的指令。大多数 CPU:s 有不同的指令来添加 8 位整数、32 位整数、 float 等。

也就是说,您当然可以改进界面:我会使用可变参数来制作原型(prototype):

typedef enum {
TYPE_BIT = 0,
TYPE_CHAR,
TYPE_UNSIGNED_CHAR,
TYPE_INT,
TYPE_UNSIGNED_INT,
TYPE_SHORT_INT,
TYPE_UNSIGNED_SHORT_INT,
TYPE_LONG,
TYPE_UNSIGNED_LONG,
TYPE_FLOAT,
} Type;

void addition(Type type, void *result, ...);

这需要用四个参数调用,后两个参数应具有 type 参数指示的类型。结果存储在 result 中,它应该是指向与参数相同类型的指针。

不确定如何表示单个位值,可能是 unsigned char 但它有点毫无意义:单个位不是您可以在 C 中进行算术运算的类型,所以您只是去最终用更多的位进行加法,然后屏蔽掉其中的一些。在大多数机器上,您也不可能有指向内存中单个位的指针。

关于c - C中的多类型运算函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20652595/

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