第15講 フリーストア配列
第2話 フリーストア配列を関数に送る
前話解答例
#include<iostream>
using namespace std;
void f(int* a);
void g(int* a);
void main(){
int* a=new int[10];
f(a);
g(a);
cout<<endl;
cout<<"プロジェクト終了"<<endl;
delete[] a;
}
void f(int* a){
int i,j;
for(i=0;i<10;i++){
a[i]=i+1;
}
}
void g(int* a){
int i,j;
for(i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
ダウンロード用添付ファイル
ここで注目して頂きたいのは、ベクタのときは
#include<iostream>
#include<vector>
using namespace std;
void f(vector<int> a);
void g(vector<int> a);
void main(){
vector<int> a(10);
f(a);
g(a);
cout<<endl;
cout<<"プロジェクト終了"<<endl;
}
void f(vector<int> a){
int i,j;
for(i=0;i<10;i++){
a[i]=i+1;
}
}
void g(vector<int> a){
int i,j;
for(i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
としたのでは、実行結果はとなってしまいました。
ベクタの場合は、正しい結果を得るには、
#include<iostream>
#include<vector>
using namespace std;
vector<int> f(vector<int> a);
void g(vector<int> a);
void main(){
vector<int> a(10);
a=f(a);
g(a);
cout<<endl;
cout<<"プロジェクト終了"<<endl;
}
vector<int> f(vector<int> a){
int i,j;
for(i=0;i<10;i++){
a[i]=i+1;
}
return(a);
}
void g(vector<int> a){
int i,j;
for(i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
としなければなりませんでした。つまり、関数fは最初のアドレスを返さなければならなかったのです。
それに対して、フリーストア配列の場合は、アドレスを返さないvoid型でもよいということです。
でもよいと書きましたのは、ベクタと同じようにアドレスを返すタイプにしてもよいからです。つまり、
#include<iostream>
using namespace std;
int* f(int* a);
void g(int* a);
void main(){
int* a=new int[10];
f(a);
g(a);
cout<<endl;
cout<<"プロジェクト終了"<<endl;
delete[] a;
}
int* f(int* a){
int i,j;
for(i=0;i<10;i++){
a[i]=i+1;
}
return(a);
}
void g(int* a){
int i,j;
for(i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
ダウンロード用添付ファイル
でも成功するということです。したがって、フリーストア配列の場合は、
#include<iostream>
using namespace std;
void f(int* a);
void g(int* a);
void main(){
int* a=new int[10];
f(a);
g(a);
cout<<endl;
cout<<"プロジェクト終了"<<endl;
delete[] a;
}
void f(int* a){
int i,j;
for(i=0;i<10;i++){
a[i]=i+1;
}
}
void g(int* a){
int i,j;
for(i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
と
#include<iostream>
using namespace std;
int* f(int* a);
void g(int* a);
void main(){
int* a=new int[10];
f(a);
g(a);
cout<<endl;
cout<<"プロジェクト終了"<<endl;
delete[] a;
}
int* f(int* a){
int i,j;
for(i=0;i<10;i++){
a[i]=i+1;
}
return(a);
}
void g(int* a){
int i,j;
for(i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
のどちらでもよいのです。
次に2次元のフリーストア配列について考えてみましょう。
2次元にするには、
int** a=new int*[整数];
for(int i=0;i<整数;i++)a[i]=new int[整数];
のようにして宣言とサイズ(要素数=0を含めた添え字数)を行います。
新規プロジェクトを作り、フォームは前と同じにしてコーティングを次のようにしてみましょう。
#include<iostream>
using namespace std;
void main(){
int** a=new int*[10];
int i,j;
for(i=0;i<10;i++)a[i]=new int[12];
for(i=0;i<10;i++){
for(j=0;j<12;j++){
a[i][j]=12*i+j+1;
}
}
for(i=0;i<10;i++){
for(j=0;j<12;j++){
if(a[i][j]<10)cout<<"00"<<a[i][j]<<"
";
if(a[i][j]>=10 && a[i][j]<100)cout<<"0"<<a[i][j]<<"
";
if(a[i][j]>=100)cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"プロジェクト終了"<<endl;
delete[] a;
}
ダウンロード用添付ファイル
すると、実行結果はとなります。
さて、皆さん再び問題です。
前と同じようにデータ作成部分とデータ表示部分を独立させ関数に変更してください。
第1話へ 第3話へ
eclipse c++ 入門講義第1部へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