omnet++ - 如何将升序 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
参数比最后一个实例大一。
解决方案
volatile
从clientId
声明中删除Client.ned
,您的解决方案将正常工作。
使用的主要目的volatile
是保证在多次读取时返回参数的“新鲜”值。在您的网络中,clientId
是恒定的,因此volatile
没有必要。using 的副作用是 using和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()
推荐阅读
- php - 使用隐藏字段将表单字段标签传递给php是否很好?
- c# - 填充营地后的 WPF 操作
- wordpress - 当我可以在不同的托管文件上进行恢复时找不到 Wordpress 文件
- reactjs - 模拟点击 React with Enzyme 不做任何事情
- r - R中的coxph,beta受因子值的影响?
- java - 从 CloudFirestore 检索所有文档并显示在包含回收器视图的“片段”中
- spring-mybatis - 当我使用 mybatis 调用存储过程时,如何使返回的结果字符串不映射?
- database - 在 Rapidminer 中导出结果
- c++ - 在具有多个 y 轴的 Qt 图表中显示工具提示
- ajax - 完成结帐后购物车属性不可用