
C言語の会員名簿処理問題の課題をしています。
次の条件でC言語で会員番号を入力するとその会員番号を持つ会員名を表示する
プログラミングを組んでいますが、コンパイルに失敗してしまいます。
何度も見直して修正を施してみたのですが、うまくいきません。
是非お力添えをお願いします。
<条件>
(1)会員番号と会員名は構造型でグローバル変数として宣言する。
(2)データ件数は10件とする。
(3)サブ関数で線形探索するプログラムを組み(my_search関数とする)、メイン関数で呼び出す。
(4)my_search関数の型はchar*とする。
(5)探索に成功したらmy_search関数の戻り値は該当会員の氏名とする。
(6)探索に失敗したらmy_search関数の戻り値はNULLとする。
(7)main関数では,関数my_searchの戻り値がNULLなら該当データがないことを
伝えるメッセージを出力して終了させる.
そうでなければ,該当の氏名を出力して終了させる.
下に組んだプログラムとコンパイル結果を貼り付けます。
/*
z:\情報システム論_2013>cl js010703_a106906.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
js010703_a106906.c
js010703_a106906.c(48) : warning C4047: '==' : 間接参照のレベルが 'int' と 'void
*' で異なっています。
js010703_a106906.c(58) : error C2040: 'my_search' : 'char *(int)' は 'int ()' と
間接操作のレベルが異なります。
z:\情報システム論_2013>
*/
#include <stdio.h>
#defineN10
#defineMAX20
struct Mystruct{
intnumber;
charname[MAX];
};
struct Mystruct meibo[N] = {
{10, "asaoka"},
{20, "ito"},
{23, "kawano"},
{25, "shimizu"},
{31, "setoguchi"},
{34, "tomiyama"},
{37, "murakami"},
{38, "yasuda"},
{46, "yoshino"},
{49, "yoshikawa"}
};
int main()
{
intx;
charp;
printf("会員番号を入力してください。\n");
printf("会員番号:");
scanf("%d", &x);
printf("入力された会員番号の会員は");
p = my_search(x);
if(p==NULL){
printf("存在しません。");
}else{
printf("%s", p);
}
return0;
}
char * my_search(int a)
{
intj = 0;
while(j<N){
if(a==meibo[j].number){
returnmeibo[j].name;
break;
}else{
++j;
}
returnNULL;
}
}
どうしても、この2つのエラーが消えません。
修正点を詳しく教えていただけないでしょうか。
よろしくお願いします。
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の戻り値の型を考えれば、どこが間違いかわかるのでは。
No.3
- 回答日時:
>char p;
>p = my_search(x);
>char * my_search(int a)
pの型が本当にcharでいいのか?
という点に尽きます。

No.2
- 回答日時:
以下のようにしてください。
-------------------
・
・
struct Mystruct{
int number;
char name[MAX];
};
char * my_search(int a); ・・・ここにこの行を追加
・
・
・
int main()
{
int x;
char *p; ・・・この行を修正。(pを *pに修正)
-----------------------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
newで生成したものをdelete[]で...
-
2重定義って??
-
void func( void )について
-
main.c:7:43: warning: implici...
-
呼び出し時のパラメータが足りない
-
C言語のコンパイルエラー
-
プログラムの中で別のmainを呼...
-
C++のfor文について
-
引数で argc argvが使用され...
-
TCP/IPでのgetsockname()の使い...
-
エラー「invalid conversion fr...
-
namespace定義の使い方
-
C言語の<ctype.h>のisspace()に...
-
VB 関数
-
long型の定数の末尾にLを付ける...
-
main()とint main(void)の違い
-
OpenGLで登録したコールバック...
-
typedef enumの使い方を教えて...
-
外部シンボル未解決
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報