我正在为QM中的特征值问题编写Jacobis方法,我刚刚开始使用c ++,我想使用双指针来构造矩阵,但涉及的物理问题需要很多代码。
我不想让我的main()
用不可读的行混乱(其他人必须阅读这段代码......),所以想把问题分成子函数。我创建了一个带双指针并返回矩阵的函数,但为什么我不能在函数外部访问它?我尝试时,我的代码 segfaults (标在下面)。如何在main()外部构建矩阵,同时仍能在main()
中访问它?
enter code her enter code here
int i, j, k;
//== BEGIN MAIN ==//
int main ()
{
//Constants and variables
double **A;
double epsilon = pow((double)10, double(-8)); //The convergence limit for jacobis method
int N = 10; //Dimension of matrix
char test[] = "test";
cout <<"The inner matrix function:"<<endl;
makematrix(N, A);
cout<<endl<<"The outer matrix function:"<<endl;
//This part segfaults
for(i=0; i<N; i++)
{
cout<<endl;
for(j=0; j<N; j++)
{
cout<<A[i][j]<<" ";
}
}
return 0;
}
//== END MAIN ==//
//==Begin function definitions==//
void makematrix(int N, double **A)
{
//Function for initializing our tridiagonal matrices for jacobis method
A = new double*[N];
for(i=0; i<N; i++)
{
A[i] = new double[N];
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A[i][j] = 0;
}
}
//Prints the matrix declared here
for(i=0; i<N; i++)
{
cout<<endl;
for(j=0; j<N; j++)
{
cout<<A[i][j]<<" ";
}
}
cout <<endl;
return;
}
答案 0 :(得分:3)
归还:
double** makematrix(int N) {
double **A = new double*[N];
...
return A;
}
主要......
double **A = makematrix(N);
答案 1 :(得分:2)
//This part segfaults
for(i=0; i<N; i++)
因为,您通过值(double **A
内部已修改)而不是引用传递makematrix
。将您的功能签名更改为以下内容,它应该可以工作:
void makematrix(int N, double **&A)
... ^^^ pass by reference
答案 2 :(得分:1)
因为当您将A
传递给函数时,该函数将在A
的副本上运行。它将该副本设置为指向new
数组,但这不会影响原始A
。
一个解决方案是:
double **A;
makematrix(N, &A); // Pass address of A
...
void makematrix(int N, double ***A)
{
(*A) = new double*[N];
// etc.
}
即。传递A
的地址,以便该函数可以修改原文。
注意:每当你最终需要三指针时,你可能会遇到设计问题。特别是在C ++中。
答案 3 :(得分:0)
我假设您应该通过引用将指针作为参数传递。 所以函数应该是这样的(我添加了一个&amp;):
void makematrix(int N, double **&A)
这样你的变量就会被改变,所以A现在是一个输出参数。
答案 4 :(得分:0)
要快速修复代码,请使用pass-by-reference解决方案,它比三重指针更容易阅读。
但是,如果你想在真正的C ++中编码,而不是在伪装的C中编码,那么隐藏矩阵后面的双数组复杂性的解决方案就是创建一个类。 C ++ FAQ Lite对您的问题进行了广泛的描述,并提供了解决问题的不同方法。见http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10 和 http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.11