2011-05-05 25 views
0

崩溃我有这个代码的问题:它总是崩溃,但当我评论:dataResults [i] .clear();崩溃后矢量只有一个清晰的

有关这个原因的想法吗?

std::vector<std::string> r_OCRtoRetrieve; 
std::vector<std::string> DBentries; 

//stuff.. 

int distance = 9999; //TODO change here 
int minDistance = 9999; 

for(int i=0; i< r_OCRtoRetrieve.size(); i++) 
    for(int j=0; j< DBentries.size(); j++) 
    { 
     distance = calcDistance((const char *)r_OCRtoRetrieve[i].c_str(),(const char *) DBentries[j].c_str()); 

     if (distance == minDistance) 
      dataResults[i].push_back(DBentries[j]); 
     else 
      if(distance < minDistance) 
      { 
       minDistance = distance; 
       dataResults[i].clear(); 
       dataResults[i].push_back(DBentries[j]); 
      } 

    } 

编辑:

发现错误..我必须初始化它..这是代码:

for(int i=0; i< r_OCRtoRetrieve.size(); i++) 
    { 
    dataResults.push_back(std::vector<std::string>()); 

    for(int j=0; j< DBentries.size(); j++) 
    { 
     distance = calcDistance((const char *)r_OCRtoRetrieve[i].c_str(),(const char *) DBentries[j].c_str()); 

     if (distance == minDistance) 
    dataResults[i].push_back(DBentries[j]); 
     else 
    if(distance < minDistance) 
    { 
     minDistance = distance; 
     if(dataResults[i].size() > 0) 
     dataResults[i].clear(); 

     dataResults[i].push_back(DBentries[j]); 
    } 
    } 

    } 
+0

你可以给我们例外信息吗? – 2011-05-05 15:57:08

+0

什么是你的varlable'dataResults'定义为? – Nick 2011-05-05 16:01:51

+0

什么是dataResults?我没有看到声明。 – Kevin 2011-05-05 16:02:42

回答

1

如果您收到一个指数超出范围例外,这可能是因为你的索引i超出了向量的范围dataResults

如果那还不够明显,那么basica如果i大于dataResults.size()那么dataResults[i].clear();会抛出异常。

编辑:

考虑使用STL迭代器更换您的基于索引的循环,并用C++风格铸造更换你的C风格的铸造。你的if语句可以重新审视,以及...

编辑2:

当时一个在可能出现的问题的猜测,你没有告诉我们什么是例外,但你有一个vector<vector<string>>吧?如果是这样,你需要在调用方法或构建循环之前检查你正在索引的有效位置,以便它不会索引超出范围。

事情是这样:

if (dataResults.size() > i) 
{ 
    // now we know dataResults[i] will be valid 
    dataResults[i].clear(); 
    // etc 
} 

老实说,我可能会做更多的东西沿着这行:

typedef std::vector<std::string> StrArray; 
    for(StrArray::const_iterator ret(r_OCRtoRetrieve.begin()); ret != r_OCRtoRetrieve.end(); ++ret) 
    { 
     // ret will be an const iterator to each string element in r_OCRtoRetrieve 
     for(StrArray::const_iterator entry(DBentries.begin()); entry != DBentries.end(); ++entry) 
     { 
      // entry will be an const iterator to each string element in DBentries 
      distance = calcDistance(ret->c_str(), entry->c_str()); 

      // init new StrArray in dataResults as needed 
      // set new min distances as needed 
      // push back strings to dataResults 
      // whatever else you want to do 
      // yata yata 
     } 
} 
+0

多数民众赞成在一个很好的解释,但它没有任何意义,因为海报说,错误消失,如果该行被注释掉。紧接着的一行还会索引dataResults [i],它会抛出非常相同的异常。 – Kevin 2011-05-05 16:06:23

+0

更准确地说,你会得到未定义的行为 – 2011-05-05 16:07:16

+0

我要捕捉异常,因为没有任何消息..只是崩溃 – manty 2011-05-05 16:07:17

1

可能,你的载体dataResults的尺寸小于一定值时i

+0

不,它应该是好的 – manty 2011-05-05 16:09:52

0

启动时DataResults中有什么?什么?如果不是,那么在第一次通过时,当距离小于9999时,代码将尝试清除第一个零索引处不存在的位置并投诉。

如果您执行调试构建,您应该得到一个有意义的消息。

+0

当我开始我刚刚std :: vector > dataResults;呃你的解释真的有意义...我要检查 – manty 2011-05-05 16:09:04

+0

尝试:\t如果(dataResults [i] .size()> 0)和相同的结果 – manty 2011-05-05 16:16:56

+0

不幸的是我现在不能这样做。我试图尝试,但没有输出 – manty 2011-05-05 16:21:18