假设我有一个简单的模块Client
在Client.ned
中定义
simple Client
{
parameters:
volatile int clientId;
}
simple ClientA extends Client
{
}
simple ClientB extends Client
{
}
现在,我想做的是定义一个网络Network
,其中1000 ClientA
实例将1000 Client 2
实例作为其子模块。我希望每个实例化的clientId
比最后一个大,即我希望clientId
参数可以通过每个实例来上升。例如,假设我们有以下Network.ned
文件:
network Network
{
submodules:
clientA[1000]: ClientA {
clientId = index;
};
clientB[1000]: ClientB {
clientId = 1000 + index;
}
}
我正在寻找的是一种通用方法,我们不知道要事先实例化的客户端数量,甚至是客户端子类的数量,也就是说,如果有某种实例化的Client
,它应该具有比上一个实例化大的clientId
参数。
从 Client.ned
中的clientId
删除volatile
,您的解决方案将正常工作。
使用volatile
的主要目的是确保读取几次参数的"新鲜"值。在您的网络中,clientId
是恒定的,因此不需要volatile
。使用volatile
的副作用是使用index
和parentIndex
的问题。
在上面的情况下,应该意识到,使用omnetpp.ini
是控制模拟的一种非常方便的方法。例如,您的NED文件可能看起来像:
simple Client {
parameters:
int clientId;
}
simple ClientA extends Client { }
simple ClientB extends Client { }
network Network {
submodules:
clientA[1000]: ClientA;
clientB[1000]: ClientB;
}
可以在omnetpp.ini
中设置参数:
**.clientA[*].clientId = index()
**.clientB[*].clientId = 1000 + index()
编辑
当客户次数不知道时,可以使用sizeof((方法来确定此数字:
**.clientA[*].clientId = index()
**.clientB[*].clientId = sizeof(clientA) + index()
因为Omnet 的Simulator使用getId()
,getIndex()
,getVectorSize()
和getParentModule()
分配了每个模块和子模块的上升ID,允许我访问每个模块的此信息。