PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Header Datei dynamisch in Programm laden?



ufosworld
29-05-2007, 13:07
Hallo Experten,
bin immer noch über dem Projekt...
bin schon ziemlich vorangekommen.... er liesst dynamisch XML Datei aus, speichert die Werte in verketteten Listen ab und lädt auf Wunsch auch die .so Files in den Speicher und lässt mich darauf zugreifen.

Nun folgendes Problem:

Die Module sollen ja von angegebener Quelle (über die Parameter in der XML) Daten einlesen können.

Da aber die Quellen sich immer ändern können, sind die Werte die übergeben werden immer unterschiedlich in Typ und Reihenfolge.

jetzt dachte ich mir folgendes...
(siehe Skizze)

In der XML-Datei steht neben dem Modulname auch der zugehörige Header-Dateinamen in dem steht ein Struct der die Datensätze z.b. für das InputModul spezifiziert... (in Typ und Reihenfolge) und daraus eine verkettete Liste erzeugt... (im Modul)

am Modulende gebe ich einen Zeiger zurück der auf die verkettete Liste mit den Daten zeigt.

Da ich die Header Datei für die Übergabe des Zeigers auch im Framework benötige , aber diesen nicht fest oben einbinden kann (da es ja dynamisch bleiben soll), wollte ich fragen ob es eine Möglichkeit wie bei den Modulnamen gibt, die Headernamen dynamisch aus der XML File zu lesen(das stellt ja kein Problem dar) und dann (was viel wichtiger ist) während das Programm läuft die HeaderDatei im Framework einzubinden...

(hoffe ihr versteht was ich will...)

Ziel ist es das Framework nicht mehr ändern zu müssen ,
sondern nur
je Modul das nachträglich neu programmiert wird
+ die Header Datei mit der erwarteten Datenstruktur von der Schnittstelle,
+ die Moduldatei mit der jeweiligen Bearbeitungsroutine (Daten lesen,
bearbeiten, ausgeben)
und
+ die Parameter für die Header und Moduldatei in die XML File zu schreiben.

deswegen soll der Headerdateiname dynamisch in das Framwork eingebunden werden...

Oder hat jemand eine bessere Lösung ??
Wie gesagt.. das Framework soll nach Fertigstellung nicht für jeden Modulwechsel (in der XML-Datei) geändert werden
und das ganze soll auch für die Zukunft dynamisch erweiterbar sein in Bezug auf die Module...

mfg UFO

Boron
29-05-2007, 16:40
Header dynamisch einbinden?
Zur Laufzeit?
Oder eher zur Übersetzungszeit?
Mir rollen sich die Zehennägel auf!

Wenn ich so lese, was du vorhast, dann fallen mir da ein paar Stichworte ein:
- Interfaces
- Polymorphie
- Abstrakte Klassen
- das ganze objektorientierte Gedödels halt.

Dann kannst du in der XML-Datei mit Typnamen (Klassennamen?) arbeiten und zur Laufzeit anhand des Typs wie angegeben entscheiden, was du mit dem Objekt machen willst.

Das wäre mein naiver Ansatz. Ich könnte mir vorstellen, dass das noch eleganter geht.

anda_skoa
29-05-2007, 20:47
Boron hat Recht, am ehesten geht es mit einem Variant Datentyp, z.B. mit boost::any

http://www.boost.org/doc/html/any/s02.html

Ciao,
_

ufosworld
31-05-2007, 15:00
mhhh

gibt es vielleicht die Möglichkeit Daten in einer Funktion von einer Schnittstelle zu lesen. In dieser Funktion ist die Stuktur der Daten abgelegt.

z.b.

struct Tdaten
{
int zahl;
string name;
Tdaten* Next;
}
Tdaten* headP = NULL;

Darin werden nun Daten von der Schnittstelle gespeichert...
am Ende der ersten Funktion gebe ich den headP zurück an die Hauptfunktion... also die Adresse...

