Omnet ++ Возникает исключение cRuntimeError std :: length_error: basic_string :: _ M_create

поэтому я получаю эту ошибку, когда запускаю свой код

Error in module (TraCIDemoRSU11p) RSUExampleScenario.rsu[0].appl (id=8) at event #4000, t=45.40151998544: std::length_error: basic_string::_M_create. TRAPPING on the exception above, due to a debug-on-errors=true configuration option. Is your debugger ready?

он показывает, что у меня есть эта проблема в этой строке после нескольких циклов

 VehTD = *iteh2;

информируем вас, что я пытаюсь удалить из этого списка транспортных средств в другой список транспортных средств и удалить перемещенные элементы.

 std::list<std::pair<std::string,std::string>>::const_iterator iteh2 = waitingList.begin();
      for (std::list<std::pair<std::string,std::string>>::const_iterator iteh = waitingList.begin(); iteh != waitingList.end() && !waitingList.empty(); ){
          iteh2 = iteh;
          cout<<"Veh ID TF 1:";
          cout<<VehTD.first<<endl;
          cout<<VehTD.second<<endl;
          VehTD = *iteh2;
          cout<<"Veh ID TF 2:";
          cout<<VehTD.first<<endl;
          cout<<VehTD.second<<endl;
          CompareResult3 = Locks(Locked,VehTD.second);
          if (CompareResult3.second == 1 || CompareResult3.second == 2 ){
           //remove from waiting and add to crossing
              std::string ehk = "";
              simtime_t VehicleT = simTime();
              std::pair<std::pair<std::string, std::string>, simtime_t> VehicleWithTime;
              crossingList.push_back(VehTD);


              iteh2 = waitingList.erase(iteh2);
              }
              else{
                  ++iteh;
              }
       }
   }

Использую Oment ++ 5.0 и вены 4.4

Я попробовал и поймал эту функцию, и кажется, что исключение происходит ближе к концу списка.

Обновлять: У меня такой вывод:

WCounter 1
WCounter 2
Moving from waiting list Timer Function Exception
WCounter 1
WCounter 2
WCounter 3
Moving from waiting list Timer Function Exception
WCounter 1
WCounter 2
Moving from waiting list Timer Function Exception

WCounter - это переменная, показывающая, сколько раз она зацикливалась, прежде чем возникла исключительная ситуация в точке, описанной ранее.

