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

Omnet++ 如何将升序ID参数应用于数千种多模块类型,omnet++,Omnet++,假设我在Client.ned中定义了一个简单模块Client,以及两个子类简单模块: simple Client { parameters: volatile int clientId; } simple ClientA extends Client { } simple ClientB extends Client { } 现在我想做的是定义一个网络network,其中1000个ClientA实例和1000个client2实例作为其子模块。我希望每个实例化都有一

假设我在
Client.ned
中定义了一个简单模块
Client
,以及两个子类简单模块:

simple Client
{
    parameters:
        volatile int clientId;
}

simple ClientA extends Client
{
}

simple ClientB extends Client
{
} 
现在我想做的是定义一个网络
network
,其中1000个
ClientA
实例和1000个
client2
实例作为其子模块。我希望每个实例化都有一个比上一个大的
clientId
,也就是说,我希望
clientId
参数随着每个实例化而递增。例如,假设我们有以下
Network.ned
文件:

network Network
{
    submodules:
        clientA[1000]: ClientA {
            clientId = index;
        };
        clientB[1000]: ClientB {
            clientId = 1000 + index;
        } 
}

我要寻找的是一种通用方法,我们不知道要预先实例化的客户机数量,甚至不知道客户机子类的数量,只是如果有某种类型的实例化的
客户机
,它应该有一个
clientId
参数,该参数比上次实例化的参数大一个。

clientId
声明
Client.ned
中删除
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() 
编辑

当客户机数量未知时,可使用以下方法确定该数量:

**.clientA[*].clientId = index() 
**.clientB[*].clientId = sizeof(clientA) + index() 

由于OMNeT++的模拟器利用
getId()
getIndex()
getVectorSize()
、和
getParentModule()
为每个模块和子模块分配一个递增的ID,因此允许我访问每个模块的此信息

我知道现在不需要使用
volatile,
,但我正在寻找一种更通用的方法来分配
clientId
s。假设我不知道将有1000个
ClientA
实例,因此我不知道为
ClientB
实例分配
clientId
s时要包含的偏移量。我已经编辑了我的答案并包含了额外的线索。对,我熟悉
sizeof()
。我想这将是我最接近我想要的。