【发布时间】:2021-01-29 02:12:58
【问题描述】:
我正在尝试创建一个结构并使用 send() 命令将其数据发送到应用程序/MAC 层。现在我面临的问题是 send() 只允许 cMessage 对象/指针作为参数。这是一个使项目停滞不前的问题。
到目前为止我尝试过的事情是:
- 继承自cMessage(但是如何处理数组?)
- 重载 HandleCommand 函数,但 send() 再次不允许发送数组。
任何帮助将不胜感激。谢谢!
【问题讨论】:
我正在尝试创建一个结构并使用 send() 命令将其数据发送到应用程序/MAC 层。现在我面临的问题是 send() 只允许 cMessage 对象/指针作为参数。这是一个使项目停滞不前的问题。
到目前为止我尝试过的事情是:
任何帮助将不胜感激。谢谢!
【问题讨论】:
在OMNeT++ 中可以定义自己的消息。该定义可以使用嵌入类型(int、double、string、...)以及自己的类型。
假设您要发送在Foo.h 中定义的Foo 的实例:
// Foo.h
#ifndef _FOO_H
#define _FOO_H
class Foo {
public:
int x;
};
#endif
您应该创建一个带有.msg 扩展名的新文件,例如TestMsg.msg:
// TestMsg.msg
cplusplus {{
#include "Foo.h"
}}
class noncobject Foo;
message TestMsg {
Foo oneObject;
Foo tab[10]; // example of fixed-size array
}
构建项目后,将创建新的 C++ 文件(TestMsg_m.h 和 TestMsg_m.cc)。这些文件包含从cMessage 继承的TestMsg 类的定义。 TestMsg 类具有所有需要的 set 和 get 方法。
【讨论】:
OMNeT++ 中的消息定义中没有对向量的原生支持。但是您可以使用cplusplus 关键字并使用std::vector 声明自己的类型,例如:cplusplus {{ #include <vector> typedef std::vector<int> IntVector; }} 然后在消息中:IntVector vec;。
Foo.h 中的#ifndef 指令。现在我的答案已更新,Foo.h 包含 #ifndef - 它可以防止重新定义一个类。
class noncobject Foo; 线上收到错误Type declarations are not needed with imports, try invoking the message compiler in legacy (4.x) mode using the --msg4 option。但是,如果没有这条线,我仍然会得到unknown type 'Foo'。有什么建议么?我正在使用 OMNet++ 5.5。 OMNet++ 文档尚未更新。
这是对我有用的实现:
namespace inet;
struct NodeM
{
int type;
string description;
double coords[3];
};
// TODO generated message class
//
message Signal extends cMessage {
NodeM Result[500];
int sizeRes;
NodeM RedQ[500];
int sizeRed;
}
【讨论】: