- ベストアンサー
C言語の会員名簿処理問題の課題について
- C言語の会員名簿処理問題の課題をしています。
- プログラミングを組んでいますが、コンパイルに失敗してしまいます。
- 修正点を教えていただけませんか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
C言語の大原則は「使う前に宣言/定義」です。 他の言語だと、この順番でも問題無い場合がありますが、C言語の場合は > p = my_search(x); ここで使うものを、この後で > char * my_search(int a) と宣言/定義してはいけません。 この場合、 int my_search() (引数任意、戻り値intの関数my_search) が宣言されているとして、コンパイルが進みます。 その結果、実際の char * my_search(int a) とは引数や戻り値違う、ということになり、エラーになります。 それが 「js010703_a106906.c(58) : error C2040: 'my_search' : 'char *(int)' は 'int ()' と間接操作のレベルが異なります。」 のメッセージの意味です。 明示的に宣言しようとしている 'char *(int)' と 暗黙に宣言された 'int ()' が違う、と言っているのです。 修正方法は2とおり。 ・定義自体を使う前(この場合、main関数の前)に記述する。 ・使う前のプロトタイプ宣言で引数と戻り値を明示しておく。 プロトタイプ宣言については、参考書等で調べてください。 「おまじない」と言われる #include <stdio.h> の役割りの一つが、「プロトタイプ宣言を他のファイルから読みこんで、定義済みの関数を正しく使えるようにする」というものです。 > js010703_a106906.c(48) : warning C4047: '==' : 間接参照のレベルが 'int' と 'void*' で異なっています。 こちらは正確には「警告(warning)」です。 「間違い」ではありません。コンパイルも終了します。 内容を理解し、問題無い場合は無視してもかまいません。 ただし、警告が出る箇所は、問題がある場所がほとんどです。警告を出さないプログラムを目指しましょう。 この場合も == の左右で型が違う、と言っています。 p と NULL です。 char 型は、演算するとき intに自動で変換されます。そのため、 片方が int になっています。 NULLはポインタです。汎用のポインタとして void*型になっていることがあります。 整数とポインタは通常比較したりしません。 よって「間違い」の可能性が高いです。 その前を見ると p = my_search(x); です。今は警告は出ませんが、上の関数宣言を修正すると、こんどはここで警告になるはずです。 p と my_searchの戻り値の型を考えれば、どこが間違いかわかるのでは。
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6290)
>char p; >p = my_search(x); >char * my_search(int a) pの型が本当にcharでいいのか? という点に尽きます。
お礼
ありがとうございました。 pの型も間違えていましたね。 参考になりました。
- tatsu99
- ベストアンサー率52% (391/751)
以下のようにしてください。 ------------------- ・ ・ struct Mystruct{ int number; char name[MAX]; }; char * my_search(int a); ・・・ここにこの行を追加 ・ ・ ・ int main() { int x; char *p; ・・・この行を修正。(pを *pに修正) -----------------------------------------------
お礼
わかりやすい回答ありがとうございました。 無事成功しました。
- Tacosan
- ベストアンサー率23% (3656/15482)
関数は使う前に宣言すべし.
お礼
そうですね。 C言語の大原則を忘れていました。 ありがとうございました。
お礼
詳しい説明ありがとうございました。 成功しました!!