带有向量向量的段错误

Posted

技术标签:

【中文标题】带有向量向量的段错误【英文标题】:Segment Fault with vectors of vectors 【发布时间】:2014-02-25 10:06:33 【问题描述】:

所以我的代码如下。我正在拼接矩阵/或 pgm 图像。通过镶板,我的意思是在一定数量的列和行中重复。它看起来像一个窗户,其中的窗格都将每个玻璃部分分开。

一个例子:http://1.bp.blogspot.com/_OLskT-GO5VE/TGqgrSX_o_I/AAAAAAAAA-4/vcCdn6hA3fI/s320/2007_12_warhol_cambell_soup.jpg 这是一个 4x8 的汤罐矩阵(它们本身就是一个巨大的像素矩阵。

我相信段错误发生在涉及 index=k 的某个地方,但我找不到任何错误。我正在重新调整矩阵的大小,所以不应该这样。

编辑:固定示例。

void panel(vector <VecofInts> &p, int inputRow, int inputColumn)

    int i, j, v = 1, g = 1, k = 0, row, col;

    row = p.size();//obtaining the original rows
    col = p[0].size();//obtaining the original columns

    p.resize((r * row)); //sets up the new matrix so I can add new elements.

 /* This is my first test loop for the columns; I know I can create a single loop
 for rows and columns but this will help me find problems more easily */

    while(v < c)
        ...
    

/* this is the loop I'm having trouble with */

    v=1;

    while(v < c)
        k = row;
        while(g < r)
            for(i = 0; i < row; i++)
                k = k + i;
                for(j = 0; j < col; j++)
                    p[k].push_back(p[i][j]);
                
            
            g++;
            k++; //this allows the g<r loop to continue and k not repeat itself
                   //in the first i loop again.
        
        v++;
    

【问题讨论】:

尝试使用标志 -g 编译它并使用 gdb 之类的调试器运行它,这为您提供了确切的代码行,其中发生了段错误。见unknownroad.com/rtfm/gdbtut/gdbsegfault.html 变量“c”在哪里定义? 我必须解决调试器问题。我会一路更新 您根本没有检查 p 是否为空。 col = p[0].size();。如果 p 为空,则这是未定义的行为。 vector&lt;vector&lt;int&gt;&gt; x(10,vector&lt;int&gt;(10)); x.push_back(x[9]); 将整个第 10 行复制到新分配的第 11 行。无需循环遍历 x[9] 中的每个条目。这是你想要做的吗? 【参考方案1】:

从您的示例中并不太清楚您的意图是什么。 顺便说一句,我建议采用这种通用方法:

typedef std::vector<int> VecofInts;
typedef std::vector<VecofInts> Matrix;
typedef std::vector<int>::iterator RowIterator;

void panel(const Matrix& m, int inputRow, int inputColumn) 
    const int column = m.size(); /* Number of column, each colum is a vec of int */
    RowIterator it;
    for(int i=0; i != column; i++) 
       it = m[i].begin();
       /* m[i] represent a row on your matrix */
       for(; it != m[i].end; it++) 
          ...
       
    

【讨论】:

【参考方案2】:

当您在 for 循环中使用 k = k + i 时,您将得到 k = 0,1,3,6,10,15...

我想你的目的是k++

编辑:

请查看k = k + i的评论:

while(v < c)
    k = row;
    while(g < r)
        for(i = 0; i < row; i++)
            k = k + i; // ####### k = (row), (row+1), (row+3), (row+6), (row+10),(row+15)....
            for(j = 0; j < col; j++)
                p[k].push_back(p[i][j]);
            
        
        g++;
        k++; //this allows the g<r loop to continue and k not repeat itself
               //in the first i loop again.
    

【讨论】:

当 For(i) 循环退出时,它不会从 k 中退出吗?我有 k = row;再次重新应用基值,这样它就不会停止迭代。 @TrickyNicky p[k] 代表什么?实际上你得到了一系列 p[row+0].push, p[row+1].push, p[row+3].push, p[row+6].push, p[row+10].push在您的代码中 @TrickyNicky - 您知道 k 的最大值必须是多少,但您依靠错误的逻辑来退出循环。保持简单——为什么不检查以确保 k 在界限内,如果不是,那么你有问题(或退出循环)。 @Jerry_Y p[k] 正在遍历包含整数向量的主向量。但是 row+n 只会依赖 for(i @TrickyNicky 现在我很困惑。假设 row=4,那么这个 k 就是 4、5、7、10。这是你所期望的吗?

以上是关于带有向量向量的段错误的主要内容,如果未能解决你的问题,请参考以下文章

c++ 类向量中的段错误

声明向量类型变量的段错误<shared_ptr<int>>

使用 vector<vector<int> > 成员实例化对象时的段错误

r 将向量分解为定义的段长度

带有向量和字符串的 C++ 分段错误

C++ 为啥在向量段错误中放置对象?