Получение ошибки 139 при попытке доступа к карте (в HandleSelfMsg), но она работает при использовании в другой функции (onData)

Я работаю над фреймворком Veins, внутри OMNET ++. Я разрабатываю своего рода контролируемое наводнение в автомобильной сети. Я пытаюсь заставить автомобили отправлять данные только через 6 секунд (это значение можно изменить), поэтому я создал расписание при инициализации каждого транспортного средства (на TraCIDemo11p.cc), например:

if(sendData){ scheduleAt(simTime()+par("dataInterval").doubleValue(),sendDataEvt);}

На TraCIDemo11p.h я создал карту для буфера:

//Creating a map to represent the vehicle's message buffer
typedef map<string, WaveShortMessage*> MyMapContextMessageBuffer;
typedef pair<string, WaveShortMessage*> MyPairContextMessageBuffer;
MyMapContextMessageBuffer contextLocalMessageBuffer;

Поэтому с помощью функции onCata TraCIDemo11p.cc (WaveShortMessage * wsm) я делаю копию полученного сообщения, обновляю количество полученных сообщений, добавляю сообщение в буфер транспортного средства и распечатываю содержимое буфера, чтобы проверить, вставил ли я его. правильно:

//duplicating the message, so this vehicle has his own copy of the message
WaveShortMessage* wsmdup = wsm->dup();

//number of received messages
receivedMsgs++;

//add the msg in the  vehicle buffer, the GlobalMessageIdentification is the id of the message
contextLocalMessageBuffer.insert(MyPairContextMessageBuffer(wsmdup->getGlobalMessageIdentificaton(),wsmdup));

//accessing something in the ->second on the buffer, it works in this function
cout<<"Sender "<< contextLocalMessageBuffer.begin()->second->getSender()<<endl;

Затем в назначенное время вызывается SEND_DATA_EVT (handleSelfMsg) для отправки данных, но я получаю сообщение об ошибке, когда пытаюсь получить доступ к contextLocalMessageBuffer.begin () — секунда (или она-> секунда).

//handleSelfMsg(cMessage* msg)
case SEND_DATA_EVT

//if the vehicle has received a msg before
if(receivedMsgs != 0){
//and the buffer isn't empty, the function is able to verify if the buffer isnt empty
if(!contextLocalMessageBuffer.empty()){//if i try to access the begin->first it works
cout<<"GlobalMessageID "<<contextLocalMessageBuffer.begin()->first<<" ";
//but if I try to access the begin->second->getSource(), it doesn't works in this function (i get an Error 139), but works inside of onData
cout<<findHost()->getFullName()<<" messageID "<<contextLocalMessageBuffer.begin()->first<<" "<<contextLocalMessageBuffer.begin()->second->getSource()<<endl;

//if I remove those couts the iterator and the for works but the send doesn't (Error 139), because it is trying to access the it->second
map<string, WaveShortMessage*>::iterator it;
for(it = contextLocalMessageBuffer.begin(); it != contextLocalMessageBuffer.end(); it++){

send(it->second)
}
}
}
//create a new schedule to send data after a new interval
scheduleAt(simTime() + par("dataInterval").doubleValue(), sendDataEvt);

Итак, подведем итог, моя проблема в том, что я могу работать с моей картой (contextLocalMessagebuffer) внутри onData, но не могу получить к ней доступ должным образом в HandleSelfMsg, оба в одном и том же коде (TraCIDemo11p.cc). Obs: я попытался создать функцию, которая возвращает значение буфера, но функция не смогла получить доступ к буферу тоже.

Спасибо!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]