第8講 関数の学習
第6話 関数の総合演習その1
第6話と第7話では、
次のようなForm1を作り、いろいろな演習を行ってみましょう。
T 配列を関数に送る。
コーティング例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a[5],i;
//データ発生
for(i=0;i<5;i++)a[i]=i+1;
//ポインタ変数の宣言と初期化
int* b=a;
//関数の呼び出し
f(b);
}
void f(int* a){
//関数の独立性のため、宣言が必要
int i;
//文字型変数の宣言と初期化
String^ w=L"";
//データ表示
for(i=0;i<5;i++)w=w+(a[i]).ToString()+L" ";
label1->Text=w;
}
};
}
解説
配列を関数f()に送ったように見えますが、実際に送っているのは、
配列のアドレスを収納したポインタ変数bである。
ただ、ポインタは配列と同じように扱えるので、あたかも配列を送ったかのようになっている。
尚、前にも説明したとおり、
f(b)の引数とvoid f(int* a)のポインタ変数aは、異なっていてもよい。もしわかりやすさを優先するなら、
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a[5],i;
//データ発生
for(i=0;i<5;i++)a[i]=i+1;
//ポインタ変数の宣言と初期化
int* b=a;
//関数の呼び出し
f(b);
}
void f(int* b){
//関数の独立性のため、宣言が必要
int i;
//文字型変数の宣言と初期化
String^ w=L"";
//データ表示
for(i=0;i<5;i++)w=w+(b[i]).ToString()+L" ";
label1->Text=w;
}
};
}
となります。ですから、
void f(int* a){
//関数の独立性のため、宣言が必要
int i;
//文字型変数の宣言と初期化
String^ w=L"";
//データ表示
for(i=0;i<5;i++)w=w+(a[i]).ToString()+L" ";
label1->Text=w;
}
であたかもSystem::Void button1_Clickの配列a[i]を直接扱っているかのように見えますが、
ポインタbから参照して使っているに過ぎません。
ただ、ポインタから参照しているにすぎないといいましても、次のコーティングの場合の実行結果を見ればおわかりになりますように、
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a[5],i;
//データ発生
for(i=0;i<5;i++)a[i]=i+1;
//ポインタ変数の宣言と初期化
int* b=a;
//関数の呼び出し
f(b);
//文字型変数の宣言
String^ w;
//データ表示
for(i=0;i<5;i++)w=w+(a[i]).ToString()+L" ";
label1->Text=w;
}
void f(int* b){
//関数の独立性のため、宣言が必要
int i;
//データ変換
for(i=0;i<5;i++)b[i]=b[i]+3;
}
};
}
実行結果
参照して、その中身も変更することができます。
U 2次元配列を関数に渡す。
今度は、コーティングを次のように変更しましょう。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//ポインタのポインタの宣言
int** a;
//ポインタのポインタの初期化
a=(int** )malloc(100);
//ポインタの初期化
int i;
for(i=0;i<5;i++)a[i]=(int* )malloc(20);
//文字型変数の宣言と初期化
String^ w=L"";
//関数に2次元配列(ポインタのポインタ)を送る。
w=f(a);
//データ表示
label1->Text=w;
}
String^ f(int** a){
//変数の宣言
int i,j;
//文字型変数の宣言と初期化
String^ w=L"";
//データの発生
for(i=0;i<5;i++){
for(j=0;j<5;j++){
a[i][j]=5*i+j+1;
}
}
//データを文字型変数に収納する。
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L"
";
if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
}
w=w+"\n";
}
//文字型変数を返す。
return w;
}
};
}
実行結果
V 3次元配列を関数に送る。
今度は3次元ですので、Form1を広げておきましょう。
実行結果
実行結果の通りになるようにUの場合のコーティングを参考に考えてみてください。
W 4次元配列を関数に送る
V同様に考えてみてください。
ただし、今回はかなり縦長になり、画面に入り切りませんので、
AoutScrollのをクリックして
Trueに変更してください。
すると、入りきらない場合
スクロールできるようになります。
第5話へ 第7話へ