1

私はこのモジュール階層を使用しています:

Node: {udpApp[0]<->udp<->networkLayer->wlan[0]} and wlan[0]: {CNPCBeacon<->mac<->radio}

udpApp のいくつかの ini パラメータを次のように使用: udpApp の ini ファイルにいくつかの初期パラメータを次のように指定しました。

**.host*.numUdpApps = 2
**.host*.udpApp[0].typename = "UDPBasicApp" 
**.host*.udpApp[0].destAddresses = "gw1"
**.host*.udpApp[0].startTime = 1.32s
**.host*.udpApp[0].stopTime = 1.48s

しかし、実行時に CNPCBeacon モジュールを介して udpAPP[0] の startTime と stopTime を変更したいと考えています。

したがって、CNPCBeacon.ccを次のように変更しました:-

cModule* parentmod = getParentModule();
cModule* grantParentmod = parentmod->getParentModule();
cModule* udpmod = grantParentmod->getSubmodule("udpApp",0);
double varHoldingStartTime = udpmod->par("startTime").doubleValue();
double varGoldingStopTime = udpmod->par("stopTime").doubleValue();
varHoldingStartTime = SIMTIME_DBL(4.2);
varGoldingStopTime = SIMTIME_DBL(4.5);
udpmod->par("startTime").setDoubleValue(varHoldingStartTime);
udpmod->par("stopTime").setDoubleValue(varGoldingStopTime);
EV<<"New start and stop time is "<<udpmod->par("startTime").str()<<"\t"<<udpmod->par("stopTime").str()<<endl;`

パラメータを正常に変更します。udpApp[0]ただし、モジュールを再度開始することはありません。したがって、このモジュールの動的キャストを次のように使用しようとします。

UDPBasicApp* udpBasicMod = dynamic_cast<UDPBasicApp*>(udpmod);
sendTimer = new cMessage("sendTimer");
scheduleAt(iniSchduleTime, sendTimer);

そして、次のエラーが発生しました:-

モジュール (CNPCBeacon) BSoneNode.gw1.wlan[0].CNPCBeacon (id=23) のエラー #1496、t=4: モジュール (UDPBasicApp)BSoneNode.gw1.udpApp[0] の scheduleAt() がコンテキストで呼び出されましたモジュールの (CNPCBeacon)BSoneNode.gw1.wlan[0].CNPCBeacon: 後者のモジュールから呼び出されるメソッドには、Enter_Method() または Enter_Method_Silent()? がありません。

他のサブモジュールを介してモジュールをインスタンス化する他の方法もありますか?

このヘルプをありがとう。

4

2 に答える 2

0

モジュールとサブモジュール間の階層と関係について少し迷っていますが、モジュールを動的に作成 (または再作成) したい場合は、OMNeT++ によって提案された組み込みのアプローチを使用できると思います: https:/ /omnetpp.org/doc/omnetpp/manual/usman.html#sec186

パラメータ値を(再)定義したら、ワンライナーを直接使用できます。

cModuleType *moduleType = cModuleType::get("foo.nodes.WirelessNode");
cModule *mod = moduleType->createScheduleInit("node", this);

一方、エラーメッセージは次のように不平を言っています:Enter_Method()および/またはEnter_Method_Silent()

X::get()これらのマクロは、別のモジュール内からモジュール (例) の関数を呼び出そうとする場合に使用する必要があります。

Y::doSmthWithXsGet()
{
    x->get();
}

これを機能させるにはEnter_Method()(またはEnter_Method_Silent()) を先頭に記述する必要があります。X::get()

X::get()
{
    Enter_Method();
    /* rest of the code */
}

OMNeT++ ユーザーマンのDirect Method Callsセクションを読んで、それが何を意味するかを確認できます。


scheduleAt()奇妙なことは、基本的な OMNeT++ クラスに属するメソッドであるメソッドに対してこのエラーが発生していることですcSimpleModule。つまり、クラスでこのメソッドを使用するにはcSimpleModule、クラス定義で継承する必要があります。

多分単に次のようなことをしています:

class MyCurrentClass: public cSimpleModule
{
    /* further class definition */
};

... 問題を解決できます。

于 2015-06-09T12:01:40.807 に答える