1

15.3列で、著者は入力ドキュメントからランダムにテキストを生成する方法を紹介しました。著者はまた、ソースコードを提供しました。

qsort(word, nword, sizeof(word[0]), sortcmp);
int sortcmp(char **p, char **q)
{   return wordncmp(*p, *q);
}

私はソースコードの上記の行に混乱しています。qsortの最後の引数は次のとおりです。

int comparator ( const void * elem1, const void * elem2 ).

ただし、sortcmpの定義は異なります。実際、私のVS2010ではソースコードをコンパイルできません。

4

1 に答える 1

1

このコードは元々、より寛容な(または標準に準拠していない)コンパイラでコンパイルされたようです。void *コンパレータ関数の正規の引数は、長さまでの辞書式比較の実装であるが適用できるようにchar **解釈されるという考えのようです。wordncmp()n

関数を期待どおりに宣言し(つまり、2つのconst void *引数を取る)、型キャストを明示的にすると、問題が解決するように見えます(GCC 4.7.0でテスト済み)。

int sortcmp(const void *p, const void *q) {
  return wordncmp(*(const char **)p, *(const char **)q);
}

wordncmp()また、関数の宣言を変更する必要がありました。

int wordncmp(const char *p, const char* q)
{
  /*.. Definition unchanged.. */
}
于 2012-08-19T09:45:20.200 に答える