C作为参数?

时间:2013-04-07 20:54:45

标签: c

所以我从一个例子中获取了我的问题的代码的一部分,但它没有按照我期望的方式工作。第一个模块它是我第一次尝试使用该函数的地方,第二个是函数的定义,在第3个模块是标题中的函数(相应的代码就在它的位置),第4个模块是我发现的那些函数的一些解释。任何人都可以帮我解决什么问题?

第一个模块问题: 此行有多个标记

  • 从不兼容的指针类型[默认启用]
  • 传递'create'的参数1
  • 从不兼容的指针类型[默认启用]
  • 传递'create'的参数3
  • 从不兼容的指针类型[默认启用]
  • 传递'create'的参数2
  

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);

1 个答案:

答案 0 :(得分:1)

您的函数指针typedef所有采用/返回TElem类型,这意味着void *。您正在声明采用/返回transaction *类型的函数。这使得您从这些函数中创建的函数指针与您创建的typedef不兼容:

      transaction *(*)(transaction *) != TElem (*)(TElem)
int (*)(transaction *, transaction *) != int (*)(TElem, TElem)
              void (*)(transaction *) != void (*)(TElem)

您可能会感到困惑,因为在C中,void *与其他指针类型之间的转换是隐含的。但是,函数指针类型之间的转换(其中一个采用void *参数而另一个采用不参数)不是。

要解决此问题,您需要重写cpyTdelTcmpTrans以使用匹配的签名:

TElem cpyT(TElem t);
void delT(TElem t);
int cmpTrans(TElem s1, TElem s2);

或者,当您致电create时,您可以通过类型转换强制完成任务:

repo->TList = create((CmpFun)cmpTrans, (CpyFun)cpyT, (DelFun)delT);