指针运算和"泛型"在c

时间:2014-07-07 23:26:52

标签: c pointers math compare

我试图在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;
}

有很多错误......例如变量tempif((*cmp)(temp,array[i]) == 0)

您是否知道如何使用未定义的数据类型?

3 个答案:

答案 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