2017-01-21 21 views
0

Итак, я пытаюсь вводить и выводить файлы для сохранения обособлений Yugioh, и я получил его работу по большей части. Я использую deques для хранения объекта класса, известного как «Карта», который содержит всю информацию, и класса Deck для хранения заявок на объекты Card для каждого типа колоды, основного, бокового и дополнительного.Deque iterator не вызывает различий

Так или иначе, на проблему. Я использую локальный deque для хранения информации о ранее загруженных карточках, так как когда я загружаю каждую карту, я просматриваю deque для точных совпадений и затем сохраняю число внутри переменной для использования в выводе. Когда я пытаюсь добавить к этому локальному деку, называемому «обработанным», я получаю сообщение об ошибке.

Ошибка отладки! Выражение: Deque итератора не разыменовываемое

void Deck::SaveDeck(std::string filename) 
{ 
    std::ofstream outFile; 
    outFile.open(filename.c_str()); 

    //send the file the deck name 
    outFile << this->deckName << "\n"; 

    //send the deck sizes 
    outFile << main_deck_size << " " << side_deck_size << " " << extra_deck_size << "\n"; 

    //iterator to iterate through the entire deck looking for copies 
    std::deque<Card>::iterator iter = main_deckCards.begin(); 
    std::deque<Card>::iterator iter2 = main_deckCards.begin(); 

    //deque to hold previously added cards 
    std::deque<Card> processed; 
    std::deque<Card>::iterator processed_iter = processed.begin(); 

    string setNAME = ""; 
    int setNum = 0; 
    int quantity = 0; 
    bool is_processed = false; 

    for (int i = 0; i < main_deck_size; i++) 
    { 
     //reset processed flag 
     is_processed = false; 

     //check processed queue for exact card 
     for (int j = 0; j < processed.size(); j++) 
     { 
      if (iter[i].SET_NAME == processed_iter[j].SET_NAME && iter[i].SET_NUM == processed_iter[j].SET_NUM) 
      { 
       is_processed = true; 
       break; 
      } 
     } 

     if(is_processed == false) 
     { 
      //reset variables 
      setNAME = ""; 
      setNum = 0; 
      quantity = 0; 

      //draw from the next card 
      setNAME = iter[i].SET_NAME; 
      setNum = iter[i].SET_NUM; 
      quantity++; 

      //loop to look for similar cards 
      for (int x = i+1; x < main_deck_size; x++) 
      { 
       if (iter2[x].SET_NAME == setNAME && iter2[x].SET_NUM == setNum) 
       { 
        quantity++; 
       } 
      } 

      outFile << setNAME << " " << setNum << " " << quantity << "\n"; 

      if(setNAME == "LOB-EN") 
      { 
       //removing this line causes the program to work 
       processed.push_back(LOB[setNum]); 
      } 
     } 
    } 
} 

Удаления строки, где я пытаюсь поместить объект в дек и программа работает без ошибок, за исключением того, что он пишет одни и те же карты несколько раз, которые я хочу обрабатывать файл с количеством для каждой карты, а не кратным, появляющимся на разных строках. Я уже проверял другие вопросы, которые возникли из-за попытки использовать std :: deque :: pop_front/back на пустом deque. Но я вообще не называю pop_front/back.

Любые идеи о том, что может вызвать ошибку?

+0

LOB [setNum] a Тип карты? –

+0

LOB - это массив карт, объявленных во всем мире. setNum - это элемент массива, соответствующий конкретной карте. –

+0

Когда вы создали обработанный файл в это время обработанный deque был пуст, поэтому обработчик был установлен в null и остался нулевым даже после того, как вы поместили объекты в обработанный deque. Так что создайте обработанный_тератор, когда есть один объект в обработанном deque –

ответ

1

Любое использование processed.push_back(LOB[setNum]); может быть аннулировано processed_iter.

В первом раунде в цикле, когда processed начинается пустым, аннулирование более или менее гарантировано.

+0

О, я вижу, я думал, так как я фактически не изменял, где обработанный указатель указывал, что он всегда указывает на начало. Повторное указание его на начало обработки в начале каждого цикла передачи решило проблему. Спасибо! Я думал, что это могло быть что-то вроде обработанного.size(), возвращающего странное значение, но не был уверен, как это исправить. –