第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]<<" ";
   }
}
としたのでは、実行結果はaとなってしまいました。
ベクタの場合は、正しい結果を得るには、
#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;
}

ダウンロード用添付ファイル
すると、実行結果はbとなります。
さて、皆さん再び問題です。
前と同じようにデータ作成部分データ表示部分を独立させ関数に変更してください。




第1話へ
 第3話へ



a

eclipse c++ 入門講義第1部へ

魔方陣 数独で学ぶ V
BA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