决定功能原型

时间:2014-05-06 09:19:47

标签: c data-structures functional-programming function-pointers

我有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 * *后面的问题吗?

2 个答案:

答案 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;
}