Omnet++, будет выброшено исключение cRuntimeError

В настоящее время я использую Omnet ++ и veins, и у меня внезапно появляется эта ошибка времени выполнения, и я не могу понять ее, чтобы правильно исправить.

Ошибка в модуле (TraCIDemoRSU11p) RSUExampleScenario.rsu[0].appl (id = 8) в событии № 6180, t = 53.956510612297: массив размером 220 проиндексирован на 220. TRAPPING в исключении выше из-за отладки при ошибках =правильный вариант конфигурации. Ваш отладчик готов?

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

cplusplus {{
#include "veins/modules/messages/WaveShortMessage_m.h"

}}
class WaveShortMessage;


message DelayedFromControllerMessage extends WaveShortMessage {
    string vehiclesList [220] ;

}

Я использую omnet++ версии: 5.0 и Veins 4.4.

Отредактировано, я использую массив в этих местах:

1-

void TraCIDemoRSU11p::sendDelayedMessage(std::list<const char *> vehicleList) {
    sentDelayedMessage = true;
    //vehicleList = {};
    t_channel channel = dataOnSch ? type_SCH : type_CCH;
    DelayedFromControllerMessage* dsm = prepareDelayedSM("delayed",dataLengthBits, channel, dataPriority, -1,2,vehicleList);

    std::list<const char *>::iterator it = vehicleList.begin();
    //const char * v;
    char* vx = new char [100];
    vx[0] = '\0';
    for(int i=0; i<vehicleList.size(); i++){
        //v =*it;
        strcpy(vx,*it);
        //vx = *it;
        ++it;
        dsm->setVehiclesList(i, vx);
     }
    if (sendDelayedEvt->isScheduled()) {
        cancelAndDelete(sendDelayedEvt);
    }else {
        delete sendDelayedEvt;
    }
    sendDelayedEvt = new cMessage("delayed evt", SEND_DELAYED_EVT); // create event object to use it in timing

    simtime_t offSet = dblrand() * (par("beaconInterval").doubleValue());
    TimeStart = simTime() + offSet;
    scheduleAt(TimeStart, sendDelayedEvt);
    sendDelayedSM(dsm);

}

2-

DelayedFromControllerMessage*  BaseWaveApplLayer:: prepareDelayedSM(const char * name, int lengthBits, t_channel channel, int priority, int rcvId,int serial,std::list<const char *>vehicleList ) {
    DelayedFromControllerMessage* dsm =       new DelayedFromControllerMessage(name);

    dsm->addBitLength(headerLength);
    dsm->addBitLength(lengthBits);

    switch (channel) {
        case type_SCH: dsm->setChannelNumber(Channels::SCH1); break; //will be rewritten at Mac1609_4 to actual Service Channel. This is just so no controlInfo is needed
        case type_CCH: dsm->setChannelNumber(Channels::CCH); break;
    }

    dsm->setPsid(0);
    dsm->setPriority(priority);
    dsm->setWsmVersion(1);
    dsm->setTimestamp(simTime());
    dsm->setSenderAddress(myId);
    dsm->setRecipientAddress(rcvId);
    dsm->setSenderPos(curPosition);
    dsm->setSerial(serial);



    std::list<const char *>::iterator it = vehicleList.begin();
    const char * v;

       for(int i=0; i<vehicleList.size(); i++){
           v =*it;
           ++it;
           VLvar1.push_back(v);
           dsm->setVehiclesList(i, v);
       }



    if ((std::string)name == "beacon") {
        DBG << "Creating Beacon with Priority " << priority << " at Applayer at " << dsm->getTimestamp() << std::endl;
    }
    if ((std::string)name == "delayed") {
        DBG << "Creating Data with Priority " << priority << " at Applayer at " << dsm->getTimestamp() << std::endl;
    }

    return dsm;
}

3-

void MyTraCIDemo11p::onDataDelayed(DelayedFromControllerMessage* dsm) {
    int x = 0;
    std::string vehichleId = mobility->getExternalId();

        for (int i=0 ; i < dsm->getVehiclesListArraySize();i++)
        {
            vehicleList.push_back(std::string(dsm->getVehiclesList(i)));

        }


        ttry = std::find(vehicleList.begin(), vehicleList.end(), vehichleId);
        if (vehichleId == *ttry){
            x = 1;
        }


        if (state == QUEUING  && x == 1){
            findHost()->bubble("Received ");
             state = WAITING;
             stateToString(state);
        }
}

Сообщение должно быть отправлено от RSU к транспортным средствам.


person Hadeel A.    schedule 15.07.2018    source источник
comment
Где вы получаете доступ к массиву?   -  person Julian Heinovski    schedule 16.07.2018
comment
Ответ на этот вопрос?   -  person Julian Heinovski    schedule 22.07.2018
comment
нет еще не ответили. я попытался изменить функцию поиска в onDataDelayed и заменить ее циклом while и логической переменной, она все еще не была исправлена, и я все еще получаю те же ошибки. Я не мог ответить раньше, так как офтальмолог не разрешал мне использовать какие-либо экраны.   -  person Hadeel A.    schedule 28.08.2018


