• ベストアンサー

bsearch関数

エラー 関数 `typespec' 内: 警告: 互換性のないポインタ型からの引数 5 個の `bsearch' を渡しますです int typespec(void) { static char *types[] = { "char", "int", "void" }; char *pt = token; if (bsearch(&pt, types, sizeof(types)/sizeof(char *), sizeof(char *), compare) == NULL) return NO; else return YES; } int compare(char **s, char **t) { return strcmp(*s, *t); } サイトや教科書を見たり読んだりして、標準ヘッダとも被らないように試みてみたのですが、余計エラーが増えてしまいます。「引数 5 個」ということは、全部アウトなんでしょうか? 過去の質問を見てみてもピンときません。暇な方がいるなら是非初心者にもわかりやすいアドバイスください。 (OSはLINUX。端末はGNOMEです)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

bsearchの最後の引数の型は int (*)(const void *, const void *) です。constがないと型が違うとなります。 参考: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/bsearch.3.html

p_hetare
質問者

補足

int typespec(void) { static char *types[] = { "char", "int", "void" }; char *pt = token; if (bsearch(&pt, types, sizeof(types)/sizeof(char *), sizeof(char *), compare) == NULL) return NO; else return YES; } static int compare(const void **s, const void **t) { return strcmp(*s, *t); } これでいいのでしょうか?参考のサイトをみてみましたが、エラーは同じでした。どこか自分が見落としてる所があるからかも知れませんが・・・。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

まず、#1の方の参考URLをみると、 #include <stdlib.h>となっています。 これが、指定されていることが前提です。 void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); のint (*compar)(const void *, const void *) の部分は、 compareという関数の引数が、 (const void *, const void *)で、戻り値がint型であることを要求しています。 つまり int compar(const void *, const void *)のような関数であれば 良いわけです。(実際の関数名はcomparなくてもよいです。何でも良いです) そうすると、あなたが最初にかかれた int compare(char **s, char **t) は、引数の型が合っていませんのでNGです。 そこで、引数を合わせるために、強引に int compare(const void *, const void *) とします。 型はこれで、良いのですが、実際にあなたが渡して欲しいのは、 char **s, char **tの型です。 それで、強引にキャストして char **s0 = (char**)s; char **t0 = (char**)t; のように設定し直します。 あとは、変数名がs0,t0になってしまったので、 return strcmp(*s0, *t0); とします。

p_hetare
質問者

お礼

解説ありがとうございます。 是非メモして、何回も見直したいと思います。 教科書・サイトなどに載っていない部分を解説してもらうのは、本当に助けられます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

日本語のメッセージはアホなので英語にすべきだと思うけどそれはさておき, 警告が出ている行はどこですか? compare のプロトタイプ宣言がないとかいうオチはありませんよね?

p_hetare
質問者

補足

今回はさすがにそういう事はありませんでした^^; No.2さんのアドバイスでコンパイルはいきました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

理由は#1のかたの言われるとおりです。 compareを以下のように修正して下さい。 int compare(const void *s, const void *t) { char **s0 = (char**)s; char **t0 = (char**)t; return strcmp(*s0, *t0); } たぶん、これでわかるかと思いますが、この理由がわからない場合は、 再度説明しますので、その旨補足して下さい。

p_hetare
質問者

補足

コンパイルは成功しました、でも理由がわかりません。 説明してくださるなら この機会に知っておきたいので是非お願いします。

関連するQ&A

専門家に質問してみよう