【问题标题】:Local variable resets when I'm using the debugger C++当我使用调试器 C++ 时,局部变量会重置
【发布时间】:2015-05-10 09:38:37
【问题描述】:

我正在使用调试器检查我的程序是否正常工作,但我在精确的行上遇到了段错误。当我检查出了什么问题时,一个局部变量显示<no such value>。发生了什么?我检查了每个 k 的值,它一直工作到 k=36。如果我在太长的循环中使用它,你认为局部变量会被重置吗?我记得我在 k=41 的循环中使用过它,它运行得很好。

我班级的变量:

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)) ;
}

【问题讨论】:

  • 可能存在一些溢出,可能会间接为您的precision 变量设置错误值。检查您的阵列大小、访问权限等。我们没有足够的信息来帮助您。
  • tabPos[k*5+0]=k; 你的 tabPos 够长吗?
  • 在问题中显示所有相关代码
  • 感谢 Thomas,我想我找到了问题所在。我的 tabPos 不够长。好吧,实际上它已经足够长了,但是我的循环中有太多的迭代。我正在看这个。

标签: c++ segmentation-fault reset


【解决方案1】:

好的,问题来自于 tabPos 长度的计算。我正在计算一个太短的长度。在循环中,我试图访问未声明的部分 tabPos。 实际上,我认为很多段错误问题来自索引问题。我现在会仔细研究一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多