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 Datenint 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