dann in der Hauptfunktion rufe ich eine andere Funktion in einer anderen S.O. Datei auf und übergeben diesen Zeiger an diese Funktion

Kann man das machen? OHNE das man den anderen Funktionen mitteilt wie die Stuktur aussieht?

Also ohne Header File...

bzw kann ich den struct in der ersten Funktion soo erzeugen das ich ihn nirgendwo anders mehr bekannt machen muss / einbinden muss ... also irgendwie global...

Ich will erreichen, das ich ohne das Hauptprogramm erneut zu kompilieren auf die Daten zugriff habe... d.h. das Hauptprogramm wird einmal erstellt und nacher kann ich dann Shared Objects erzeugen die jeweils andere Structs beinhalten... dies S.O. werden dem Hauptprogramm über eine XML Datei bekannt gemacht... das Hauptprogramm lädt die S.O. Dateien in den Speicher und führt die Funktionen darin nacheinander aus... bzw führt die Funktion in der ersten S.O. File aus , lädt die Daten von einer x-beliebigen Schnittstelle (die in der XML Datei angegeben ist). nach dem Einlesen und speichern der gelesenen Daten soll die Funktion in der zweiten S.O. Datei aufgerufen werden und die Daten die im ersten S.O. gelesen und gespeichert wurden, sollen nun verarbeitet werden.... die Verarbeitungsroutine bearbeitet die Daten, speichert diese wieder ab...
nun ruft das Hauptprogramm eine dritte S.O. datei auf... an diese werden nun die bearbeiteten und gespeicherten Daten gereicht. die Funktion in der dritten S.O. Datei sendet die Daten an eine Schnittstelle die wiederum in der XML Datei definiert wurde...

bisher habe ich folgendes gelöst..
- die XML Datei wird ausgelesen...
- die Daten aus der XML Datei werden gespeichert
- die Daten werden ausgewertet
- die jeweiligen S.O. Dateien werden mit dlopen geladen
- es können funktionen aufgerufen werden, die sich in den S.O. Dateien
befinden
- der Zugriff in den S.O. Dateien auf die Schnittstellendaten die in der XML
Datei stehen ist möglich...

Wie ihr seht wird das ganz eine Art Modulkette... wobei die Daten von S.O. zu S.O. weitergereicht werden....

Da ich nicht weiss welche Daten da irgendwann mal über die Schnittstellen reinkommen... und um welche Schnittstellen es sich handelt... erfolgt der Connect zu den Schnittstellen und das holen der Daten nur in der S.O. Datei... die dann in Zukunft von anderen Personen geschrieben werden sollen...

Meine Software bietet nur die Basis ...
- XML Datei Lesen (gelöst)
- S.O. Files in speicher laden (gelöst)
- Zugriff auf die Funktion in der S.O. Datei (gelöst)
+ Übergabe der Daten an die nächste S.O. File (nicht gelöst)

Ideen den letzten Punkt zu lösen??

mfg UFO

anda_skoa
31-05-2007, 15:56
Du kannst entweder immer die selbe Struktur verwenden, oder void* und dann in den Plugins auf gut Glück casten, oder void* und zusätzlich eine Typinformation basieren auf der dann gecastet wird, oder eben einen typsichern variante Container wie boost::any

Ciao,
_

ufosworld
01-06-2007, 09:30
ok hab mich mal zu dem Boost::any informiert...

wäre es dann möglich folgende verkettete Liste zu erzeugen??

#include <das ganze boost gedöhns>

typedef struct TAnyData
{
string Datenbezeichner;
string Datentyp;
boost::any daten;
TAnyData* Next;
};
TAnyData headA;

und hiermit auf einer Schnittstelle zu lauschen...
wenn dann was reinkommt... dann soll er das in die Liste speichern und einen neuen Knoten erzeugen...

dannach werden die Daten ausgewertet... sprich die daten Variable wird ausgewertet und der typ in Datentyp abgespeichert...
Datenbezeichner is nur soo nee Idee...
als je nachdem welche Infos halt pro Datensatz mit über die Schnittstelle gesendet werden...

