2014-07-07 80 views
0

我試圖在C程序中使用通用方法來確定數組中最大的元素。指針算術和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)

你有一個想法如何使用未定義的數據類型?

+2

「這工作正常」 ... –

+0

'臨時=陣列[0];':'數組[0]'類型是'void' !! (GCC擴展名) – BLUEPIXY

+1

您的「比較」功能不好。即使它適用於您的測試用例也會被破壞。 – Joe

回答

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; 
} 
+0

OP明確聲稱,這部分代碼很好:-S如果我們甚至不能相信這樣的基本事實,這個世界到底是什麼?真正衡量一個男人的是什麼? –

+0

@KerrekSB:問題中的代碼很難在沒有警告的情況下編譯;將'1'作爲'void *'傳遞給你很可疑。原始「工作」代碼中的問題是軍團;我擔心可信度尚未建立,特別是在代碼被稱爲「工作」的時候存在重大缺陷時,對此表示懷疑是明智的。我注意到這個修訂並沒有完全解決這個問題。它將'1'解除引用,好像它是一個指針;它需要是一個'指向包含值'1''int'的int指針。 –

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; 
} 
+0

請注意,你正在使用memcpy(temp,...' –

+2

@ AlterMann肯定!!,修正它,謝謝。 – BLUEPIXY

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 
+0

在這個代碼中,'size'指的是'數組的長度)'和'len'是指'數組中一個元素的大小(長度)';這是否正確?這可能與英語爲母語的人在默認情況下使用的含義相反,它不會使代碼本身就是錯誤的,它只是意味着閱讀起來有點困難,因爲它的名字可能是反向名稱 –

+0

@Jonathan Leffler我使用了原始文章中的名字,你可以使用任何你喜歡的名字。 ) –

+0

這不是一個大問題,但原始代碼以我期望的方式使用它們('for(i = 1; i