2017-06-20 8 views
0

Omnet ++ベースのコンテナcQueueを優先キューとして使用したいと考えています。 -
それはAPIを参照して、マニュアルで説明されたように、次のように私はそれを
を定義する必要があります
cQueue queue("Name of queue", someCompareFunc)Omnet ++の優先キューとしてcQueueを実装する方法は?

someCompareFuncとしてomnetによって定義されるタイプCompareFuncのものである:
typedef int (*CompareFunc)(cObject *a, cObject *b);

私はこの比較関数を実装したかったのですが、コンパイルするものを書くことはできませんでした。
私は少し時間をかけて関数ポインタでは動作しなかったことを認めますが、小さな研究の後、私は理解し、Eclipse IDE(C++)でいくつかのテストコードを書いたと思います。

私はこのコードをsimpleModule file.ccに書き込もうとしています。
したがって、私はヘッダファイルで "通常の方法"で宣言しています.ccファイルでは、関数名の前にモジュール名に "::"を追加する必要があります。
だから私は宣言した私のヘッダファイル内:
int compareByNodes (cObject *a, cObject *b);

との.ccファイルに:

cQueue queue("job_Buffer",&compareByNodes); 

しかし、私は受け取っ:

int JobScheduler::compareByNodes (cObject *a, cObject *b){ 
     return 1; 
    }; 

cQueueを定義するための私の最初の試みでしたコンパイルエラー: 'compareByNodes'はこのスコープで宣言されていません。
私は、それが行方不明の 'JobScheduler ::'と何か関係があると思った。
2回目の試行された:

CompareFunc tmp = (CompareFunc)&JobScheduler::compareByNodes; 
cQueue queue("job_Buffer",tmp); 

この時、私のエラーがあった。このラインで
「複数のマーカー
- この文脈の中
- 「int型(jobschedulerの:: )からの変換(omnetpp: :のcObject、omnetpp ::のcObject *)omnetpp」に ':: CompareFunc {別名INT() (omnetpp ::のcObject、omnetpp ::のcObject *)}' [-Wpmf-コンバージョン」

'アンパサンド'の後にかっこを追加しても問題ありませんでした。

私はOmnetのこの方法を使うことができれば本当に助けになると思います。それはソフトウェアの「機能」が明確に定義されているからです。
私はまた、これらの件名をgoogleにしようとしました、グーグルグループのセクションで検索し、何の答えも見つかりませんでした。
助けていただければ幸いです

答えて

1

静的な比較方法を宣言してください。 例:

//... 
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); 
    // ... 
} 
+0

ありがとうございます!この解決策は機能します。また、いくつかの機能で使用されているため、キューはグローバル にする必要がありました。そこで私はグローバルなcQueue *を定義し、initialize()関数の中で 'new cQueue(" name "、method)'に割り当てられた を定義しました。それがうまくいくことを願って –

関連する問題