übergeben wird dann nur der headA Zeiger an die Hauptfunktion zurück und dann an die das nächste Plugin das die Daten weiter verarbeitet...
den Struct pack ich in Header Datei und binde die in jedes Plugin-Modul ein

merci

anda_skoa
02-06-2007, 18:17
Du könntest auch eine std::list benutzen :)

Also quasi


typdef std::list<boost::any> AnyList;


Ciao,
_

ufosworld
04-06-2007, 12:22
hab jetzt
mal

#include <list>;
und

#include <boost/any.hpp>

in der Main:

// Include für std::list
#include <list>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::list<boost::any> many;


aber ausser geschätzen 500 Warnungen und einem Fehler erreiche ich nix...

hab das boost-Verzeichniss ins Programmunterverzeichnniss kopiert...

das ganze unter Linux 8.1

anbei die Fehlermeldung


from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/config/ctps.hpp:22:46: warning: "__BORLANDC__" is not defined
In file included from boost/any.hpp:17,
from main.cpp:36:
boost/type_traits/remove_reference.hpp:16:39: warning: "BOOST_MSVC" is not defined
In file included from boost/mpl/aux_/adl_barrier.hpp:17,
from boost/mpl/int_fwd.hpp:17,
from boost/mpl/int.hpp:17,
from boost/type_traits/detail/template_arity_spec.hpp:10,
from boost/type_traits/detail/type_trait_def.hpp:14,
from boost/type_traits/remove_reference.hpp:21,
from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/config/adl.hpp:29:62: warning: "BOOST_MSVC" is not defined
boost/mpl/aux_/config/adl.hpp:30:50: warning: "__BORLANDC__" is not defined
boost/mpl/aux_/config/adl.hpp:31:60: warning: "__DMC__" is not defined
boost/mpl/aux_/config/adl.hpp:32:64: warning: "__MWERKS__" is not defined
boost/mpl/aux_/config/adl.hpp:33:74: warning: "BOOST_INTEL_CXX_VERSION" is not defined
In file included from boost/mpl/aux_/nttp_decl.hpp:17,
from boost/mpl/int_fwd.hpp:18,
from boost/mpl/int.hpp:17,
from boost/type_traits/detail/template_arity_spec.hpp:10,
from boost/type_traits/detail/type_trait_def.hpp:14,
from boost/type_traits/remove_reference.hpp:21,
from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/config/nttp.hpp:35:43: warning: "BOOST_MSVC" is not defined
In file included from boost/mpl/aux_/integral_wrapper.hpp:17,
from boost/mpl/int.hpp:20,
from boost/type_traits/detail/template_arity_spec.hpp:10,
from boost/type_traits/detail/type_trait_def.hpp:14,
from boost/type_traits/remove_reference.hpp:21,
from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/static_cast.hpp:19:58: warning: "__BORLANDC__" is not defined
boost/mpl/aux_/static_cast.hpp:21:43: warning: "__MWERKS__" is not defined
In file included from boost/mpl/int.hpp:20,
from boost/type_traits/detail/template_arity_spec.hpp:10,
from boost/type_traits/detail/type_trait_def.hpp:14,
from boost/type_traits/remove_reference.hpp:21,
from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/integral_wrapper.hpp:33:46: warning: "__MWERKS__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:48:45: warning: "__EDG_VERSION__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:59:45: warning: "__EDG_VERSION__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:66:60: warning: "__BORLANDC__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:67:57: warning: "__IBMCPP__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:68:43: warning: "__HP_aCC" is not defined
In file included from boost/mpl/aux_/preprocessor/params.hpp:17,
from boost/type_traits/detail/template_arity_spec.hpp:12,
from boost/type_traits/detail/type_trait_def.hpp:14,
from boost/type_traits/remove_reference.hpp:21,
from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/config/preprocessor.hpp:20:50: warning: "__MWERKS__" is not defined
boost/mpl/aux_/config/preprocessor.hpp:21:65: warning: "__BORLANDC__" is not defined
boost/mpl/aux_/config/preprocessor.hpp:22:61: warning: "__IBMCPP__" is not defined
boost/mpl/aux_/config/preprocessor.hpp:34:56: warning: "__DMC__" is not defined
In file included from boost/type_traits/detail/template_arity_spec.hpp:14,
from boost/type_traits/detail/type_trait_def.hpp:14,
from boost/type_traits/remove_reference.hpp:21,
from boost/any.hpp:17,
from main.cpp:36:
boost/mpl/aux_/config/overload_resolution.hpp:21:50: warning: "__BORLANDC__" is not defined
boost/mpl/aux_/config/overload_resolution.hpp:22:49: warning: "__MWERKS__" is not defined
In file included from boost/type_traits/is_reference.hpp:24,
from boost/any.hpp:18,
from main.cpp:36:
boost/type_traits/config.hpp:29:44: warning: "__MWERKS__" is not defined
boost/type_traits/config.hpp:30:44: warning: "BOOST_MSVC" is not defined
boost/type_traits/config.hpp:32:43: warning: "__IBMCPP__" is not defined
boost/type_traits/config.hpp:33:61: warning: "__BORLANDC__" is not defined
boost/type_traits/config.hpp:35:57: warning: "__HP_aCC" is not defined
boost/type_traits/config.hpp:36:58: warning: "MPW_CPLUS" is not defined
boost/type_traits/config.hpp:37:60: warning: "__SUNPRO_CC" is not defined
boost/type_traits/config.hpp:70:42: warning: "__MWERKS__" is not defined
boost/type_traits/config.hpp:70:82: warning: "__IBMCPP__" is not defined
In file included from boost/mpl/integral_c.hpp:17,
from boost/type_traits/integral_constant.hpp:11,
from boost/type_traits/detail/bool_trait_def.hpp:15,
from boost/type_traits/is_reference.hpp:32,
from boost/any.hpp:18,
from main.cpp:36:
boost/mpl/integral_c_fwd.hpp:22:40: warning: "__HP_aCC" is not defined
In file included from boost/type_traits/integral_constant.hpp:11,
from boost/type_traits/detail/bool_trait_def.hpp:15,
from boost/type_traits/is_reference.hpp:32,
from boost/any.hpp:18,
from main.cpp:36:
boost/mpl/integral_c.hpp:22:40: warning: "__HP_aCC" is not defined
In file included from boost/mpl/integral_c.hpp:32,
from boost/type_traits/integral_constant.hpp:11,
from boost/type_traits/detail/bool_trait_def.hpp:15,
from boost/type_traits/is_reference.hpp:32,
from boost/any.hpp:18,
from main.cpp:36:
boost/mpl/aux_/integral_wrapper.hpp:48:45: warning: "__EDG_VERSION__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:59:45: warning: "__EDG_VERSION__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:66:60: warning: "__BORLANDC__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:67:57: warning: "__IBMCPP__" is not defined
boost/mpl/aux_/integral_wrapper.hpp:68:43: warning: "__HP_aCC" is not defined
In file included from boost/type_traits/integral_constant.hpp:11,
from boost/type_traits/detail/bool_trait_def.hpp:15,
from boost/type_traits/is_reference.hpp:32,
from boost/any.hpp:18,
from main.cpp:36:
boost/mpl/integral_c.hpp:36:45: warning: "__BORLANDC__" is not defined
In file included from boost/type_traits/detail/bool_trait_def.hpp:15,
from boost/type_traits/is_reference.hpp:32,
from boost/any.hpp:18,
from main.cpp:36:
boost/type_traits/integral_constant.hpp:27:40: warning: "BOOST_MSVC" is not defined
boost/type_traits/integral_constant.hpp:38:40: warning: "BOOST_MSVC" is not defined
In file included from boost/any.hpp:20,
from main.cpp:36:
boost/static_assert.hpp:94:45: warning: "__MWERKS__" is not defined
main.cpp: In function `void LoadLibrary(int)':
main.cpp:205: warning: invalid conversion from `void*' to `const
char*(*)(TModulK)'
main.cpp:220: warning: invalid conversion from `const char*' to `char*'
main.cpp:246: warning: invalid conversion from `void*' to `const
char*(*)(TModulK)'
main.cpp:259: warning: too many arguments for format
main.cpp:286: warning: invalid conversion from `void*' to `const
char*(*)(TModulK)'
main.cpp:300: warning: too many arguments for format
main.cpp: In function `int main(int, char**)':
main.cpp:415: warning: unused parameter `int argc'
/bin/sh ../libtool --silent --mode=link --tag=CXX g++ -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -O2 -O0 -g3 -Wall -fno-exceptions -fno-check-new -ldl -o projektxml readxmlfile.o deletefunc.o searchfunc.o outputfunc.o standardstructs.o inputfunc.o tinyxmlstr.o tinyxmlparser.o tinyxmlerror.o tinyxml.o main.o
main.o: In function `char const* boost::any_cast<char const*>(boost::any const&)':
/usr/usr/ready/ben/funktioniert/projektxml/projektxml/main.cpp:80: undefined reference to `boost::throw_exception(std::exception const&)'

