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()
。我想这将是我最接近我想要的。