поэтому я получаю эту ошибку, когда запускаю свой код
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;
}
}
это std :: pair <std :: string, std :: string> VehTD;
Это MCVE. У меня проблема с самой петлей, и не более того. Результат сравнения и функция блокировки - это то, что заставляет меня решить, собираюсь ли я удалить элемент или нет, а функция блокировки работает отлично.
Это вообще не MCVE, потому что у вас есть целые функции, типы и классы, которые вы используете в коде, но никогда не показываете объявление. Особенно подозрительным является Locks(); если он "отлично работает", то у вас не должно возникнуть проблем с тем, чтобы показать людям, на которые вы хотите ответить, верно? Может только казаться работать нормально, но вызывать некоторое неопределенное поведение, которое проявляется только позже. Последствия и причины не всегда сопровождают друг друга на таком языке, как C++, где неопределенное поведение является чем-то особенным.
Я добавил функцию блокировки в соответствии с вашим запросом, поэтому любезно сообщите мне, если есть проблема. Я использовал эту функцию в других местах, но, похоже, раньше она не вызывала проблем, поэтому я предположил, что она работает нормально.





Вы должны использовать iterator вместо const_iterator, потому что вы изменяете (т. Е. Удаляете) указанный элемент.
Кстати, в коде iteh2 не нужен - достаточно iteh, а также переменные VehicleT и ehk не используются и могут быть удалены.
я изменился, он все еще показывал мне ту же ошибку. Я создам другой сценарий сумо и попробую его, и прокомментирую, если проблема находится в том же месте или сгенерирована другим фрагментом кода, работающим одновременно с этим.
после генерации другого сценария он показал мне следующее: Нет доступного источника для "wcstok_s () at 0x75eba934". Программа получила сигнал SIGSEGV, ошибка сегментации. 0x75eba934 в wcstok_s () из C: \ WINDOWS \ System32 \ msvcrt.dll, что это должно означать?
Вы забыли упомянуть, как любой из этих пунктов относится к проблеме в вопросе ... Это кажется хорошими моментами, которые послужили бы хорошим комментарием, но я не понимаю, как они составляют ответ.
@underscore_d: Я переписал свой ответ. Я подозреваю, что использование const_iteratror может быть проблемой, но я не могу воспроизвести ошибку из вопроса, потому что представленный код не содержит всех переменных и методов.
const_iterator предотвращает только разыменование ссылки не-const и изменение элемента; он (больше, после исправления дефекта Standard) не предотвращает вызов функций-членов, таких как .erase(), которые фактически не изменяют и не переназначают элементы (просто уничтожают их). См. этот ответ / ветка. Итак, я не понимаю, как использование const_iterator здесь может быть проблемой, и на самом деле стилистически и для безопасности лучше, если пользователь действительно не хочет изменять элементы во время цикла.
поэтому я изменил цикл 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() и состоянию нехватки памяти. В любом случае исходный код никогда не заработал.
Что такое декларация
VehTD?