in main Zeile 80 steht folgendes...

//********************************************
// Funktionen für Boost
//********************************************
77 void append_int(many & values, int value)
78 {
79 boost::any to_append = value;
80 values.push_back(to_append);
81 }

Der Code ist der Standardcode aus der Docu von Boostn zu boost::any

Wer kann mir eine lauffähige Demo geben... ?? Hab nämlich schon von anderer Seite gehört das die Docu zu boost ziemlich bescheiden ist.

mfg UFOSWORLD

anda_skoa
04-06-2007, 15:37
Da scheint der Kompiler die internen Boost Includes nicht richtig auflösen zu können.

Sieh mal nach, ob du die Include Verzeichnisse im Makefile richtig gesetzt hast, also so, dass "boost" ein direktes Unterverzeichnis von einem davon ist.

Eventuell muß man boost auch zuerst installieren.

Ciao,
_

ufosworld
05-06-2007, 13:26
und wo finde ich das in KDevelop 2.1.3 ??

wieso installieren, dachte ich kopier das nur in das Unterverzeihniss und dann include ich die benötigte Headerdatei


(nur soo nebenbei, ich habe KEINE Root Rechte an dem System)
mein Arbeitsverzechniss mit meinen Daten lautet

/usr/usr/ready/ben/

darin ist dann Ordner
work/projekt/ hier liegt die Projekt Datei für Kdevelop 2.1.3 drin und alles was Kdevelop so noch braucht bzw beim erzeugen des Projektes angelegt hat.

