![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
エラー
関数 `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/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);
}
これでいいのでしょうか?参考のサイトをみてみましたが、エラーは同じでした。どこか自分が見落としてる所があるからかも知れませんが・・・。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
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);
とします。
解説ありがとうございます。
是非メモして、何回も見直したいと思います。
教科書・サイトなどに載っていない部分を解説してもらうのは、本当に助けられます。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.2
- 回答日時:
理由は#1のかたの言われるとおりです。
compareを以下のように修正して下さい。
int compare(const void *s, const void *t)
{
char **s0 = (char**)s;
char **t0 = (char**)t;
return strcmp(*s0, *t0);
}
たぶん、これでわかるかと思いますが、この理由がわからない場合は、
再度説明しますので、その旨補足して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++にてtemplateで受け取った任...
-
ウインドウの移動禁止
-
Win10のVS2022のForm AppからC...
-
GDI+の使用方法について
-
ドラッグしたときにマウスカー...
-
(void)0 はどんな意味ですか
-
【gcc・cygwin】multiple defin...
-
void*型の配列について
-
多重定義が起きている?--lnk20...
-
メッセージマップ(ON_CONTROL_...
-
自作DirectShow Filterのinter...
-
c言語 引数のvoidについて
-
bsearch関数
-
戻り値を返す関数の前に(void)...
-
【VC++2005】ソースの書き方:...
-
既定のコンストラクタがありま...
-
__threadを使うコードで、分割...
-
PIC16F819
-
AtCoderABC135の問題Cについて
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
void*型の配列について
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
VC++でGetKeyboardStateがうま...
-
クラス間でのクラスの共有?
-
gcc: incompatible pointer type
-
typedef unsigned int UINT;が...
-
コールバックって・・・
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
ウインドウの移動禁止
-
Notepad++の関数リスト表示の変...
おすすめ情報