首页 > 解决方案 > 如何将升序 ID 参数应用于数千种模块类型

问题描述

假设我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参数比最后一个实例大一。

标签: omnet++

解决方案


volatileclientId声明中删除Client.ned,您的解决方案将正常工作。
使用的主要目的volatile是保证在多次读取时返回参数的“新鲜”值。在您的网络中,clientId是恒定的,因此volatile没有必要。using 的副作用是 using和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() 

推荐阅读