1

我正在使用这个模块层次结构:

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

我在ini文件中给出了一些初始参数udpAppas :

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

但是在运行时我想通过模块更改startTimeand stopTimefor 。因此,我更改为:-udpAPP[0]CNPCBeaconCNPCBeacon.cc

cModule* parentmod = getParentModule();
cModule* grantParentmod = parentmod->getParentModule();
cModule* udpmod;
for (cSubModIterator iter(*grantParentmod); !iter.end(); iter++)
{
    //EV<<"get the modulde "<< iter()->getFullName()<<endl;
    if (strcmp(iter()->getFullName(), "udpApp[0]") == 0)
    {
        udpmod = iter();
        break;
    }
}
cPar& startTime = udpmod->par("startTime");
cPar& stopTime = udpmod->par("stopTime");

而且我能够成功接收 和 的startTimestopTime。但是我想在当前模块中更改这些值,这会通过以下代码导致错误:

udpmod->par("startTime").setDoubleValue(4.2);

任何人都可以建议我在运行时更改它的方法。

4

1 回答 1

1

声明您的参数volatile应该可以解决您的问题。但为了将来参考,我将在下面提供进一步的解释


Volatile与非易失性

这取决于你想如何使用这个参数。主要通过.ini文件你有两种类型的参数:volatilenon-volatile.

volatile每次运行期间都会读取参数。如果您希望这个参数由一个内置函数生成,那将很有帮助,例如,uniform(0,10)每次这个 volatile 参数都会得到一个不同的值。

另一方面,non-volatile参数只读取一个,因为它们不会随着运行而改变。

使用volatile类型参数并没有给您充分的灵活性,因为您的参数值将始终落在.ini


动态变量(参数)重新分配:

相反,您可以做的是使用更强大的方法,并在每次必须这样做时重新定义存储该模块参数值的变量。

例如,在您的情况下,您可以执行以下操作:

varHoldingStartTime = par("startTime").doubleValue();
varHoldingStartTime = 4.2;

这样,实际值将在内部发生变化,而不会反映到您的运行中。


参数研究:

或者,如果您希望将此参数更改应用于多次运行,您可以使用 OMNeT++ 提供的高级内置方法,该方法允许您执行Parameter Studies

我在这里解释了参数研究的工作原理:https ://stackoverflow.com/a/30572095/4786271以及如何通过约束等实现它:https ://stackoverflow.com/a/29622426/4786271

如果我建议的方法都不适合您的情况,那么完全回答这个问题可能会解决您的问题:如何在 OMNeT++ 中模拟期间更改网络配置?


编辑:扩展答案以大致解释handleParameterChange()

我以前也没有使用handleParameterChange()过,但从我可以看出这个功能为使用它的模块提供了看门狗功能。

要首先激活此功能void handleParameterChange(const char *parameterName);,必须重新定义。

本质上,它似乎做的是以下内容:

假设我们有两个模块moduleAmoduleB并且moduleB有参数parBmoduleA更改parB并且当发生这种情况时,moduleB根据以下定义的行为对此更改做出反应:

moduleB::handleParameterChange(parB);

parB行为可能是从.ini等处重新读取原始值。

于 2015-06-08T19:27:06.857 回答