如何在 Omnet++ 中将 cQueue 实现为优先级队列?
How to implement a cQueue as a priority Queue in Omnet++?
我想使用基于 Omnet++ 的容器 cQueue
作为优先队列。
正如 API 参考资料和手册中所解释的那样 - 我需要定义它
如下:
cQueue queue("Name of queue", someCompareFunc)
当 someCompareFunc
是 omnet 定义的 CompareFunc
类型时:
typedef int (*CompareFunc)(cObject *a, cObject *b);
所以,我想实现这个比较功能,但没能写出可以编译的东西。
我承认我有一段时间没有使用函数指针了,但是经过一些小的研究,我想我确实理解并且确实用 eclipse IDE (c++).
写了一些测试代码
我正在尝试在 simpleModule
file.cc 处编写代码。
因此,对于我在 "regular way" 中的头文件中声明的每个函数,在 .cc 文件中,我需要在函数名称前添加带有“::”的模块名称。
所以在我的头文件中我声明:
int compareByNodes (cObject *a, cObject *b);
并且在 .cc 文件中:
int JobScheduler::compareByNodes (cObject *a, cObject *b){
return 1;
};
我第一次尝试定义 cQueue 是:
cQueue queue("job_Buffer",&compareByNodes);
但我收到编译错误:'compareByNodes' 未在此范围内声明。
所以我认为它一定与缺少的 'JobScheduler::' 有关。
第二次尝试是:
CompareFunc tmp = (CompareFunc)&JobScheduler::compareByNodes;
cQueue queue("job_Buffer",tmp);
这次我的错误是:
"此行有多个标记
- 在这种情况下
- 从 'int (JobScheduler::)(omnetpp::cObject, omnetpp::cObject*)' 转换为 'omnetpp::CompareFunc {aka int ( )
(omnetpp::cObject, omnetpp::cObject*)}' [-Wpmf-转换]"
在 'ampersand' 之后添加括号也无济于事。
如果我可以使用 Omnet 的这种方法,那将非常有帮助,我想我遗漏了一些东西,因为它是一个定义明确的 "feature" 软件。
我也尝试 google 这些主题,在 google 组部分搜索,但没有找到任何答案。
非常感谢任何帮助
尝试将比较方法声明为静态的。
例如:
//...
class Txc1 : public cSimpleModule {
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
public:
static int MyCompareFunc (cObject *a, cObject *b);
};
Define_Module(Txc1);
int Txc1::MyCompareFunc (cObject *a, cObject *b) {
return 1;
}
void Txc1::initialize() {
cQueue q1("queue1", MyCompareFunc);
// ...
}
我想使用基于 Omnet++ 的容器 cQueue
作为优先队列。
正如 API 参考资料和手册中所解释的那样 - 我需要定义它
如下:
cQueue queue("Name of queue", someCompareFunc)
当 someCompareFunc
是 omnet 定义的 CompareFunc
类型时:
typedef int (*CompareFunc)(cObject *a, cObject *b);
所以,我想实现这个比较功能,但没能写出可以编译的东西。
我承认我有一段时间没有使用函数指针了,但是经过一些小的研究,我想我确实理解并且确实用 eclipse IDE (c++).
我正在尝试在 simpleModule
file.cc 处编写代码。
因此,对于我在 "regular way" 中的头文件中声明的每个函数,在 .cc 文件中,我需要在函数名称前添加带有“::”的模块名称。
所以在我的头文件中我声明:
int compareByNodes (cObject *a, cObject *b);
并且在 .cc 文件中:
int JobScheduler::compareByNodes (cObject *a, cObject *b){
return 1;
};
我第一次尝试定义 cQueue 是:
cQueue queue("job_Buffer",&compareByNodes);
但我收到编译错误:'compareByNodes' 未在此范围内声明。
所以我认为它一定与缺少的 'JobScheduler::' 有关。
第二次尝试是:
CompareFunc tmp = (CompareFunc)&JobScheduler::compareByNodes;
cQueue queue("job_Buffer",tmp);
这次我的错误是:
"此行有多个标记
- 在这种情况下
- 从 'int (JobScheduler::)(omnetpp::cObject, omnetpp::cObject*)' 转换为 'omnetpp::CompareFunc {aka int ( )
(omnetpp::cObject, omnetpp::cObject*)}' [-Wpmf-转换]"
在 'ampersand' 之后添加括号也无济于事。
如果我可以使用 Omnet 的这种方法,那将非常有帮助,我想我遗漏了一些东西,因为它是一个定义明确的 "feature" 软件。
我也尝试 google 这些主题,在 google 组部分搜索,但没有找到任何答案。
非常感谢任何帮助
尝试将比较方法声明为静态的。 例如:
//...
class Txc1 : public cSimpleModule {
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
public:
static int MyCompareFunc (cObject *a, cObject *b);
};
Define_Module(Txc1);
int Txc1::MyCompareFunc (cObject *a, cObject *b) {
return 1;
}
void Txc1::initialize() {
cQueue q1("queue1", MyCompareFunc);
// ...
}