我正在为自己编写一些东西,我想写一个简单的泛型函数,它在数组中找到最大值。
ioctl(FP,CDROMEJECT)
函数适用于int和chars,但是当我传递浮点数时,它返回4.4表示浮点数,44.44表示双精度数。我错过了什么?谢谢。
答案 0 :(得分:2)
你的代码没有意义; memcmp()
应该如何计算大于一个字节的最大值?请注意,its return value仅告诉您两个第一个不同的字节之间的关系。这不适用于浮点数据类型,除非你假设是big-endian,否则它不会对整数有效。所以,简而言之,它不起作用。
您必须使用正确的类型和实际的比较运算符来获取正确的代码。它不会很漂亮,但C很难制作出非常通用的代码。
此外,您对maxAdr
的处理完全没有意义,并且会泄漏内存。
答案 1 :(得分:1)
问题在于,在泛型函数中,您无法对两个二进制数据块如何相互关联做出任何假设。呼叫者必须告诉您的功能如何操作。
这是如何将程序重新编写为传统的通用C编程:
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
// declare a desired format for the generic comparison function:
typedef bool comp_func (const void* p1, const void* p2);
// write comparison functions ("functors") for all valid types:
bool more_int (const void* p1, const void* p2)
{
return *(int*)p1 > *(int*)p2;
}
bool more_char (const void* p1, const void* p2)
{
return *(char*)p1 > *(char*)p2;
}
bool more_float (const void* p1, const void* p2)
{
return *(float*)p1 > *(float*)p2;
}
bool more_double (const void* p1, const void* p2)
{
return *(double*)p1 > *(double*)p2;
}
// The actual function.
const void* get_max_value (const void* arr, // pointer to 1st element (base)
size_t arr_size, // size of array
size_t obj_size, // size of one object
comp_func* more) // comparison function
{
const uint8_t* byte = arr; // can't take the contents of void* so convert to bytes
const void* max; // pointer to the largest value found
if(more(&byte[0], &byte[obj_size])) // initialize max by comparing the first two objects
{
max = &byte[0];
}
else
{
max = &byte[obj_size];
}
for(size_t i=2; i<arr_size; i++) // start at index 2, index 0 and 1 already checked
{
if(more(&byte[i*obj_size], max))
{
max = &byte[i*obj_size];
}
}
return max;
}
int main (void)
{
int iarray[] = {3, 4, 1, 5, 2};
char charray[] = {'A', 'C', 'E', 'B', 'D'};
float farray[] = {2.2f, 5.5f, 3.3f, 4.4f, 1.1f};
double darray[] = {11.11, 22.22, 55.55, 33.33, 44.44};
const void *pMax;
pMax = get_max_value(iarray,
sizeof(iarray)/sizeof(*iarray),
sizeof(*iarray),
more_int);
printf("\n%d\n", *(const int*)pMax);
pMax = get_max_value(charray,
sizeof(charray)/sizeof(*charray),
sizeof(*charray),
more_char);
printf("\n%c\n", *(const char*)pMax);
pMax = get_max_value(farray,
sizeof(farray)/sizeof(*farray),
sizeof(*farray),
more_float);
printf("\n%1.1f\n", *(const float*) pMax);
pMax = get_max_value(darray,
sizeof(darray)/sizeof(*darray),
sizeof(*darray),
more_double);
printf("\n%2.2f\n", *(const double*) pMax);
return 0;
}
输出:
5
E
5.5
55.55