сбой на векторе вектора только после очистки - PullRequest
0 голосов
/ 05 мая 2011

У меня проблема с этим кодом: он всегда падает, но когда я комментирую: 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]);
    }
    }

  } 

Ответы [ 3 ]

1 голос
/ 05 мая 2011

вероятно, размер вашего вектора dataResults меньше определенного значения i

1 голос
/ 05 мая 2011

Если вы получаете индекс вне диапазона исключение, это, вероятно, потому что ваш индекс i находится вне диапазона вектора dataResults

Если это не было очевиднодостаточно, если 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 голосов
/ 05 мая 2011

Что находится в DataResults при запуске? Что-нибудь? Если нет, то в первый раз, когда расстояние меньше 9999, код попытается очистить несуществующее место в первом нулевом индексе и пожалуется.

Если вы выполняете отладочную сборку, вы должны получить осмысленное сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...