微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 中使用函数指针的通用最小函数

如何解决在 C 中使用函数指针的通用最小函数

我正在尝试编写一个通用的 C 函数,它使用函数指针返回数组的最小值。

代码是:

#include <stdio.h>

int min_index(void *arr,int size,int (*compare)(void *,void *))
{
    int i;
    int min = 0;

    for (i = 1; i < size; i++)
    {
        if (((*compare)(&arr[i],&arr[min])) < 0)
            min = i;
    }

    return min;
}

int comp_int(int *arr1,int *arr2)
{
    if (*arr1 < *arr2)
        return -1;
    else
        return 1;
}

int comp_char(char *arr1,char *arr2)
{
    if (*arr1 < *arr2)
        return -1;
    else
        return 1;
}

int main()
{
    int arr1[5] = {45,56,34,23,19};
    int index = min_index(arr1,5,comp_int);  // calling min_index with integer array
    printf("Minimum value in the array is %d\n",arr1[index]);

    char arr2[5] = {'a','b','c','d','e'};
    int index2 = min_index(arr2,comp_char); // calling min_index with char array
    printf("Minimum value in the array is %c\n",arr2[index2]);

    return 0;
}
  1. 代码仅适用于 char 数组。它不适用于 int 数组。

  2. 我调试了代码。我发现,当我用整数数组调用 min_index 函数时,只有 arr 的第一个值是正确的数字,但剩下的是一些垃圾值。

  3. 但是,当我用字符数组调用 min_index 函数时,所有的值都是正确的。在这种情况下没有垃圾值。我得到了正确的输出

问题:为什么代码适用于 char 数组而不适用于 int 数组?

解决方法

它不起作用,因为您需要将数组本身转换为原始类型,然后通过索引访问。由于 C 没有 Invalid Number 或类型检查,因此您需要通过大小和符号访问 template 之类的函数以获得正确的转换和排序。

min_of()
,

我根据几个用户的评论想出了一个解决方案。这次我启用了所有警告,并处理了每个警告。代码是:

#include <stdio.h>
void* minimum(void *arr,int arr_count,size_t size,int (*compare)(const void *,const void *))
{
    void* pmin = arr;

    for(int i=1; i<arr_count; i++)
    {
        void* value = (char*)arr + i*size;  // size is the sizeof the type.

        if(((*compare)(value,pmin))<0)
        pmin = value;

    }

    return pmin;
    
}

int compare_ints(const void* a,const void* b)
{
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
 
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
}

int compare_chars(const void* a,const void* b)
{
    char arg1 = *(const char*)a;
    char arg2 = *(const char*)b;
 
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
}


int main()
{
    int arr1[5] = {45,56,34,23,19};
    int *pmin = minimum(arr1,5,4,compare_ints); // In my system sizeof(int) is 4
    printf("Minimum value in the array is %d\n",*pmin);

    char arr2[5] = {'a','b','c','d','e'};
    char* pmin2 = minimum(arr2,1,compare_chars); // sizeof(char) is 1
    printf("Minimum value in the array is %c\n",*pmin2 );

    return 0;
}

输出是(没有任何警告):

Minimum value in the array is 19
Minimum value in the array is a

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。