当我使用调试器 C++ 时,局部变量会重置
Local variable resets when I'm using the debugger C++
我正在使用调试器检查我的程序是否工作,但我在精确的行上遇到段错误。当我检查出了什么问题时,局部变量显示 <no such value>
。发生了什么?我已经检查了每个 k 的值,它一直工作到 k=36。如果我在太长的循环中使用它,你认为局部变量会被重置吗?我记得我在 k=41 的循环中使用过它,并且运行良好。
我的变量 class:
masseVolumique= 7850;
dExterieur= 0.1778;
epaisseur= 0.019;
masseFlotteur1 = 526;
masseFlotteur2 = 94;
largeurFlotteur1 = 1.35+2;
largeurFlotteur2 = 0.83+2;
rayonBends = 0.699;
precision = 2;
所有其他变量都已定义,我可以在调试器模式下看到它们的值。
int k=0;
j=0;
double theta=0;
double phi=0;
double offsetDebut;
double offsetFin;
double r=0;
int nbPos = 0;
for(int i=0;i<nbSegments;i++)
{
theta=acos((coordonnees[i+1][0]-coordonnees[i][0])/pow(pow(coordonnees[i+1][0]-coordonnees[i][0],2)+pow(coordonnees[i+1][1]-coordonnees[i][1],2),0.5));
phi=acos((coordonnees[i+1][2]-coordonnees[i][2])/pow(pow(coordonnees[i+1][0]-coordonnees[i][0],2)+pow(coordonnees[i+1][1]-coordonnees[i][1],2)+pow(coordonnees[i+1][2]-coordonnees[i][2],2),0.5));
if(i==0)
{
offsetDebut=3+largeurFlotteur1/2;
}
else
{
offsetDebut=rayonBends+largeurFlotteur1/2;
}
if(i==(nbSegments-1))
{
offsetFin=3+largeurFlotteur1/2;
}
else
{
offsetFin=rayonBends+largeurFlotteur1/2;
}
j=0;
do
{
r=j*precision+offsetDebut; //segfault: precision <no such value>
tabPos[k*5+0]=k;
tabPos[k*5+1]=i+1;
tabPos[k*5+2]=coordonnees[i][0]+r*cos(theta)*sin(phi);
tabPos[k*5+3]=coordonnees[i][1]+r*sin(theta)*sin(phi);
if(r*cos(phi)<0.01)
{
tabPos[k*5+4]=coordonnees[i][2];
}
else
{
tabPos[k*5+4]=coordonnees[i][2]+r*cos(phi);
}
k=k+1;
j=j+1;
}
while (r<(segments[i]-offsetFin)) ;
}
好的,问题出在tabPos长度的计算上。我计算的长度太短了。在循环中,我试图访问未声明的 tabPos 部分。
实际上,我认为很多段错误问题都来自索引问题。我现在会非常仔细地看一下。
我正在使用调试器检查我的程序是否工作,但我在精确的行上遇到段错误。当我检查出了什么问题时,局部变量显示 <no such value>
。发生了什么?我已经检查了每个 k 的值,它一直工作到 k=36。如果我在太长的循环中使用它,你认为局部变量会被重置吗?我记得我在 k=41 的循环中使用过它,并且运行良好。
我的变量 class:
masseVolumique= 7850;
dExterieur= 0.1778;
epaisseur= 0.019;
masseFlotteur1 = 526;
masseFlotteur2 = 94;
largeurFlotteur1 = 1.35+2;
largeurFlotteur2 = 0.83+2;
rayonBends = 0.699;
precision = 2;
所有其他变量都已定义,我可以在调试器模式下看到它们的值。
int k=0;
j=0;
double theta=0;
double phi=0;
double offsetDebut;
double offsetFin;
double r=0;
int nbPos = 0;
for(int i=0;i<nbSegments;i++)
{
theta=acos((coordonnees[i+1][0]-coordonnees[i][0])/pow(pow(coordonnees[i+1][0]-coordonnees[i][0],2)+pow(coordonnees[i+1][1]-coordonnees[i][1],2),0.5));
phi=acos((coordonnees[i+1][2]-coordonnees[i][2])/pow(pow(coordonnees[i+1][0]-coordonnees[i][0],2)+pow(coordonnees[i+1][1]-coordonnees[i][1],2)+pow(coordonnees[i+1][2]-coordonnees[i][2],2),0.5));
if(i==0)
{
offsetDebut=3+largeurFlotteur1/2;
}
else
{
offsetDebut=rayonBends+largeurFlotteur1/2;
}
if(i==(nbSegments-1))
{
offsetFin=3+largeurFlotteur1/2;
}
else
{
offsetFin=rayonBends+largeurFlotteur1/2;
}
j=0;
do
{
r=j*precision+offsetDebut; //segfault: precision <no such value>
tabPos[k*5+0]=k;
tabPos[k*5+1]=i+1;
tabPos[k*5+2]=coordonnees[i][0]+r*cos(theta)*sin(phi);
tabPos[k*5+3]=coordonnees[i][1]+r*sin(theta)*sin(phi);
if(r*cos(phi)<0.01)
{
tabPos[k*5+4]=coordonnees[i][2];
}
else
{
tabPos[k*5+4]=coordonnees[i][2]+r*cos(phi);
}
k=k+1;
j=j+1;
}
while (r<(segments[i]-offsetFin)) ;
}
好的,问题出在tabPos长度的计算上。我计算的长度太短了。在循环中,我试图访问未声明的 tabPos 部分。 实际上,我认为很多段错误问题都来自索引问题。我现在会非常仔细地看一下。