所以我从一个例子中获取了我的问题的代码的一部分,但它没有按照我期望的方式工作。第一个模块它是我第一次尝试使用该函数的地方,第二个是函数的定义,在第3个模块是标题中的函数(相应的代码就在它的位置),第4个模块是我发现的那些函数的一些解释。任何人都可以帮我解决什么问题?
第一个模块问题: 此行有多个标记
repo-> TList = create(cmpTrans,cpyT,delT);
第二个模块
Vector* create(CmpFun cmp, CpyFun cpy, DelFun del)
{
Vector* v = (Vector*)malloc(sizeof(Vector));
v->len = 0;
v->capacity = 10;
v->elems = (TElem)malloc(10*sizeof(TElem));
v->cmp = cmp;
v->del = del;
v->cpy = cpy;
return v;
}
第三个模块
transaction* cpyT(transaction* t);
void delT(transaction* t);
int cmpTrans(transaction* s1, transaction* s2);
/*
* Creates a copy of a transaction
* Input: t - pointer to transaction
* Output: t' - a copy of transaction t
* t'->day = t->day; s'->type = t->type; t'->desc = t->desc; t'->amount = t->amount;
* * Deallocates the memory pointed to by the given instance
* Deallocates the memory pointed to by the given instance
* Input: t - pointer to transaction
* Output: memory pointed to by t is deallocated
* Input: s1, s2 - pointers to transaction
* Output: 1 - if all the attributes of the 2 transactions coincide
* 0 - otherwise
*/
第四单元:
typedef void* TElem;
/*
* Pointer to a comparison function for two generic elements
*/
typedef int (*CmpFun)(TElem, TElem);
/*
* Pointer to a function that clones (copies) a generic element
*/
typedef TElem (*CpyFun)(TElem);
/*
* Pointer to a function that deletes (deallocates) a generic element
*/
typedef void (*DelFun)(TElem);
答案 0 :(得分:1)
您的函数指针typedef所有采用/返回TElem
类型,这意味着void *
。您正在声明采用/返回transaction *
类型的函数。这使得您从这些函数中创建的函数指针与您创建的typedef不兼容:
transaction *(*)(transaction *) != TElem (*)(TElem)
int (*)(transaction *, transaction *) != int (*)(TElem, TElem)
void (*)(transaction *) != void (*)(TElem)
您可能会感到困惑,因为在C中,void *
与其他指针类型之间的转换是隐含的。但是,函数指针类型之间的转换(其中一个采用void *
参数而另一个采用不参数)不是。
要解决此问题,您需要重写cpyT
,delT
和cmpTrans
以使用匹配的签名:
TElem cpyT(TElem t);
void delT(TElem t);
int cmpTrans(TElem s1, TElem s2);
或者,当您致电create
时,您可以通过类型转换强制完成任务:
repo->TList = create((CmpFun)cmpTrans, (CpyFun)cpyT, (DelFun)delT);