2

それで、文字列の配列(名前入力)があり、その配列をソートしたいと思います。私はこのようなものを使用します

int stringLen = sizeof(input)/sizeof(char *);
qsort(input, stringLen, sizeof(char *), myCompare);

ただし、次の紛らわしいエラーが発生します。

error: invalid conversion from 'int (*)(const char*, const char*)' to '__compar_fn_t {aka int (*)(const void*, const void*)}' [-fpermissive]

srot13u.c:5:0 からインクルードされたファイル: /usr/include/stdlib.h:761:13: エラー: 'void qsort(void*, size_t, size_t, __compar_fn_t)' の引数 4 を初期化しています [-fpermissive]

4

3 に答える 3

2

myCompare 関数には署名があります。

int myCompare(const char*, const char*)

しかし

int myCompare(const void*, const void*)

期待されています。

使うだけ

int myCompare(const void *a_, const void *b_) {
    const char *a = a_;
    const char *b = b_;
    ...
}
于 2013-02-21T00:51:41.793 に答える
1

char2 つのポインターを受け取る関数を渡していますが、ポインターを受け取る関数がqsort必要voidです。これら 2 つの関数ポインター型は、C では互換性がありません。

比較ルーチンを変更します。一般的なセットアップは次のようなものです

static int strcmp_void(const void *a, const void *b)
{
    return strcmp(a, b);  // the types *are* compatible in this expression
}
于 2013-02-21T00:51:54.413 に答える
1

myCompare次のように変更します。

int myCompare(const void* pa, const void* pb) {
   const char *a = (const char*)pa;
   const char *b = (const char*)pb;

   /* ... */
}
于 2013-02-21T00:52:05.317 に答える