我正在尝试制作一个打印2d数组的函数。 这是我的代码:
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
第二个功能是:
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;
}
}
这也引发了3617而不是2999的细分错误。
只是要弄清楚。在第一个函数中,我传递了数组的地址,但是在第二个函数中,我传递了数组。
我在这里犯什么错误。我知道分段错误是由于内存管理错误引起的,但我找不到它!
整个代码如下:
#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;
}
}
谢谢!
答案 0 :(得分:1)
对于2D数组,您需要float**
,但仍需要创建数组。
const int dim1=100;
const int dim2=100;
float **matrix = new float*[dim1];
for(int i=0;i<dim1;i++)
matrix[i] = new float[dim2];
//now you can add elements to your 2D array and print them once the elements
//have been added (print_matrix (print_matrix(matrix, dim1,dim2); )
//when done delete the array
for(int i=0;i<dim1;i++)
delete [] matrix[i];
delete [] matrix;
您也可以使用std::vector<std::vector<float>>
,除非性能有问题(阵列很大),否则最好使用ByteBuffer
。
答案 1 :(得分:1)
您现在显示的代码的问题在于,默认情况下参数是通过值传递的。这意味着该值将被复制到函数的局部参数变量中。当您修改副本(例如通过分配给副本)时,仅副本被更改,而不是原始副本。
现在,我们来看一下您的input_matrix
函数及其声明:
void input_matrix(float** mat, int dim01, int dim02);
及其名称:
input_matrix(arr01,size,size);
我们可以清楚地看到这个问题。您对该函数内的mat
所做的任何更改仅是该函数的本地。
有两种解决方案:
要么根本不传递mat
,要么具有 return 函数“数组”:
float** input_matrix(int dim01, int dim02);
或者通过引用传递参数mat
:
void input_matrix(float**& mat, int dim01, int dim02);