🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1094閲覧

c言語 引数での配列の使い方がわからない

ziryuu

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2019/12/03 09:04

編集2019/12/03 09:40

前提・実現したいこと

このサイトhttp://9cguide.appspot.com/15-q.html苦しんで覚えるc言語の練習問題15問題3-lの答えが違うみたいです。ソースは自分で修正してみたものなのですがそれでもエラーとなります。
引数で配列のアドレスを別関数に送るという意味では何も間違っていないと思うのですが何が間違っているのでしょうか。

発生している問題・エラーメッセージ

「15行目」で記述エラーを発見しました。 警告 配列の初期化が間違っています。 「15行目」で記述エラーを発見しました。 「23行目」で記述エラーを発見しました。 「maxmin」が再定義されています。以前と同じ名前を使っていないか、関数の記述順番は正しいかどうかを確認してください。 警告 配列の初期化が間違っています。

該当のソースコード

##include <stdio.h> void maxmin(int array[],int max,int min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0; } void maxmin(int *array,int *max,int *min) { int i = 0; *max = 0; *min = 100; while (array[i] != -1) { if (array[i] > max) max = array[i]; if (array[i] < min) min = array[i]; i++; } }

試したこと

引数の値についてが間違ってるんだと思ったので、変更しましたがエラーとなります。

補足情報(FW/ツールのバージョンなど)

EasyIDEC

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2019/12/03 09:10

> ちょっと自分で修正ができないので修正してしてもらいたいです そのページの管理者にお願いしてください。
guest

回答2

0

修正しました。修正個所は 「//修正」のコメントを入れてます。
先頭行が
「##include <stdio.h>」
はコぺミス(#が2つ)と思われるので、修正しましたが、コメントは入れていません。

C

1#include <stdio.h> 2 3void maxmin(int array[],int *max,int *min); //修正 4 5int main(void) 6{ 7 int i = 0,array[10],max,min; 8 9 do { 10 printf("%d 番目の数:",i + 1); 11 scanf("%d",&array[i]); 12 i++; 13 } while (array[i - 1] != -1); 14 15 maxmin(array,&max,&min); 16 17 printf("最大値 %d : 最小値 %d\n",max,min); 18 19 return 0; 20} 21 22void maxmin(int *array,int *max,int *min) 23{ 24 int i = 0; 25 26 *max = 0; 27 *min = 100; 28 29 while (array[i] != -1) { 30 if (array[i] > *max) *max = array[i]; //修正 31 if (array[i] < *min) *min = array[i]; //修正 32 i++; 33 } 34} 35

投稿2019/12/03 10:03

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

関数の定義では

void maxmin(int array[],int max,int min);

というように「整数型配列」「整数」「整数」の3つの引数が来ることを想定しています。

しかし、実際に渡しているものは

maxmin(array,&max,&min);

となっていて、「整数型配列」「整数のアドレス」「整数のアドレス」が渡されています。

おそらく関数側でmaxminの値を設定するのが理想だと思うので、
定義に合わせるか呼び出しに合わせるか考えて試してみてください。

もし外しても逆を試せばいいだけなのでとりあえずやってみると良いでしょう。


[質問文修正を受けて]

C言語では自作関数の宣言部(プロトタイプ宣言)と実装部があります。
どちらも「返り値の型」「関数名」「引数」を書く必要があり、同じように書く必要があります。

実装部の方だけでなく、プロトタイプ宣言の方も書き直しましょう。

投稿2019/12/03 09:22

編集2019/12/03 09:53
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ziryuu

2019/12/03 10:21

指摘通り 引数はアドレスなので、ポインタ型とし宣言部、実装部を統一しました。 返り値はvoidなので必要ないと思いreturn 0;を追加しました。 他、実装部のポインタ変数を通常変数モードにし使用できるようにしました。 しかしエラーとなります何が違うのでしょうか。 「29行目」で記述エラーを発見しました。 「pointer」を付け忘れています。 #include <stdio.h> void maxmin(int *array,int *max,int *min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0; } void maxmin(int *array,int *max,int *min) { int i = 0; *max = 0; *min = 100; while (*array[i] != -1) { if (*array[i] > *max) *max = *array[i]; if (*array[i] < *min) *min = *array[i]; i++; return 0; } }
ziryuu

2019/12/03 10:32

解決しました *array[i]という表現がそもそもおかしかったみたいです
ziryuu

2019/12/03 10:43

しかしこのプログラムreturn 0;があると思ったように動かないのですがなぜなんでしょう? 別の質問ができてしまいました。 ひとまず、この質問は解決しましたありがとうございました。
dice142

2019/12/03 10:48

仰っているように本質問から外れてしまいますので、とりあえず一言だけ。 関数と返り値、およびreturnについて復習しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問