2016-10-07 2 views
0

Я использую библиотеку для разбора файла .pgn, и когда я пытался запустить проект, я нашел эту ошибку: Debug Assertion Failed! программа: C: \ windows \ SYSTEM32 \ MSVCP110D.dll Файл: c: \ program files (x86) \ microsoft visual studio 11.0 \ vc \ include \ xstring Строка: 79 Выражение: string iterator не является неразрешимым Для получения информации о том, как ваш программа может вызвать ошибку утверждения, см. визуальную документацию на C++ для утверждений.string iterator is not dereferencable

проблема заключается в том, что, когда итератор достигает конца файла, он ничего не указывает (запустите итератор (itr1) == end iterator (itr2)), я попытался добавить условия, чтобы проверить, достиг ли itr1 к конец файла, но это было бесполезно. Итак, пожалуйста, скажите мне, где моя вина. вот мой код source.cpp файла:

#include <iostream> 
#include <fstream> 
#include <PGNGameCollection.h> 
int main() 
{ 
    std::ifstream pgnfile("sample.pgn"); 
    pgn::GameCollection games; 
    pgnfile >> games; 
    std::cout << "the file sample.pgn contains " << games.size() << "games"  << std::endl; 
    system("pause"); 
    return 0; 
} 

и здесь есть функция класса, который вызывает ошибку:

bool pgn::Parser::getComment(std::string::const_iterator &itr1, const std::string::const_iterator &itr2, pgn::CommentText &out) 
{ 
    std::string::const_iterator local_itr=itr1; 
    std::string comment; 
    if(*local_itr != '{') 
     return false; 
    local_itr++; //skipping '{' 

    while((*local_itr != '}') && (local_itr != itr2)) 
    { 
     comment += *local_itr++; 
    } 
    local_itr++; //skipping '}' 
    skipBlanks(local_itr, itr2); 
    itr1=local_itr; 
    out=pgn::CommentText(comment); 
    return true; 
} 

skipBlanks функции:

void pgn::Parser::skipBlanks(std::string::const_iterator &itr1, cost std::string::const_iterator &end) 
{ 
    while((itr1 != end) && (isspace(*itr1))) 
    { 
     itr1++; 
    } 
} 

Я искал StackOverflow и google для всех подобных проблем, но я не смог найти ответ. также я проследил код строки за строкой, пока не добрался до функции, вызвавшей ошибку.

+0

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Я уже отлаживал код по очереди, прежде чем спрашивать здесь, но я не смог найти ответ! –

+0

Тогда вы, вероятно, используете отладчик неправильно. –

ответ

1

Если itr2 ваш конечный итератор, то вы должны проверить итератор для конечного состояния перед тем пытается разыменования его

while((local_itr != itr2) && (*local_itr != '}')) 

Вы делаете это наоборот, что, несомненно, приведет к проблеме, которую вы описали.

Возможно, имеет смысл добавить проверки для конечного состояния в самом начале вашей функции, так как там вы также разыгрываете local_itr.

Кроме того, если ваш цикл завершен, потому что local_itr достиг itr2, и ничего нет в itr2, а после него код после цикла не имеет смысла. В этой ситуации вам не разрешается увеличивать local_itr.

+0

Я пробовал это, но появилось такое же сообщение об ошибке с выражением: string iterator не incremental –

+0

@Norhan Foda: Um ... То же самое? Как это одно и то же? Вы указали свою исходную ошибку, так как «итератор строки» ** не является неразрешимым ** », и теперь вы получаете« ** не увеличивающийся ** ». «Not incrementable» - совершенно другая ошибка, возникающая из-за вашей попытки выполнить «local_itr ++» после цикла. Последнее не имеет смысла, если вы достигли конца. Это другая проблема, которая потребует отдельного исправления.Не пытайтесь увеличивать ваш итератор или читать что-либо из него, если оно уже достигло конца. – AnT

+0

Я проверил, достиг ли итератор до конца так: if (itr1! = Itr2) {local_itr ++;}, поэтому local_itr будет увеличиваться, только если это не конец файла. это возвращает меня к строковому итератору, а не к неразрешимости. –