Пользовательский модуль с использованием вен и омнет ++ - PullRequest
1 голос
/ 31 марта 2019

Я установил вены 4.7, и я прошел учебник.Все работает.Теперь я построил новый модуль, более похожий на DemoBaseApplLayer.Этот модуль наследуется от BaseAppLayer.В методе initialize я вызываю функцию dispatchMsg.что выглядит следующим образом:

На основе нескольких ответов я ввел cancelAndDelete (msg) в методе деструктор и финиш.Я также добавил метод delete (msg), но безрезультатно

dispatchMsg() {

//SignedBSMMessage sgndBSMMsg(location);
char* inputData = signedBSMMessage.CreateBSMMessage(to_CharPtr(this->curPosition.x),
                                                        to_CharPtr(this->curPosition.y),
                                                        to_CharPtr(this->curSpeed.z ),
                                                        to_CharPtr(this->curDirection.z));
cout << "Start dispatchMsg" << endl;

ObuSigndBSM obuSigndBSM("BasicSafetyMessage", 01);
obuSigndBSM.setSignedBsm(inputData);
obuSigndBSM.setMsgLength(signedBSMMessage.getLength());
Coord pos;
traci->getRoadMapPos(pos);
string laneId = std::to_string(pos.z);
obuSigndBSM.setLandId(laneId.c_str());

 bsmMessage=&obuSigndBSM;
this->sendDown(bsmMessage);
//delete bsmMessage;
cout << "End dispatchMsg" << endl;
EV_DEBUG << "BSMApp::dispatchMsg end " ;
delete(bsmMessage);

}

Однако я продолжаю получать это исключение:

Объект BasicSafetyMessage в настоящее время находится в (omnetpp :: cEventHeap)Имитация. scheduled-events, ее нельзя удалить.

Если эта ошибка происходит внутри omnetpp :: cEventHeap, ее необходимо изменить на вызов drop (), прежде чем он сможет удалить этот объект.

Если эта ошибка возникает внутри деструктора omnetpp :: cEventHeap, а базовое сообщение безопасности является членом класса,

omnetpp :: cEventHeap необходимо вызвать drop () в модуле - деструкторе in (Veins:: BSMApp) OBUScenerio.node [0] .appl (id = 7), при t = 1 с, событие # 2

что мне не хватает?Ваш добрый ответ будет оценен.

1 Ответ

0 голосов
/ 03 апреля 2019

После вызова this-> sendDown (bsmMessage) рассмотрим указатель, принадлежащий ядру моделирования OMNeT ++. Не вызывайте delete (bsmMessage) после вызова этого метода - в противном случае вы удалите событие (подумайте: вся информация о кадре, который вы хотите отправить), пока OMNeT ++ его доставляет.

Удалять только указатели на данные, которые вам дал OMNeT ++ (например, как событие для полученных данных), то есть в методе, который обрабатывает полученные кадры.

...