work/projekt/projekt/
in diesem Ordner ist die Main datei und alle anderen cpp Files

work/projekt/projekt/boost/
hier liegen die hpp Files von Boost und die Unterverzeichnisse drin

In der Getting startet Docu steht ja



It's important to note the following:

The path to the boost root directory (often /usr/local/boost_1_34_0) is sometimes referred to as $BOOST_ROOT in documentation and mailing lists .

To compile anything in Boost, you need a directory containing the boost/ subdirectory in your #include path.

Since all of Boost's header files have the .hpp extension, and live in the boost/ subdirectory of the boost root, your Boost #include directives will look like:

#include <boost/whatever.hpp>

heisst das ich muss das Boost Verzeichniss nochmal in ein Verzeichniss packen??

muss ich den BOOST_ROOT setzen??

jemand nee Idee??

merci

UFO

p.s. jetzt hab ich grad weitergelesen
sollte ich das hier mal machen??


5.1 Easy Build and Install
Issue the following commands in the shell (don't type $; that represents the shell's prompt):

$ cd path/to/boost_1_34_0
$ ./configure --help

Select your configuration options and invoke ./configure again without the --help option. Unless you have write permission in your system's /usr/local/ directory, you'll probably want to at least use

$ ./configure --prefix=path/to/installation/prefix

