Я использую модуль 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");
}
}