如何解决在 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;
}
问题:为什么代码适用于 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 举报,一经查实,本站将立刻删除。