如何将上升ID参数应用于数千种多种模块类型



假设我有一个简单的模块ClientClient.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的副作用是使用indexparentIndex的问题。

在上面的情况下,应该意识到,使用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,允许我访问每个模块的此信息。

最新更新