【问题标题】:Segmentation Fault C++ | Can anyone point me in the right direction? [closed]分段错误 C++ |谁能指出我正确的方向? [关闭]
【发布时间】:2012-11-05 08:49:50
【问题描述】:

我写这段代码是为了找到动态时间扭曲的最佳扭曲路径,它返回一个结构。

static inline double min (double x, double y,double z )
{
    if(x < y && x < z)
    return x;
    else if(y < x && y < z)
    return y;
    else if(z < x && z < y)
    return z;
}

struct backtracking_result
{
   vector<int> i;
   vector<int> j;
};

backtracking_result backtracking(vector<vector<double> > mGamma)
{
    backtracking_result br;
    cout<<"test"<<mGamma.size()<<endl;
    int i=mGamma.size();
    cout<<"test"<<endl;
    int j=mGamma.at(0).size();
    cout<<"test"<<endl;
    cout<<i<<j<<endl;   
    do
    {
         cout<<"test"<<endl;
         if(i == 1)
            j=j-1;
         else if(j == 1)
            i=i-1;
         else
         {
            if(mGamma[i-1][j] == min(mGamma[i-1][j],mGamma[i][j-1],mGamma[i-1][j-1]))
             i=i-1;
            else if(mGamma[i][j-1] == min(mGamma[i-1][j],mGamma[i][j-1],mGamma[i-1][j-1]))
                 j=j-1;
            else
            {
                i=i-1;
                j=j-1;
            }
         }
    br.i.push_back(i);
    br.j.push_back(j);
  }while((i > 1)&&(j > 1));

  return br;
}

当我调用这个函数时,从 gdb 调试器中得到这个错误

Program received signal SIGSEGV, Segmentation fault.
0x000000000041eafb in VectorDTW::backtracking(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >) ()

哪里出错了?

堆栈跟踪:

#0  0x000000000041eb17 in VectorDTW::backtracking(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >) ()
#1  0x0000000000420195 in VectorDTW::fastdynamic(std::vector<DollarRecognizer::Point2D, std::allocator<DollarRecognizer::Point2D> >&, std::vector<DollarRecognizer::Point2D, std::allocator<DollarRecognizer::Point2D> >&) ()
#2  0x000000000041d18b in main ()

答案帮助我找出了问题,我在从矩阵计算 i 和 j 后添加了这两行,

i=i-1;
j=j-1;

现在程序不会尝试访问最后一个元素。谢谢 。 但我仍然无法理解拒绝投票的原因。

【问题讨论】:

  • 崩溃发生在哪一行?
  • 代码还能编译吗? min 需要 3 个参数?还是我错了?
  • 它编译,我已经编辑了问题以包含 min 的代码。
  • 你知道有一个标准的 min 函数吗?
  • 哈哈...刚刚读到您已经从 gdb 运行...您的堆栈跟踪说明了什么?

标签: c++ segmentation-fault


【解决方案1】:

由于j 是内部vector&lt;double&gt; 的大小,所以mGamma[i-1][j] 不存在。您遇到了典型的非一错误。

【讨论】:

  • 为什么 mGamma[i-1][j] 不存在? mGamma 是一个 mxm 矩阵,在 while 循环中我已经指定 i>1 && j>1
  • @rajat 如果您的vector&lt;&gt; 大小为j,则元素范围从0j-1
  • 因为向量是0索引,所以如果向量的大小是N,向量的索引从0到N-1。您无法访问超出向量限制的[N]
【解决方案2】:

我认为您应该更好地检查mGamma.size()mGamma.at(0).size(),因为如果 mGamma 的大小为 0,则您访问的位置 at(0)不存在。
如果 mGamma.size() 不是 0,但 at(0).size() 是 0,您将进入代码的 else 部分,访问带有负索引的向量,从而导致段错误。

【讨论】:

  • 这是一个标准的 m x m 矩阵。我可以看到这两个值。 mGamma.size() 和 mGamma.at(0).size();
  • 是的,我确定。如果它是 0,我已经有条件在 i>1 & j>1 时进入循环。
  • 我认为错误是@Gorpik 回答中指出的错误。但是,您不会在第一次运行时检查它是否为 0。 do {} while(condition) 循环运行一次代码,然后检查条件。
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2017-05-12
  • 2012-12-23
  • 2018-05-27
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多