по запросу я добавил функцию блокировки:

  std::pair<std::list<std::string>,int> TraCIDemoRSU11p::Locks(std::list<std::string> alreadyLocked, std::string laneNo){
    bool debugL;
    //create variables for the lanes for easier use
try{
      debugL = false;
      zero = "171270266#0_0";
      one = "171270266#0_1";
      two = "-171270025#1_0";
      three = "-171270025#1_1";
      four = "-171270266#1_0";
      five = "-171270266#1_1";
      six = "171270025#0_0";
      seven = "171270025#0_1";



      //create lists of locks

      Locks0 = Locks1 = Locks2 = Locks3 = Locks4 = Locks5 = Locks6 = Locks7 = RequestToLock = {};
      CounterOfSimilarLanes = 0;

      //set of 0 ,Locks0;
      Locks0.push_back(zero);
      Locks0.push_back(five);
      Locks0.push_back(seven);
      //set of 1 ,Locks1;
      Locks1.push_back(one);
      Locks1.push_back(three);
      Locks1.push_back(six);
      //set of 2 ,Locks2;
      Locks2.push_back(one);
      Locks2.push_back(two);
      Locks2.push_back(seven);
      //set of 3 ,Locks3;
      Locks3.push_back(zero);
      Locks3.push_back(three);
      Locks3.push_back(five);
      //set of 4 ,Locks4;
      Locks4.push_back(one);
      Locks4.push_back(three);
      Locks4.push_back(four);
      //set of 5 ,Locks5;
      Locks5.push_back(two);
      Locks5.push_back(five);
      Locks5.push_back(seven);
      //set of 6 ,Locks6;
      Locks6.push_back(three);
      Locks6.push_back(five);
      Locks6.push_back(six);
      //set of 7 ,Locks7;
      Locks7.push_back(one);
      Locks7.push_back(four);
      Locks7.push_back(seven);
      //This is the request to lock from the vehicle using its lane number
      if (laneNo == zero ){
          RequestToLock.insert(RequestToLock.end(),Locks0.begin(),Locks0.end());
      }else if (laneNo == one){
          RequestToLock.insert(RequestToLock.end(),Locks1.begin(),Locks1.end()) ;
      }else if (laneNo == two){
          RequestToLock.insert(RequestToLock.end(),Locks2.begin(),Locks2.end()) ;
      }else if (laneNo == three){
          RequestToLock.insert(RequestToLock.end(),Locks3.begin(),Locks3.end()) ;
      }else if (laneNo == four){
          RequestToLock.insert(RequestToLock.end(),Locks4.begin(),Locks4.end()) ;
      }else if (laneNo == five){
          RequestToLock.insert(RequestToLock.end(),Locks5.begin(),Locks5.end()) ;
      }else if (laneNo == six){
          RequestToLock.insert(RequestToLock.end(),Locks6.begin(),Locks6.end()) ;
      }else if (laneNo == seven){
          RequestToLock.insert(RequestToLock.end(),Locks7.begin(),Locks7.end()) ;
      }

}   //if the already locked from the controller is empty so we take the requested lock
catch(const std::exception &e){
    cout<<"Preparing Locks Algorithm Exception"<<endl;
}
try{
    if (alreadyLocked.empty()){

          markOfLocks = 0;
          alreadyLocked.insert(alreadyLocked.end(),RequestToLock.begin(),RequestToLock.end()) ;
          Locked.insert(Locked.end(),RequestToLock.begin(),RequestToLock.end()) ;
          if (debugL == true){
              cout<<"First Lock in the locking algorithm"<<endl;
            //  dumplistLock(Locked);
          }
          ReturnOfLocks = make_pair(alreadyLocked,markOfLocks);

      }else{ // if the already locked by the controller isnt empty, so we need to compare the request with it
          //Search for similar items in the 2 lists
          for(std::list<std::string>::/*const_*/iterator it_1 = alreadyLocked.begin();it_1 != alreadyLocked.end();)
          {
              for(std::list<std::string>::/*const_*/iterator it_2 = RequestToLock.begin(); it_2 != RequestToLock.end();)
              {
                  if (*it_1 == *it_2)
                  {
                      ++CounterOfSimilarLanes;
                  }

                  ++it_2;

              }
                  ++it_1;
          }


          if (RequestToLock == alreadyLocked){
              markOfLocks = 1;
              Locked.clear();
              Locked = {};
              Locked.insert(Locked.end(),alreadyLocked.begin(),alreadyLocked.end()) ;
              if (debugL == true){
                  cout<<"Same Lane"<<endl;
                  dumplistLock(Locked);
              }
              ReturnOfLocks = make_pair(alreadyLocked,markOfLocks);

          }else if (CounterOfSimilarLanes == 0){ //if the request is concurrent meaning totally different locks
              markOfLocks = 2;
              //alreadyLocked.insert(alreadyLocked.end(),RequestToLock.begin(),RequestToLock.end()) ;
              Locked.clear();
              Locked = {};
              Locked.insert(Locked.end(),alreadyLocked.begin(),alreadyLocked.end()) ;
              if (debugL == true){
                  cout<<"Concurrent Lane"<<endl;
                  dumplistLock(Locked);
              }

          }else if (CounterOfSimilarLanes == 1  ||  CounterOfSimilarLanes == 2){ // if there's a similarity is 1 lock at least so it leads to conflict
              markOfLocks = 3;
              Locked.clear();
              Locked = {};
              Locked.insert(Locked.end(),alreadyLocked.begin(),alreadyLocked.end()) ;
              if (debugL == true){
                  cout<< "opposite Lane"<<endl;
                  dumplistLock(Locked);
              }
              ReturnOfLocks = make_pair(alreadyLocked,markOfLocks);
          }else{
              markOfLocks = 1;
              Locked.clear();
              Locked.insert(Locked.end(),alreadyLocked.begin(),alreadyLocked.end()) ;
              if (debugL == true){
                  cout<<"default case"<<endl;
                  dumplistLock(Locked);
              }
              ReturnOfLocks = make_pair(alreadyLocked,markOfLocks);
         }

      }
}catch(const std::exception &e){
    cout<<"Lock Cases Exceptions"<<endl;
}

try{
      return ReturnOfLocks;
}catch(const std::exception &e){
    cout<<"No Return of Locks in Locks Alg Exception"<<endl;
}

}