Ответы (3)


Даже не видя фактического кода из приложения (appl) или из файла конфигурации, который вы используете, я предполагаю, что вы пытаетесь получить последний элемент (элемент 220) из массива.

Сообщение об ошибке уже сообщает, в чем проблема. Ваш массив имеет размер 220, и вы пытаетесь использовать индекс 220, что невозможно, поскольку индексы массива начинаются с 0. Поэтому для адресации последнего элемента в вашем массиве вы должны использовать индекс 221.

person Julian Heinovski    schedule 16.07.2018
comment
Я не уверен, почему пытается получить к нему доступ, хотя у меня есть только несколько элементов в массиве, отправленном из RSU в автомобиль. Я добавил код, где используется массив. - person Hadeel A.; 16.07.2018
comment
Можно ли запустить компиляцию в режиме отладки (make MODE=debug) и запустить ./debug вместо ./run? Мне нравится знать, где происходит ошибка. До сих пор я не мог найти причину для этого. - person Julian Heinovski; 16.07.2018
comment
Я не уверен, как применить команду, которую вы просили меня сделать, чтобы показать вам ошибку при запуске кода. Я все еще новичок в использовании Omnet++. есть ли способ показать мне, где использовать эти команды при запуске вен или сказать мне, где найти аналог на самой IDE. извините за неудобства и спасибо за ваше время. - person Hadeel A.; 17.07.2018

Я не уверен, что это причина вашей ошибки:

ttry = std::find(vehicleList.begin(), vehicleList.end(), vehichleId);
    if (vehichleId == *ttry){
        x = 1;
    }

Но лучше написать так:

    if (std::find(vehicleList.begin(), vehicleList.end(), vehichleId) !=  vehicleList.end()){
        x = 1;
    }

Я не рекомендую ссылаться на итератор find (т. е. *ttry), если он не найден, это похоже на обращение к *(vehicleList.end()).

мне кажется, у вас есть две переменные veichleList, массив в dsm и еще одна, которая является вектором. это правильно? если да, вы должны убедиться, что veichleList.size() всегда меньше или равно 220.

Ознакомьтесь с этим руководством, чтобы узнать, как отладить проект в omnet++: https://docs.omnetpp.org/tutorials/tictoc/part2/

person Hamzah    schedule 18.07.2018
comment
Я попробовал ваше предложение, оно все еще выдавало мне ошибки. Я также сделал цикл while вместо функции поиска с логической переменной при поиске идентификатора автомобиля, и он все равно выдавал ту же ошибку. - person Hadeel A.; 28.08.2018

Итак, я нашел решение этой проблемы только сейчас.

это было сделано так:

cplusplus {{
#include "veins/modules/messages/WaveShortMessage_m.h"

}}
class WaveShortMessage;


message DelayedFromControllerMessage extends WaveShortMessage {
    string vehiclesList [] ;

}

=====

DelayedFromControllerMessage*  BaseWaveApplLayer:: prepareDelayedSM(const char * name, int lengthBits, t_channel channel, int priority, int rcvId,int serial,std::list<const char *>vehicleList ) {
DelayedFromControllerMessage* dsm =       new DelayedFromControllerMessage(name);

dsm->addBitLength(headerLength);
dsm->addBitLength(lengthBits);

switch (channel) {
    case type_SCH: dsm->setChannelNumber(Channels::SCH1); break; //will be rewritten at Mac1609_4 to actual Service Channel. This is just so no controlInfo is needed
    case type_CCH: dsm->setChannelNumber(Channels::CCH); break;
}

dsm->setPsid(0);
dsm->setPriority(priority);
dsm->setWsmVersion(1);
dsm->setTimestamp(simTime());
dsm->setSenderAddress(myId);
dsm->setRecipientAddress(rcvId);
dsm->setSenderPos(curPosition);
dsm->setSerial(serial);


int NS = 0;
std::list<const char *>::iterator itPD = vehicleList.begin();
const char * vPD;
int i0 = 0;
while(itPD != vehicleList.end()){
    vPD = *itPD;
    ++itPD;
    ++NS;
    dsm->setVehiclesListArraySize(NS);
    dsm->setVehiclesList(i0, vPD);
    ++i0;
    VLvar1.push_back(vPD);

}

if ((std::string)name == "beacon") {
    DBG << "Creating Beacon with Priority " << priority << " at Applayer at " << dsm->getTimestamp() << std::endl;
}
if ((std::string)name == "delayed") {
    DBG << "Creating Data with Priority " << priority << " at Applayer at " << dsm->getTimestamp() << std::endl;
}

return dsm;
}

Я убрал размер массива и поместил его с ручным счетчиком в BaseWaveApplLayer::prepareDelayedSM с помощью цикла while. Я думал о том, чтобы опубликовать решение, чтобы помочь другим, столкнувшимся с подобной проблемой. :)

person Hadeel A.    schedule 28.08.2018
comment
Здорово, что вы нашли решение, а также разместили его здесь. Пожалуйста, отметьте вопрос как решенный, отметив этот ответ как принятый. Это еще больше помогает другим. - person Julian Heinovski; 31.08.2018