我有2个数据结构如下:
struct data_type{
char name[20];
int (*check_equal)(void* a, void* b);
}
和
struct attr_data{
int data_type;
void* (*get_func)(void* record); //Not sure about prototype of this function
}
第一个数据结构实际上是一个用于不同逻辑数据类型的结构,如string和int(c的数据类型为short,int将在“int”逻辑类型下)。所以,我有一个这个data_type结构的数组,其中包含2个元素:一个名字作为字符串,另一个名字作为整数。 string的“check_equal”函数只是使用给定的args a和b调用函数strcmp(),它们被类型化为char *。与“integer”元素的check_equal函数类似。但请注意,在此实现中,“check_equal”函数需要指向传递的2个整数。 第二个数据结构实际上是任何其他数据结构的元数据,如:
struct abc{
char* a;
int b;
}
对于struct abc中的每个成员变量,假设我在某个数组中维护了一个struct attr_data的实例。理想情况下,某个成员变量的get函数应始终返回该成员变量的值,而不是指向该成员变量的指针。因此,获取struct abc中的成员a的函数应该返回char *但是对于b,应该返回一个int。现在我需要使用这些get_funcs直接将参数传递给struct data_type的check_equal函数。但由于check_equal函数的原型是(void *,void *),因此使用此get_func失败。 任何人都可以帮我决定这里使用的函数指针的原型吗?有人可以帮助理解类型转换为int * *后面的问题吗?
答案 0 :(得分:0)
enum e{CHAR, INT, FLOAT, DOUBLE, CHARP, INTP, ......}
您可以使用这些数据类型作为参考,并使用switch case,您可以使用不同的数据类型进行所需的操作。
答案 1 :(得分:0)
这是一个简单的例子,其中struct data
可以包含字符串或整数。
struct data {
enum {
INT,
STRING
} type;
union {
int integer;
char* string;
} value;
};
现在你可以尝试做一些比较:
#include <stdio.h>
#include <string.h>
char str1[] = "test";
char str2[] = "test";
char str3[] = "another test";
int check_equal(struct data *v1, struct data *v2)
{
if(v1->type == INT && v2->type == INT) {
return v1->value.integer == v2->value.integer;
}
else if(v1->type == STRING && v2->type == STRING) {
return strcmp(v1->value.string, v2->value.string) == 0;
}
else return 0;
}
int main(void)
{
struct data var1, var2, var3, var4, var5, var6;
var1.type = INT;
var2.type = INT;
var3.type = INT;
var1.value.integer = 3;
var2.value.integer = 3;
var3.value.integer = 4;
var4.type = STRING;
var5.type = STRING;
var6.type = STRING;
var4.value.string = str1;
var5.value.string = str2;
var6.value.string = str3;
printf("var1 = var2 : %d \n",check_equal(&var1,&var2)); // 1
printf("var1 = var3 : %d \n",check_equal(&var1,&var3)); // 0
printf("var4 = var5 : %d \n",check_equal(&var4,&var5)); // 1
printf("var4 = var6 : %d \n",check_equal(&var4,&var6)); // 0
return EXIT_SUCCESS;
}