所以我正在研究这个我要编写代码的模拟。 最初,我曾经得到一个错误代码255(0xff),我认为可能是因为在我的代码块中添加了Eigen。但是,一旦我将我的Eigen头移动到代码块的include文件夹,我现在得到一个新的错误,消息是: -
处理终止,状态为-1073741571(0分钟,2秒)
我查了一下这个错误,它说它是在一个bug导致堆栈溢出时出现的。我运行我的调试器并收到消息: -
注册新类型:wxString
已注册的新类型:STL字符串
注册新类型:STL Vector
设置断点调试器名称和版本:GNU gdb(GDB)7.6.1
子进程PID:13284
编程接收信号SIGSEGV,分段故障。
所以我知道我的一个功能有错误。 以下是我的代码(它非常大)
#include <iostream>
#include <fstream>
#include <conio.h>
#include <random>
#include<math.h>
#include <Eigen/Dense>
#include<time.h>
#define pi atan(1) * 4
using namespace std;
using namespace Eigen;
int Poisson(int N)
{
int n=1;
float x,y,k=0;
do
{
x=(float)rand()/RAND_MAX;
y = -log(x);
k=k+y;
n=n+1; //n increases for each random number generated
}
while(k<N);
return n;
}
int sumrow(MatrixXd A,int row, int col_len)
{
int sum=0;
for(int i=0;i<col_len;i++)
{
sum=sum+A(row,i);
}
return sum;
}
void generate_D(MatrixXd A, int dim, MatrixXd D)
{
for(int x=0;x<dim;x++)
{
for(int y=0;y<dim;y++)
{
if(x==y)
{
D(x,y)=1/sqrt(sumrow(A,x,y));
}
else
{ D(x,y) =0; }
}
}
}
void sqmatrix_multiply(MatrixXd A,MatrixXd B,int dim, MatrixXd C)
{
for(int i=0;i<dim;i++)
{
for(int j=0;j<dim;j++)
{
for(int k=0;k<dim;k++)
{
C(i,j) = C(i,j) + (A(i,k)*B(k,j));
}
}
}
}
void generate_B(MatrixXd A, int dim, MatrixXd B)
{
MatrixXd D;
MatrixXd C, inter1, inter2;
generate_D(A,dim,D);
sqmatrix_multiply(A,D,dim,inter1);
sqmatrix_multiply(D,C,dim,inter2);
for(int i=0;i<dim;i++)
{
for(int j=0;j<dim;j++)
{
if(i==j)
{
B(i,j) = 1 - inter2(i,j);
}
else
{
B(i,j) = 0 - inter2(i,j);
}
}
}
}
int main()
{
srand(time(NULL));
double X,Y,x,y,a,b,L[5000][5000],M[5000][5000];
MatrixXd A, B;
for(int i=0; i<5000;i++)
{ L[i][i]=0; M[i][i]=0; }
int N, I;
cout<<"Enter your number and iterations";
cin>>N>>I;
int P[5000];
for(int i=0; i<I; i++)
{
P[i]=Poisson(N);
}
for(int k=0; k<I; k++)
{
for (int j=0;j<P[k];j++)
{
A:
X=(float)rand()/RAND_MAX;
Y=(float)rand()/RAND_MAX;
x=sqrt(X);
y = 2*(pi)*Y;
a=x*cos(y);
b=x*sin(y);
if((a*a)+(b*b)>1)
{
goto A;
}
L[k][j] = a; M[k][j] = b;
}
}
for(int a=0;a<I;a++)
{
for(int a1=0;a1<P[a];a1++)
{
for(int a2=0;a2<P[a];a2++)
{
if(a1==a2)
{
A(a1,a2)=0;
}
else
{
if(((L[a][a1]-L[a][a2])*(L[a][a1]-L[a][a2]))+((M[a][a1]-M[a][a2])*M[a][a1]-M[a][a2]) < 1) //distance formula
{
A(a1,a2)=1;
}
else
{
A(a1,a2)=0;
}
}
}
}
generate_B(A,P[a],B);
EigenSolver<MatrixXd> b(B,false);
cout<<a+1<<" Eigen values are: \n "<<b.eigenvalues()<<"\n";
}
return 0;
}
我在不同的程序中分别尝试了一些功能。问题与Eigen标题无关,因为sumrow()工作得非常好。 但是,Poisson()函数给了我同样的错误(-1073741571)。我尝试用简单的方法替换do-while,但它没有用。
早些时候,当我单独使用Poisson()时,它曾经工作正常。但现在,它也没有独立运作。
很抱歉这个长期的问题,但我已经使用了一个多星期了,似乎无法弄明白。如果你能告诉我我的代码可能有什么问题,我将非常感激。 非常感谢提前!