我试图在C中使用一个通用方法来识别数组中最大的元素。
起初,我对此进行了编程:
int compare(const void* a, const void* b) {
if(a < b)
return 0;
return 1;
}
int main(void) {
int (*prt)(const void*, const void*);
prt=compare;
printf("%i",(*prt)(1,1));
return EXIT_SUCCESS;
}
这很好用,但如果我尝试放置函数指针prt
在一种新方法中,我不知道如何处理它。
Addionally我不知道如何处理void*
类型。
void* maximum(int len, void* array, size_t size, int (*cmp)(const void*, const void*));
int compare(const void* a, const void* b) {
if(a < b)
return 0;
return 1;
}
int main(void) {
int (*prt)(const void*, const void*);
prt=compare;
printf("%i",(*prt)(1,1));
int array[6] = {3, 1, 0 , 4 , 3, 9};
maximum(len,array,0,prt);
return EXIT_SUCCESS;
}
void* maximum(int len, void* array, size_t size, int (*cmp)(const void*, const void*)) {
void* temp;
temp = array[0];
printf("%i",a);
int i;
for(i = 1; i < len; i++) {
if((*cmp)(temp,array[i]) == 0) {
temp = array[i];
}
}
return 0;
}
有很多错误......例如变量temp
或if((*cmp)(temp,array[i]) == 0)
。
您是否知道如何使用未定义的数据类型?
答案 0 :(得分:1)
您正在比较地址而不是值:
int compare(const void* a, const void* b) {
if(a < b)
return 0;
return 1;
}
应该是:
int compare(const void* a, const void* b) {
if(*(int *)a < *(int *)b)
return 0;
return 1;
}
答案 1 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
void *maximum(int len, void* array, size_t size, int (*cmp)(const void*, const void*));
//comparison function must know about type.
//Because it is not known for functions like memcmp that type what is the layout.
int intcmp(const int *x, const int *y){
return *x < *y ? -1 : *x > *y;
}
int main(void) {
int array[6] = {3, 1, 0 , 4 , 3, 9};
int *p = maximum(sizeof(array)/sizeof(*array), array, sizeof(*array), (int (*)(const void*,const void*))intcmp);
printf("%d\n", *p);//9
return EXIT_SUCCESS;
}
void *maximum(int len, void *array, size_t size, int (*cmp)(const void*, const void*)) {
int i;
void *temp = array;
for(i = 1; i < len; i++) {
if(cmp((char*)array + size*i, temp)>0) {
temp = (char*)array + size*i;
}
}
return temp;
}
答案 2 :(得分:0)
以下是一个可以作为基本代码的示例。
#include <stdio.h>
int cmp( const void *a, const void *b )
{
return *( const int * )a < *( const int * )b;
}
void * maximum( const void *array, size_t size, size_t len,
int cmp( const void *, const void *) )
{
const void *max = array;
size_t i = 1;
for ( ; i < size; i++ )
{
if ( cmp( ( const char * )max, ( const char * )array + i * len ) )
{
max = ( const char * )array + i * len;
}
}
return ( void * )max;
}
int main(void)
{
int array[] = { 3, 1, 0 , 4 , 3, 9 };
int *max =
maximum( array, sizeof( array )/ sizeof( *array ), sizeof( int ), cmp );
printf( "Maximum = %d\n", *max );
return 0;
}
输出
Maximum = 9