2017-06-20 7 views
0

Ich möchte den Omnet ++ basierten Container cQueue als Warteschlange mit Priorität verwenden.
Wie es in der API-Referenz und im Handbuch erläutert wird - Ich brauche es
wie folgt zu definieren:
cQueue queue("Name of queue", someCompareFunc)So implementieren Sie eine Warteschlange als Priorität Warteschlange in Omnet ++?

Wenn someCompareFunc vom Typ CompareFunc die durch OMNeT definiert ist als:
typedef int (*CompareFunc)(cObject *a, cObject *b);

Also wollte ich diese Vergleichsfunktion implementieren, schaffte es aber nicht, etwas zu schreiben, das kompiliert wird.
Ich gebe zu, dass ich seit einiger Zeit nicht mehr mit Funktionszeigern gearbeitet habe, aber nach einer kleinen Recherche glaube ich, dass ich einige Testcodes mit eclipse IDE (C++) verstehe und geschrieben habe.

Ich versuche, den Code unter simpleModule file.cc.
Also für jede Funktion deklariere ich in der Header-Datei auf die "reguläre Weise", in der .cc-Datei muss ich den Modulnamen mit "::" vor dem Namen der Funktion hinzufügen.
Also in meinem Header-Datei ich erklärte:
int compareByNodes (cObject *a, cObject *b);

Und in der .cc-Datei:

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

Mein erster Versuch die cQueue zu definieren war:

cQueue queue("job_Buffer",&compareByNodes); 

Aber ich erhielt Ein Kompilierungsfehler von: 'compareByNodes' wurde in diesem Bereich nicht deklariert.
Also dachte ich, es muss etwas mit dem 'JobScheduler ::' zu tun haben, der fehlt.
Der zweite Versuch war:

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

Diesmal meine Fehler waren:
„Mehrere Marker an dieser Linie
- in diesem Zusammenhang
- Umwandlung von‚int (Jobscheduler :: ) (omnetpp: : cObjects, omnetpp :: cObjects *)‘auf 'omnetpp :: compareFunc {aka int () (omnetpp :: cObjects, omnetpp :: cObjects *)} [-Wpmf-Konvertierungen]“

Das Hinzufügen von Klammern nach dem 'Und-Zeichen' hat ebenfalls nicht geholfen.

Es würde wirklich helfen, wenn ich diese Methode von Omnet verwenden könnte und ich denke, dass ich etwas vermisse, da es ein gut definiertes "Merkmal" der Software ist.
Ich habe auch versucht, diese Themen zu googlen, in der Google-Gruppen-Abschnitt gesucht, und habe keine Antworten gefunden.
Würde mich über jede Hilfe freuen

Antwort

1

Versuchen Sie, eine Vergleichsmethode als statisch zu deklarieren. Zum Beispiel:

//... 
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

Vielen Dank! Diese Lösung funktioniert. Ich brauchte auch die Queue global , da es von mehreren Funktionen verwendet wird.Also habe ich eine globale cQueue *, definiert und ihr 'new cQueue (" name ", method) innerhalb der Funktion initialize() zugewiesen. Ich hoffe, es wird funktionieren –

Verwandte Themen