ページ 11

ポインタを使った2次元配列のコピー 

Posted: 2015年12月05日(土) 20:55
by コハク

コード:

void Merge(double **parents,int size,int size_2){
  double **new_gene=new double*[size];
  for(int i=0;i<size;i++){
      *(new_gene+i)=new double[size_2];
  }

//new_geneの要素を並び替える操作
//コピー
  parents=new_gene;

}

int main(){
  double **p=new double*[10];
  for(int i=0;i<10;i++){
    *(p+i)=new double[2];
  }
  Merge(p,10,2);
 for(int i=0;i<10;i++){
    for(int j=0;j<2;j++){
      cout<<(*(p+i))[j]<<endl;
    }
  }
  return 0;
}
この出力が関数の中で入れ替えた後の配列にならず困っています。
関数の戻り値として取得する方法以外でpにnew_geneの値を挿入することはできないでしょうか。

Re: ポインタを使った2次元配列のコピー 

Posted: 2015年12月05日(土) 21:57
by みけCAT
コハク さんが書きました:関数の戻り値として取得する方法以外でpにnew_geneの値を挿入することはできないでしょうか。
挿入するというのはよくわからないですが、上書きならばポインタや

コード:

void Merge(double ***parents,int size,int size_2){
  double **new_gene=new double*[size];
  for(int i=0;i<size;i++){
      *(new_gene+i)=new double[size_2];
  }

//new_geneの要素を並び替える操作
//コピー
  for(int i=0;i<size;i++){
    delete[] (*parents)[i];
  }
  delete[] *parents;
  *parents=new_gene;

}

int main(){
  double **p=new double*[10];
  for(int i=0;i<10;i++){
    *(p+i)=new double[2];
  }
  Merge(&p,10,2);
  for(int i=0;i<10;i++){
    for(int j=0;j<2;j++){
      cout<<(*(p+i))[j]<<endl;
    }
  }
  for(int i=0;i<10;i++){
    delete[] *(p+i);
  }
  delete[] p;
  return 0;
}
参照を使ってできます。

コード:

void Merge(double **&parents,int size,int size_2){
  double **new_gene=new double*[size];
  for(int i=0;i<size;i++){
      *(new_gene+i)=new double[size_2];
  }

//new_geneの要素を並び替える操作
//コピー
  for(int i=0;i<size;i++){
    delete[] parents[i];
  }
  delete[] parents;
  parents=new_gene;

}

int main(){
  double **p=new double*[10];
  for(int i=0;i<10;i++){
    *(p+i)=new double[2];
  }
  Merge(p,10,2);
  for(int i=0;i<10;i++){
    for(int j=0;j<2;j++){
      cout<<(*(p+i))[j]<<endl;
    }
  }
  for(int i=0;i<10;i++){
    delete[] *(p+i);
  }
  delete[] p;
  return 0;
}
メモリリークを起こさないように、コードに余計な全角文字が混ざらないように注意してください。

Re: ポインタを使った2次元配列のコピー 

Posted: 2015年12月05日(土) 22:28
by コハク
ありがとうございます!
参照のほうのやり方で解決できました!
**&(変数名)という風な書き方は知らなかったのでとても勉強になりました.

ポインタのほうは
ポインタはデリートできません
*parents とnew_geneは異なる型です
と出てきたため使うことを断念しました.