Bibliotheken - DatenContainer



  • Hallo,
    ich möchte ein Programm schreiben, das mhrere Algorythmen berechnen kann,
    die ich aber noch nicht alle kenne und auch erst noch entwickelt werden. So
    dachte ich mir, mach das per Bibliotheken ( .dll , .so ) in denen jeweils
    der aktuelle Algorythmus eingeladen werden soll. Soweit sogut, das nächste
    Problem lies nicht lange auf sich warten, ich kenne nicht zwingend jetzt
    schon die Parameter bzw rückgabewerte der Berechnungen. So habe ich eine
    Abstrakte Klasse DatenContainer angelegt, die als Schnittstelle fungieren
    soll:

    class DatenContainer {
    public: virtual ~DatenContainer() {}
    };

    Alle Datenklassen erben nun von dieser.
    Die eingelesene Methode ist nach folgender Struktur aufgebaut:

    DatenContainer* calculate(DatenContainer& dac){}

    Da ich während der Programmierung der Bibliothek bereits weiss welche Daten
    ich fordere und auch brauche kann ich mit einem dynamic-cast mir alles
    passen zurechtlegen.
    Soweit so gut. Funktionier auch alles ( unter Windows ).

    Jetz mein Problem: das ganze muss auch auf Linux portabel sein, da schlägt
    aber jedes mal er cast fehl ( Rückgabe 0 ) und ich bekomme
    Speicherzugrifffehler.
    Frage: Hat irgend jemand eine Idee an was das liegen kann und wichtiger
    noch, wie kann ich es beheben, umgehen?

    Zur weiteren Info wenn ich testhalber eine Methode calculate mit Paramether
    einer Kopie einer Datenklasse nehme, habe ich die Daten. Also scheint das
    Problem irgendwie an der Referenz zu liegen. Leider kann ich mit einer Kopie
    von DatenContainer in der DLL auch nichts anfangen, weil ich dann kein
    downcast mehr machen kann, oder geht das irgendwie?

    Teile des Programms:
    class DatenContainer {

    public: virtual ~DatenContainer() {}

    };

    class Scheduler{

    typedef DatenContainer* (*rechenFunktion)(DatenContainer&);

    public:

    bool einlesen(char name[]);

    DatenContainer* calculate(DatenContainer&);

    private:

    rechenFunktion tempCalculate;

    }

    // hier wird QT verwendet, macht aber keinen Unterschied zu dlopen etc. nur
    brauche ich mir keine Gedanken machen unter welchen Betriebssystem ich bin
    und ich spare die Präprozessor abfragen ( desweiteren bekomme ich an anderen
    Stellen QT-Datentypen, so muss ich es sowieso einbinden). Der Fehler ist
    auch ohne QT da.

    bool Scheduler::einlesen(char name[]){

    QLibrary myLib(name);

    if ( myLib.isLibrary(name) || (!(name ==""))){

    if ( myLib.load()){

    this->tempCalculate = (rechenFunktion) QLibrary::resolve(name,"calculate");

    }

    }

    myLib.unload();

    }

    ---------------------------------------------------------------------

    // Kommunikationslinien und Netzwerkstruktur erben von DatenContainer und
    beinhalten dann Daten

    int main (int argc, char** argv) {

    Scheduler meinScheduler;

    DatenContainer* dacP;

    Netzwerkstruktur nwstr = ersteDatenEinlesen();

    bool eingelesen = false;

    eingelesen = meinScheduler.einlesen("d:/Algo1");

    dacP = meinScheduler.calculate(nwstr);

    eingelesen = meinScheduler.einlesen("d:/Algo2");

    dacP = meinScheduler.calculate(dacP);

    ...

    }

    ------------------------------------------------------------------

    Aus dem Header des Algos:

    extern "C" DatenContainer* calculate(DatenContainer&);

    .cpp:

    DatenContainer* calculate (DatenContainer& dac){

    Kommunikationslinien* ausgabeDLL = new Kommunikationslinien();

    DatenContainer* dacP;

    dacP = &dac;

    Netzwerkstruktur* nwstP;

    if(dynamic_cast<Netzwerkstruktur*>(dacP))

    nwstP = dynamic_cast<Netzwerkstruktur*>(dacP);

    // ... Berechnung ...

    return ausgabeDLL;

    }

    Ich hoffe die Ausschnitte reichen, ansonsten bitte nochmal melden.

    Gruss

    Jens Kammer


Anmelden zum Antworten