1

Cで一般的な比較関数を使用する簡単な例を試してみましたが、初期化すると、初期化時に型に互換性がないという警告メッセージが表示されます。ここで基本的な何かが欠けているように感じます...

#include <stdio.h>
#include <string.h>

int
compare(int (*comp)(void *first, void *second), void *arr, int size)
{
    int i, j, dups=0, arrsize=sizeof(arr)/size;
    for(i=0; i<arrsize; i++)
    {
        for(j=0; j<arrsize; j++)
        {
            if(j!=i)
                dups+=(*comp)(&arr[i], &arr[j]);
        }  
    }
     return dups;
}

int
compareints(int *first, int *second)
{
    if(*first==*second)
        return 1;
    return 0;
}

int main(int argc, const char * argv[])
{
    int (*comp)(void *, void *)=&compareints; //Here is where I get the warning...
    int arr[10]={22, 39, 78, 22, 99, 12, 82, 10, 11, 28};
    printf("The arr has dups: %d\n", compare(comp, arr, sizeof(int)));
    return 0;
}

編集: プログラムが正しく機能しておらず、配列の処理に関係していました。prog を機能させるための変更は以下のとおりです。

int
compare(int (*comp)(void *first, void *second), void **arr, int size)
    ....
    ....
    ....
    dups+=(*comp)(arr[i], arr[j]);

int 
compareints(....)
    if((*((int *)first))==(*((int *)second)))
       return 1;


int 
main(int argc, const char * argv[])
{
     int (*comp)(void *, void *)=&compareints;
     int arr[10]={22, 39, 78, 22, 99, 12, 82, 10, 11, 28};
     void **arr2=malloc(sizeof(int *)*10);
     for(int i=0; i<10; i++)
     {
         arr2[i]=&arr[i];
     }
     printf("The arr has dups: %d\n", compare(comp, arr2, 10));
     return 0;
}
4

2 に答える 2

4

残念ながら、それらが関数シグネチャの一部である場合、これをvoid *混在させることはできません。に変換できてint *も、に変換できません。署名は正確に一致する必要があります。int *void *int (*)(int *, int *)int (*)(void *, void *)

int
compareints(void *first, void *second)
{
    if (*((int *) first) == *((int *) second))
        return 1;
    return 0;
}
于 2012-11-29T01:09:05.797 に答える