循环中的运行时向量错误

Posted

技术标签:

【中文标题】循环中的运行时向量错误【英文标题】:Run time vector error in loop 【发布时间】:2013-08-03 17:30:01 【问题描述】:

我的程序给了我向量迭代的运行时错误,下面是我的代码

for (i = 0; i != num_img; ++i)

    tmp_img = imread( files[i], 0 ); // load in grayscale.
    resize( tmp_img, tmp_dst, tmp_dst.size() );
    Mat row_img = tmp_dst.reshape( 1, 1 ); // get a one line image.
    row_img.convertTo( training_mat.row(i), CV_32FC1 );
    labels.at< float >(count, 0) = (count<nb_cars)?1:-1; // 1 for car, -1 otherwise*/

当我逐行检查时,它会在循环中显示tmp_img 上的错误 这是错误 有时它

【问题讨论】:

你应该检查向量的大小至少是num_img 必须有一个 .size() 函数来给出元素的数量。文件大小() 是的,我检查了这个,它是 42, 使用调试器...跟随循环直到它崩溃。 【参考方案1】:

最可能的情况是您在此处访问超出范围的files 向量:

for(int i = 0 ;  i < num_img ; i++ )

   tmp_img = imread( files[i], 0 ); // i could be larger than files.size()

您应该确保不会访问超出范围的向量。使用std::vector::size() 方法。您可以检查num_img 是否小于或等于files.size(),或者完全删除num_img,然后循环遍历向量的内容。

编辑 越界访问向量是错误的,会导致未定义的行为。如果您的程序这样做,那么它是不正确的,必须修复。

【讨论】:

我知道 all 的大小,文件大小是 13,循环大小是 42 @Flying there you go,这是一个越界访问。 我将其更改为for(int i = 0 ; i &lt; files.size() ; ++i ),但现在它向我抛出了黑屏错误,我在我的问题中进行了更新 @Flying 我宁愿只使用std::vector&lt;std::string&gt;::const_iteratorfiles.end(),这完全可以确保没有索引非法访问。 Juan 精通这一点(并且在这个答案的第二段的最后一句中避开了它),但对于 OP 来说似乎并非如此。 C++ 迭代器(通常)使您免于麻烦,并且非常灵活。利用它。【参考方案2】:

尝试使用迭代器。它们可以帮助您保持在范围内;

int count = 0;
vector<string>::const_iterator i;
for (i = files.begin(); i != files.end(); ++i)

    tmp_img = imread( *i, 0 ); // load in grayscale.
    resize( tmp_img, tmp_dst, tmp_dst.size() );
    Mat row_img = tmp_dst.reshape( 1, 1 ); // get a one line image.
    // copy line and convert to float
    row_img.convertTo( training_mat.row(count), CV_32FC1 );
    labels.at< float >(count, 0) = (count<nb_cars)?1:-1; // 1 for car, -1 otherwise*/
    ++count;

【讨论】:

不,如果他要使用迭代器,他应该使用const_iterator 正确的想法,错误的迭代器。更改此答案以使用const_iterator,您很可能会收回您的选票。 (并注意 *it 用于对象级访问,it-&gt;memberfn() 用于功能访问以清楚起见)。 @WhozCraig 您在上面的评论中询问这个答案?我不明白std::vector&lt;std::string&gt;::const_iterator 使用这个给我这一行的错误tmp_img = imread( files.at(i), 0 ); @Flying 在任何情况下,您认为可以遍历files 向量中的num_img 条目这一事实表明您的代码中有问题。循环遍历vector的元素可以解决一个问题,但是你要明白为什么num_imgfiles的大小不一致。【参考方案3】:

不要使用operator []! 使用.at() 会更好 因为它会检查 i 是否在范围内,如果 不在则抛出 out_of_range

string YourImagesDirectory="D:\\pics\\";
vector<string> files=listFilesInDirectory(YourImagesDirectory+"*.jpg");
for(size_t i = 0 ;  i < num_img ; i++ )

    try
    
        tmp_img = imread( files.at(i), 0 );
    
    catch(const std::out_of_range& e)
    
         std::cerr << "num_img is bigger than files.size()!" << std::endl;
         std::cerr << "Exception caught! (out_of_range): " << e.what() << std::endl;
         break;
    
    resize( tmp_img, tmp_dst, tmp_dst.size() );
    Mat row_img = tmp_dst.reshape( 1, 1 );
    row_img.convertTo( training_mat.row(i), CV_32FC1 );
    labels.at< float >(i, 0) = (i<nb_cars)?1:-1;

【讨论】:

它仍然给我在我的问题中更新的黑屏错误

以上是关于循环中的运行时向量错误的主要内容,如果未能解决你的问题,请参考以下文章

从逆序 C++ 访问向量时出现运行时错误 [关闭]

“从链接列表中删除循环”中的运行时错误

使用向量将给定表达式转换为波兰符号时的运行时错误

来自 for 循环的分段错误

分段错误:从二维向量中随机删除元素

将指针向量元素推回非指针向量c ++时出错