- ベストアンサー
C言語の質問です!
#include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <conio.h> using namespace std; double arrayMin(double array[][], int n){ double Min=9999999999999999999999.999999; for(int N=0;N<n;N++){ if(array[N][0]!=NULL&&array[N][0]<Min){ Min=array[N][0]; } } return Min; } double arrayMax(double array[][], int n){ double Max=-9999999999999999999999.999999; for(int N=0;N<n;N++){ if(array[N][0]!=NULL&&array[N][0]<Max){ Max=array[N][0]; } } return Max; } int main(){ double data[3][10] = {{2.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}, {1.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}, {3.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}}; double min, max; min=arrayMin(data, 3); max=arrayMax(data, 3); printf("min = %lf, max = %lf\n", min, max); return 0; } 二次元配列の1行目の配列の最大値と最小値を求めることを考え,上のようなプログラムを書いたのですが, 1>.\maxmin.cpp(12) : error C2087: 'array' : 添字がありません。 1>.\maxmin.cpp(21) : error C2087: 'array' : 添字がありません。 1>.\maxmin.cpp(34) : error C2059: 構文エラー : ']' 1>.\maxmin.cpp(35) : error C2664: 'arrayMax' : 1 番目の引数を 'double [3][10]' から 'double [][1]' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 というようなエラーが出てしまいます. 途中のarray[N][0]!=NULLは二次元配列dataが3行より少ない場合に対応させています. どなたかアドバイスをいただけますでしょうか? よろしくお願いいたします!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
タイトルは、内容がわかるように。 C か、C++ かはっきりすること。 C ならこんな感じ。 #include <stdio.h> double arrayMin(double array[][10], int n) { double Min = array[0][0]; int N; for(N = 1; N < n; N ++){ if(array[N][0] < Min){ Min = array[N][0]; } } return Min; } double arrayMax(double array[][10], int n) { double Max = array[0][0]; int N; for(N = 1; N < n; N ++){ if(array[N][0] > Max){ Max = array[N][0]; } } return Max; } int main(void) { double data[3][10] = {{2.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}, {1.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}, {3.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}}; double min, max; min = arrayMin(data, 3); max = arrayMax(data, 3); printf("min = %lf, max = %lf\n", min, max); return 0; }
その他の回答 (3)
- pyonmae
- ベストアンサー率64% (40/62)
このプログラムは、二次元配列の動きをテストするために試験的に作ったものでしょうか。 関数への引数に二次元以上の配列を渡す場合、関数としてはその配列の大きさがわからないので、それで怒っているのです。 例えば、9列5行の以下のような二次元配列を考えてみます。 int array[5][c]; /* 型はなんでもよい。cは定数 */ 0123456………c 0□□□□□□□□□ 1□□□□□□□□□ 2□□□■□□□□□ 3□□□□□□□□□ 4□□□□□□□□□ この場合、■(array[2][3])の部分のアドレスを算出するには、 2×c+3 という計算が行われ、これにcの値が必要になります。 話を戻しまして、関数に配列のポインタを渡す時、配列先頭(上の場合はarray[0][0])のアドレスだけが渡り、配列の大きさは関数には知らされません。(質問者様もarray[N][0]!=NULLでチェックを行っているくらいですから、既にご存知かも知れませんが) ですので、配列の計算が不能となり、ご質問のエラーメッセージにつながるわけです。 これを解決するには、関数の宣言時に double arrayMin(double array[3][10], int n) などと配列の大きさを指定してやるとか、配列の大きさを引数で渡して関数内で自分で再計算するとかいった方法が考えられます。(どちらもあまりスマートではありませんが) 蛇足ですが、array[N][0]でのチェックについてですが、これは double data[1][10] = {・・・ などと宣言されたりした時の対策でしょうか。 だとすると、配列の領域外へのアクセスは危険ですし、そもそもそこがNULLである保障もありませんので、別の方法を検討される事をお勧めいたします。 そうでなく、配列の大きさは変わらず、中のデータが書き換わるというのであれば、問題ありません。(私なら'NULL'は使いませんが)
お礼
ご回答どうもありがとうございます! 配列とポインタの内容の理解が不十分でした,しっかり理解するようにしたいです,ありがとうございました(><)
- sonata1229
- ベストアンサー率36% (76/206)
C言語にusing namespace なんて必要ないかと思いますが^^; 最小限のIncludeでいいんじゃないでしょうかね。 あと >二次元配列の1行目の配列の最大値と最小値を求める これは、二次元配列の1列目最大値最小値をもとめるということでいいのかな??(プログラム見る限りそんな感じですが…) 最小値・最大値を求める関数を呼び出している部分ですが、 必要な数値のみを配列に取り出して、渡してあげたらいいんじゃないでしょうか? 3x10の二次元配列をそのまま渡しても、データの無駄に思えます。 {2.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0} {1.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0} {3.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0} 上記の二次元配列だと、最大値と最小値を判断するのは、 2.0、1.0、3.0 の3つだけですよね?? それなら、この3つを配列に格納して、その配列を関数に渡せばいいようにしたらだめなの?
お礼
ご回答どうもありがとうございます! 二次元配列は600*50程度の大きさの値を読み込んで処理することを考えています! 二次元配列の1列目最大値最小値をもとめる流れです,なんとかうまく動かせました,ありがとうございます(><)
- Tasuke22
- ベストアンサー率33% (1799/5383)
arrayって名前が拙いんじゃないの? 大きなお世話かもしれませんが、行と列が間違って ますよ。Fortranの世界みたい。
お礼
二次元配列の1行目の配列の最大値と最小値を求めることを考え,上のようなプログラムを書いたのですが, という部分の1行目は1列目ですね! ご指摘ありがとうございます!
お礼
ご回答どうもありがとうございます! double arrayMin(double array[][], int n){ を double arrayMin(double array[][10], int n) にして if(array[N][0]!=NULL&&array[N][0]<Max){ の不等号を直したらうまく動かせました,ありがとうございます(><)