単二電池

エラー
関数 `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です)

A 回答 (4件)

bsearchの最後の引数の型は



int (*)(const void *, const void *)

です。constがないと型が違うとなります。

参考:
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

この回答への補足

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);
}

これでいいのでしょうか?参考のサイトをみてみましたが、エラーは同じでした。どこか自分が見落としてる所があるからかも知れませんが・・・。

補足日時:2009/02/19 16:49
    • good
    • 0

まず、#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);
とします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/19 18:12

日本語のメッセージはアホなので英語にすべきだと思うけどそれはさておき, 警告が出ている行はどこですか? compare のプロトタ

イプ宣言がないとかいうオチはありませんよね?

この回答への補足

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

補足日時:2009/02/19 17:24
    • good
    • 0

理由は#1のかたの言われるとおりです。


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

この回答への補足

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

補足日時:2009/02/19 17:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!