Что такое декларация VehTD?

Jerzy D. 20.09.2018 12:10

это std :: pair <std :: string, std :: string> VehTD;

Hadeel A. 20.09.2018 12:17

Это MCVE. У меня проблема с самой петлей, и не более того. Результат сравнения и функция блокировки - это то, что заставляет меня решить, собираюсь ли я удалить элемент или нет, а функция блокировки работает отлично.

Hadeel A. 22.09.2018 18:45

Это вообще не MCVE, потому что у вас есть целые функции, типы и классы, которые вы используете в коде, но никогда не показываете объявление. Особенно подозрительным является Locks(); если он "отлично работает", то у вас не должно возникнуть проблем с тем, чтобы показать людям, на которые вы хотите ответить, верно? Может только казаться работать нормально, но вызывать некоторое неопределенное поведение, которое проявляется только позже. Последствия и причины не всегда сопровождают друг друга на таком языке, как C++, где неопределенное поведение является чем-то особенным.

underscore_d 22.09.2018 19:19

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

Hadeel A. 22.09.2018 19:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
666
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны использовать iterator вместо const_iterator, потому что вы изменяете (т. Е. Удаляете) указанный элемент. Кстати, в коде iteh2 не нужен - достаточно iteh, а также переменные VehicleT и ehk не используются и могут быть удалены.

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

Hadeel A. 20.09.2018 14:50

после генерации другого сценария он показал мне следующее: Нет доступного источника для "wcstok_s () at 0x75eba934". Программа получила сигнал SIGSEGV, ошибка сегментации. 0x75eba934 в wcstok_s () из C: \ WINDOWS \ System32 \ msvcrt.dll, что это должно означать?

Hadeel A. 20.09.2018 14:58

Вы забыли упомянуть, как любой из этих пунктов относится к проблеме в вопросе ... Это кажется хорошими моментами, которые послужили бы хорошим комментарием, но я не понимаю, как они составляют ответ.

underscore_d 22.09.2018 19:16

@underscore_d: Я переписал свой ответ. Я подозреваю, что использование const_iteratror может быть проблемой, но я не могу воспроизвести ошибку из вопроса, потому что представленный код не содержит всех переменных и методов.

Jerzy D. 23.09.2018 16:10
const_iterator предотвращает только разыменование ссылки не-const и изменение элемента; он (больше, после исправления дефекта Standard) не предотвращает вызов функций-членов, таких как .erase(), которые фактически не изменяют и не переназначают элементы (просто уничтожают их). См. этот ответ / ветка. Итак, я не понимаю, как использование const_iterator здесь может быть проблемой, и на самом деле стилистически и для безопасности лучше, если пользователь действительно не хочет изменять элементы во время цикла.
underscore_d 23.09.2018 17:41
Ответ принят как подходящий

поэтому я изменил цикл for на цикл while, и он не показывал исключения, и не знаю почему.

поэтому цикл теперь выглядит так:

     //while loop instead.
   std::list<std::pair<std::string,std::string>>::iterator iterwil = waitingList.begin();
   std::pair<std::string, std::string> Vehwil ;
   while (iterwil != waitingList.end()){
       Vehwil = *iterwil;
       CompareResult3 = Locks(Locked,Vehwil.second);
       if (CompareResult3.second == 1 || CompareResult3.second == 2 ){
           crossingList.push_back(Vehwil);
           waitingList.erase(iterwil++);
       }else{
           ++iterwil;
       }

   }

если у кого-то есть веская причина просветить меня, почему цикл while работает без исключений, в отличие от цикла for, это было бы здорово. ^^ "

Это совсем другой код, а не только смена циклов. Ваш исходный код, вероятно, не работал, потому что по какой-то неизвестной причине вы работали с двумя итераторами, которые, по-видимому, должны были быть копиями друг друга, но на самом деле вы сравнивали iteh с end, но только увеличивали iteh2, так что цикл for будет никогда не завершались, что (просто предположение; я не буду анализировать поток) могло привести к бесконечному количеству push_back() и состоянию нехватки памяти. В любом случае исходный код никогда не заработал.

underscore_d 23.09.2018 17:46

Другие вопросы по теме