第13講 ベクタの学習
第4話 ベクタを関数に渡す(その2)

第9話のプログラム
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           int a[3];
           int* b=(int* )malloc(3*sizeof(int));
           vector<int> c(3);
           f1(a);
           f2(b);
           f3(&c[0]);
           g1(a);
           g2(b);
           g3(&c[0]);
        }
        void f1(int* x){
          int i;
          for(i=0;i<3;i++){
            x[i]=i+1;
          }
        }
        void f2(int* y){
          int i;
          for(i=0;i<3;i++){
            y[i]=i+4;
          }
        }
        void f3(int* z){
          int i;
          for(i=0;i<3;i++){
            z[i]=i+7;
          }
        } 
        void g1(int* x){
          int i;
          String^ w;
          for(i=0;i<3;i++){
            w+=x[i].ToString()+L" ";
          }
          label1->Text=w;
        }
        void g2(int* y){
        int i;
        String^ w;
        for(i=0;i<3;i++){
          w+=y[i].ToString()+L" ";
        }
        label2->Text=w;
      }
      void g3(int* z){
        int i;
        String^ w;
        for(i=0;i<3;i++){
          w+=z[i].ToString()+L" ";
        }
        label3->Text=w;
      }
は、
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           int a[3];
           int* b=(int* )malloc(3*sizeof(int));
           vector<int> c(3);
           vector<int>::iterator j;
           j=c.begin();

           f1(a);
           f2(b);
           f3(j);
           g1(a);
           g2(b);
           g3(j);
        }
        void f1(int* x){
          int i;
          for(i=0;i<3;i++){
            x[i]=i+1;
          }
        }
        void f2(int* y){
          int i;
          for(i=0;i<3;i++){
            y[i]=i+4;
          }
        }
        void f3(vector<int>::iterator j){
          int i;
          for(i=0;i<3;i++){
            *(j+i)=i+7;
          }
        } 
        void g1(int* x){
          int i;
          String^ w;
          for(i=0;i<3;i++){
            w+=x[i].ToString()+L" ";
          }
          label1->Text=w;
        }
        void g2(int* y){
        int i;
        String^ w;
        for(i=0;i<3;i++){
          w+=y[i].ToString()+L" ";
        }
        label2->Text=w;
      }
      void g3(vector<int>::iterator j){
        int i;
        String^ w;
        for(i=0;i<3;i++){
          w+=(*(j+i)).ToString()+L" ";
        }
        label3->Text=w;
      }
と変更しても結果は同じであることは、皆さんお分かりでしょう。
           vector<int>::iterator j;
           j=c.begin();

は、反復子jの宣言とベクタcの最初のアドレスの代入です。
f3(j);のjとvoid f3(vector<int>::iterator j)のjを同じにしていますが、
        void f3(vector<int>::iterator k){
          int i;
          for(i=0;i<3;i++){
            *(k+i)=i+7;
          }
        } 
としても何も問題ないことは、関数を勉強された皆さんはお分かりでしょう。
もし、ここに?が浮かぶ方は、第10講の関数の学習をもう一度お復習いしてください。

では、皆さん問題を出します。
j=c.begin();でベクタcの最初のアドレスを取得してから、
関数f1と関数g1にとんでいました。
もし、関数f1から戻ってきた後、
最終アドレスの次のアドレスを取得するj=c.end();
を使用した場合、表示させる関数g1のコードはどのように書き換えたらよいでしょうか。
つまり、
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           int a[3];
           int* b=(int* )malloc(3*sizeof(int));
           vector<int> c(3);
           vector<int>::iterator j;
           j=c.begin();

           f1(a);
           f2(b);
           f3(j);
           g1(a);
           g2(b);
           j=c.end();
           g3(j);
        }
と書き方場合、g1のコードはどうなるでしょうか。


第11講第6話へ
 第12講第1話へ 第13講第3話へ 第13講第5話へ

vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