• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の課題について)

C言語の会員名簿処理問題の課題について

このQ&Aのポイント
  • C言語の会員名簿処理問題の課題をしています。
  • プログラミングを組んでいますが、コンパイルに失敗してしまいます。
  • 修正点を教えていただけませんか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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の戻り値の型を考えれば、どこが間違いかわかるのでは。

3731015
質問者

お礼

詳しい説明ありがとうございました。 成功しました!!

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

>char p; >p = my_search(x); >char * my_search(int a) pの型が本当にcharでいいのか? という点に尽きます。

3731015
質問者

お礼

ありがとうございました。 pの型も間違えていましたね。 参考になりました。

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

以下のようにしてください。 ------------------- ・ ・ struct Mystruct{ int number; char name[MAX]; }; char * my_search(int a);    ・・・ここにこの行を追加 ・ ・ ・ int main() { int x; char *p; ・・・この行を修正。(pを *pに修正) -----------------------------------------------

3731015
質問者

お礼

わかりやすい回答ありがとうございました。 無事成功しました。

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

関数は使う前に宣言すべし.

3731015
質問者

お礼

そうですね。 C言語の大原則を忘れていました。 ありがとうございました。

関連するQ&A