【问题标题】:how to initialize generic functions in c如何在c中初始化泛型函数
【发布时间】:2012-11-29 01:06:46
【问题描述】:

我正在尝试在 c 中使用通用比较函数的一个简单示例,但是在初始化它时,我收到警告消息,指出在初始化它们时类型不兼容。感觉我在这里缺少一些基本的东西......

#include <stdio.h>
#include <string.h>

int
compare(int (*comp)(void *first, void *second), void *arr, int size)
{
    int i, j, dups=0, arrsize=sizeof(arr)/size;
    for(i=0; i<arrsize; i++)
    {
        for(j=0; j<arrsize; j++)
        {
            if(j!=i)
                dups+=(*comp)(&arr[i], &arr[j]);
        }  
    }
     return dups;
}

int
compareints(int *first, int *second)
{
    if(*first==*second)
        return 1;
    return 0;
}

int main(int argc, const char * argv[])
{
    int (*comp)(void *, void *)=&compareints; //Here is where I get the warning...
    int arr[10]={22, 39, 78, 22, 99, 12, 82, 10, 11, 28};
    printf("The arr has dups: %d\n", compare(comp, arr, sizeof(int)));
    return 0;
}

编辑: 该程序无法正常运行,它与数组的处理有关。功能 prog 的修改如下:

int
compare(int (*comp)(void *first, void *second), void **arr, int size)
    ....
    ....
    ....
    dups+=(*comp)(arr[i], arr[j]);

int 
compareints(....)
    if((*((int *)first))==(*((int *)second)))
       return 1;


int 
main(int argc, const char * argv[])
{
     int (*comp)(void *, void *)=&compareints;
     int arr[10]={22, 39, 78, 22, 99, 12, 82, 10, 11, 28};
     void **arr2=malloc(sizeof(int *)*10);
     for(int i=0; i<10; i++)
     {
         arr2[i]=&arr[i];
     }
     printf("The arr has dups: %d\n", compare(comp, arr2, 10));
     return 0;
}

【问题讨论】:

    标签: c generics


    【解决方案1】:

    不幸的是,当 void *int * 是函数签名的一部分时,它们不能像这样混合使用。即使int * 可以转换为void *int (*)(int *, int *) 也不能转换为int (*)(void *, void *)。签名必须完全匹配。

    int
    compareints(void *first, void *second)
    {
        if (*((int *) first) == *((int *) second))
            return 1;
        return 0;
    }
    

    【讨论】:

    • 嗨@John Kugelman,你在正确的地方,警告消失了。但有一件事让我感到困惑:当作为 void * 传递时,是所有指针都是这种情况,还是仅适用于 int 指针?
    • @patriques 这与指针无关,这是函数指针的规则。函数指针只有在参数类型和返回类型完全匹配时才兼容。
    【解决方案2】:

    类型:

    int compareints(int *first, int *second)
    

    不等于:

    int (*comp)(void *first, void *second)
    

    您必须更改函数的签名以接受两个 void * 参数,或者在赋值期间对其进行类型转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 2021-01-05
      • 1970-01-01
      • 2013-06-27
      • 2014-04-05
      • 1970-01-01
      • 2019-10-06
      • 2013-10-21
      相关资源
      最近更新 更多