Расположение узлов в Omnet / Inet - PullRequest
0 голосов
/ 16 марта 2019

Я использую модуль LinearMobility из Inet в составном модуле, мне нужно прочитать положение узла для использования в коде .cc.Я искал ответы, и я наткнулся на этот код:

cModule *host = getContainingNode(this); 
IMobility *mobility = check_and_cast<IMobility *>(host->getSubmodule("mobility"));
... = mobility->getCurrentPosition();

Но, к сожалению, этот код выдает ошибку времени выполнения, вероятно, что-то не так с check_and_cast, потому что метод getCurrentPosition () для мобильности делаетне работа.(Я также попробовал dynamic_cast вместо check_and_cast, но код все равно выдает ошибку).Я получаю сообщение об ошибке:

20: 11: 54 **** Сборка релиза конфигурации для проекта copytic **** make MODE = release all copytic.cc В файле, включенном в copytic.cc: 5: В файл включен из C: / Users / Rmin / om / inet4 / src \ inet / mobility / contract / IMobility.h: 27: C: / Users / Rmin / om / inet4 / src \ inet / common / geometry/common/Coord.h:307:27: предупреждение: 'inet :: Coord :: str' переопределено inline;Атрибут 'dllimport' игнорируется [-Wignored-attribute] inline std :: string Coord :: str () const ^ В файле, включенном из copytic.cc:5: В файл, включенный из C: / Users / Rmin / om / inet4 / src\ inet / mobility / contract / IMobility.h: 28: C: / Users / Rmin / om / inet4 / src \ inet / common / geometry / common / EulerAngles.h: 77: 33: предупреждение: 'inet :: EulerAngles:: str 'переопределено inline;Атрибут 'dllimport' игнорируется [-Wignored-attribute] inline std :: string EulerAngles :: str () const ^ 2 сгенерированных предупреждений.token_m.cc Создание исполняемого файла: out / clang-release // copytic.exe out / clang-release // copytic.o :(. text [_ZN7omnetpp14check_and_castIPN4inet9IMobilityENS_7cModuleEEET_PT0 _] + 0x18): неопределенная ссылка на __imp__ZTIN4inet9IMobilityE' out/clang-release//copytic.o:(.rdata[_ZTIPN4inet9IMobilityE]+0x18): undefined reference to typeinfo для inet :: inob ::clang ++. exe: ошибка: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова) make: *** [Makefile: 102: out / clang-release // copytic.exe] Ошибка 1

20:12:13 Сборка завершена (потребовалось 18 с.781мс)

Я также сделал снимок из блока кода в моем исходном файле:

снимок экрана выше3 строки кода

Как видите, метод getCurrentPosition () не работает, и когда я комментирую 2-ю и 3-ю строки вышеупомянутых 3-х строк кода, моделирование выполняется безпроблемы.Это copytic.cc (copytic.cc используется только для проверки трехстрочного кода, чтобы получить положение узлов и не имеет каких-либо других целей):

    #include <string.h>
    #include <omnetpp.h>
    #include "token_m.h"
    #include "inet/mobility/contract/IMobility.h"


    using namespace omnetpp;
    using namespace std;
    using namespace inet;

class Txc1 : public cSimpleModule
{

public :
    simtime_t delay = 0.5 ;
    simtime_t delay2 = 0.5 ;
    simtime_t duration = 0.25 ;
    int maxnodes = 10 ;
    string x[10] = {"tic", "toc", "tic"} ;
    int numnodes = 2;
    int freenodeflag = 1;
    string successor ;
    string predecessor ;
    int inring = 0 ;
    string posx ;





protected:
    // The following redefined virtual function holds the algorithm.
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

// The module class needs to be registered with OMNeT++
Define_Module(Txc1);

void Txc1::initialize()
{

    WATCH(x[0]);
    WATCH(x[1]);
    WATCH(x[2]);
    WATCH(x[3]);
    WATCH(successor);
    WATCH(numnodes);
    WATCH(y);
    WATCH(posx);

        Token *msgt = new Token("tok");
        msgt->setRingorder(0, "tic");
        successor="toc";
        predecessor="toc";
        cModule *target = getModuleByPath("Tictoc1.toc");
        sendDirect(msgt, delay , duration , target , "radioIn");
        inring = 1 ;

}

void Txc1::handleMessage(cMessage *msg)
{

    cModule *host = getParentModule()->getSubmodule("tec")->getSubmodule("mobility");
    IMobility *mmobility = check_and_cast<IMobility *>(host);
    Coord pos = mmobility->getCurrentPosition();



        if (strcmp("tok", msg->getName()) == 0 ) {
                Token *inv1 = new Token("tok");
                Token *inv2 = new Token("tok");
                Token *inv3 = new Token("tok");
                cModule *targetinv1 = getModuleByPath("Tictoc1.tic");
                cModule *targetinv2 = getModuleByPath("Tictoc1.toc");
                cModule *targetinv3 = getModuleByPath("Tictoc1.tec");
                sendDirect(inv1, delay , duration , targetinv1 , "radioIn");
                sendDirect(inv2, delay , duration , targetinv2 , "radioIn");
                sendDirect(inv3, delay , duration , targetinv3 , "radioIn");
            }

    }
...