こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列を使った入力

配列を使った入力

下記プログラムで
sample9.4.cpp: function 内の `int main()':
sample9.4.cpp:18: no match for `std::istream& << int&' operator
というエラーがでてしまいます。

たぶん
test[b][a] = c;
という部分が悪いと思うのですが、
なぜ悪いのか分かりません。
配列の使い方が間違っているのでしょうか。
どなたか教えて頂けると嬉しいです。

ーー

#include <iostream>
using namespace std;

int main()
{
int a,b,c,sub,num;

cout << "Please input the number of subjects\n";
cin >> sub;
cout << "Please input the number of people\n";
cin >> num;

int test[b][a];

for(int b=0; b<sub; b++){
for(int a=0; a<num; a++){
cout << "Please input the point of the " << a+1 << "th people of the " << b+1 << "th subject\n";
cin << c;
test[b][a] = c;
}
}

for(b=0; b<sub; b++){
for(int a=0; a<num; a++){
cout << "The point of the " << a+1 << "th people of the " << b+1 << "th subject is " << test[a][b] << '\n';
}
}

return 0;
}

投稿日時 - 2010-09-07 08:31:57

QNo.6164527

暇なときに回答ください

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

C++では
> int test[b][a];
のように、添字に変数を使っての配列宣言はできません。
あと、配列の大きさが入っている変数は、sub、 numですよね?

動的に配列を確保するには、new演算子を使用します。
2次元配列の場合、1度に
int **test=new int[sub][num] ;
とすることはできず、第1の添字用の領域を
int **test=new int*[sub] ;
で確保して、
for( b=0;b<sub;++b) { test[b]= new int[num] ; }
と各test[b]に対して確保します。
使い終わったら、delete[]で解放します。その際は、確保とは逆の順番で行います。
for( b=0;b<sub;++b) { detele[] int[num] ; }
delete[] test

あるいは、std::vector等、配列に相当するクラスを使用します。


ちなみに、そのエラーはここではなく、
> cin << c;
でcinに対して << を使っているためのものです。
std::istream型への参照 << int型への参照
という演算に該当するものが無い、とちゃんとエラーメッセージに書いてあります。

投稿日時 - 2010-09-07 09:02:14

お礼

親切にご回答頂き、誠にありがとうございます。

下記質問者の方の回答のお礼にあるように、無事動きました。
new演算子というものを使わなくても動いたのですが、
新しい知恵を授けていただきありがとうございます。

投稿日時 - 2010-09-07 09:16:08

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>test[b][a] = c; という部分が悪いと思うのですが

一つ上の行(Line:17)の 「<<」 の向きが逆では?


あと、2次元配列のtestの宣言について。(Line:13)
a,bを使っていますが、それ以前に、a,bが初期化されていませんよ。
要素数が不確定だから動かないと思う。

投稿日時 - 2010-09-07 08:51:30

お礼

ご回答頂き、誠にありがとうございます。

おっしゃるとおり、<< の向きが逆でした。
また、testの宣言でa,bでなくsubとnumを使ったら無事うまく動きました。

投稿日時 - 2010-09-07 09:14:10