to install somewhere else. Also, consider using the --show-libraries and --with-libraries= options to limit the long wait you'll experience if you build everything. Finally,

$ make install

will leave Boost binaries in the lib/ subdirectory of your installation prefix. You will also find a copy of the Boost headers in the include/ subdirectory of the installation prefix, so you can henceforth use that directory as an #include path in place of the Boost root directory.

p.p.s. ach ja ... das ganze Boost sind ja dann doch über 3000 dateien... wäre es auch möglich nur die any.hpp in den Projektpfad mit aufzunehmen.. und diese dann einzubinden und eventl die , die man noch benötigt und praktisch eine minimalverion mit den nur benötigten files laufen lässt? Welchen wären das wenn ich nur den Datentyp Any haben möchte...??
Ein Kollege meinte als er sah das ich 34xx Dateien kopiere... "Ach du sch...."

anda_skoa
06-06-2007, 12:53
und wo finde ich das in KDevelop 2.1.3 ??


Ich schätze irgendwo in den Projektoptionen, oder im Automake Manager, bzw. QMake Manager (je nach Projekttyp)



wieso installieren, dachte ich kopier das nur in das Unterverzeihniss und dann include ich die benötigte Headerdatei


Vielleicht geht es, wenn du das boost Verzeichnis ins das src Verzeichnis verschiebst, also src/boost draus machst.

Ciao,
_

ufosworld
13-06-2007, 13:54
denke ich habe das boost nicht installiert, den teilweise geht es und teilweise nicht...

wenn ich boost verzeichniss in programmverzeichniss lege und dann
im Programm #include <boost/any.hpp> includiere..
kleines Progrämmchen dazu eintippe, mit Variable kurz unterschiedlich belegen

und dann in der Konsole das ganze mit

g++ -I /usr/usr/ready/ben/boosttest/ -Wall -o test test.cpp
kompiliere dann geht das.

wenn ich aber z.b. ein Beispiel probiere, das im Verzeichniss boost nochmal ein Unterverzeichniss hat.. (z.b. filesystem)

dann kommen fehlermeldungen.... weil er die Pfade nicht findet... obwohl sie existieren...

werde ich also boost mal als root mal installieren lassen müssen....

desweiteren suche ich grade noch ein schönes Beispiel zu


typedef std::list<boost::any> many;

hat jemand noch ein schönes, bzw bei mir läuft das aus dem tutorial nicht... liegt es daran, weil ich das boost noch nicht installiert habe... ?

ufosworld
14-06-2007, 10:17
Ok habe jetzt Boost installiert... dauerte 3 Stunden...

die erzeugten Dateien liegen in

/usr/local/lib

(619 MB !!!!)

Nun kann ich das Beispiel mit dem Filesystem mit folgendem Kommando in der Konsole kompilieren

g++ -I /usr/usr/ready/ben/funktioniert/boosttest/ -Wall -o second second.cpp -lboost_filesystem-gcc32

Hier befinde ich mich aktuelle im Verzeichniss
/usr/usr/ready/ben/funktioniert/boosttest/

ausserdem liegt das boost-Verzeichniss als unterverzeichniss zusätzlich mit drin... (dafür ist das -I .....)

Nun wollte ich das Beispiel in meinem Projekt einbinden... weil ich ja dann auch die Boost Dateien im Projekt nutzen will..

Nur weiss ich nicht wo ich den Parameter

-I /usr/usr/ready/ben/funktioniert/boosttest/
und
-lboost_filesystem-gcc32
in Kdevelop 3.1.2 reinschreiben soll...

Gibt es ausserdem die Möglichkeit das als LD_LIBRARY_PATH festzulegen??

in der Anleitung ist die Rede von einem $BOOST_ROOT oder soo...

kann mir da jemand weiterhelfen?

mfg UFOSWORLD