問題

私は2次元配列を出力する関数を作ろうとしています。 ここに私のコードです:

 void print_matrix(float*** mat, int dim01, int dim02){
  for(int i=0; i<dim01; i++){
    for(int j=0; j<dim02; j++){
      cout<<*mat[i][j]<<" ";
    }
    cout<<endl;
  }
}
 

私はまた、これがエラーを投げたので、代替コードを試しました。

[1] 2999 Segmentation Fault

2番目の関数は次のとおりです。

 void print_matrix(float** mat, int dim01, int dim02){
  for(int i=0; i<dim01; i++){
    for(int j=0; j<dim02; j++){
      cout<<mat[i][j]<<" ";
    }
    cout<<endl;
  }
}
 

これにより、2999の代わりに3617のセグメンテーション違反が発生しました。

物事を明確にするだけです。最初の関数では配列のアドレスを渡しましたが、2番目に配列を渡しました。

私がここで作っているエラーは何ですか?私はセグメンテーション違反がメモリ管理エラーのためであることを知っていますが、私はそれを見つけることができません!

コード全体は次のようになります。

 #include<iostream>
using namespace std;

//some useful functions
float** cofactor(float**, int, int, int);
void input_matrix(float**, int, int);
void print_matrix(float**, int, int);

//main
int main(){
  int size;
  int a,b;
  float** arr01; float** arr02;

  cout<<"Size of matrix : ";
  cin>>size;

  input_matrix(arr01,size,size);
  cout<<endl<<"Input Successful..."<<endl;
  /*
  cout<<"Enter the element to find the cofactor [i,j] : ";
  cin>>a>>b;

  cofactor(arr01,size,a,b);
*/
  print_matrix(arr01,size,size);

  return 0;
}

//definitions
void input_matrix(float** mat, int dim01, int dim02){
  mat = new float*[dim01];
  cout<<"Enter the matrix : "<<endl;
  for(int i=0; i<dim01; i++){
    mat[i]=new float[dim02];
    for(int j=0; j<dim02; j++){
      cin>>mat[i][j];
    }
  }
}

void print_matrix(float** mat, int dim01, int dim02){

  for(int i=0; i<dim01; i++){
    for(int j=0; j<dim02; j++){
      cout<<mat[i][j]<<" ";
    }
    cout<<endl;
  }

}
 

前もって感謝します!

  ベストアンサー

現在表示されているコードの問題は、引数がデフォルトで値渡しされることです。つまり、値は関数のローカル引数変数にコピーされます。コピーを変更すると(たとえば、それに割り当てると)、コピーのみが変更され、元のコピーは変更されません。

今、あなたのinput_matrix関数とその宣言を見ると:

 void input_matrix(float** mat, int dim01, int dim02);
 

そしてそれがどのように呼ばれるか:

 input_matrix(arr01,size,size);
 

私たちは明らかにこの問題を見ることができます。関数内のmatに加える変更は、その関数にのみローカルです。

2つの解決策があります。

  1. matをまったく渡さず、関数に "array"を返すようにします。

     float** input_matrix(int dim01, int dim02);
     
  2. または、代わりに引数matを参照渡します。

     void input_matrix(float**& mat, int dim01, int dim02);
     

  同じタグがついた質問を見る

c++arrays