Universelle Datenübergabe zwischen .so Files



  • Hi ich bin gerade an einem Projekt, bei dem ein Framework zur Verfügung gestellt werden soll, das den universellen Datenaustausch zwischen zwei verschiedenen Schnittstellen bewerkstelligt...

    das macht mein Programm schon:

    Es liest eine XML Datei mit Konfigurationsdaten aus (TinyXML)
    diese Konfigdaten bestehen aus
    Modulname (das Modul das geladen werden soll)
    Funktionsnamen im Modul
    Parameter für die Schnittstelle (z.b. IP-Adresse, usw...)
    diese Daten werden in eine verkettete Liste gespeichert..
    mit Hilfe der Modulnamen (die unter Linux .so dateinen sind)
    werden die Module dann in den Speicher geladen...
    das funzt auch... (mit dlopen und dlsym... usw...)
    der Aufruf der Funktionen funktioniert ebenfalls so das ich eine Funktion in der .so File aufrufen kann und diese haut dann auf Console "Halllo ich bin die Funktion raus..."

    soo nun folgendes Problem:

    in jedem Modul (Input, Work, Output)
    sollen bestimmte Dinge erledigt werden... also Input sollen z.b. Daten von einer Schnittstelle gelesen werden...
    im Work sollen die Daten dann verändert werden... und im Output an eine andere Schnittstelle rausgworfen werden...

    Nehmen wir nun an das Input Modul liesst eine Text Datei aus... (über Parameter in XML Datei angegeben...)
    speichert diese Daten dann ab und reicht diese an das Framwork zurück... das Framwork ruft nun das Work Modul auf und sendet die Daten vom Input-Modul mit... das Work Modul bearbeitet die Daten, speichert diese wieder ab und wieder zurück an das FW und dann an das Output Modul...

    Die Frage die sich nun stellt...
    wo speichere ich die Daten ab?
    in welcher Stuctur...
    Es ist weder bekannt wie die Daten aussehn noch was drin is...

    und da die unterschiedlichen Module verschieden hintereinander geschalten werden können ergibt sich ein weiteres Problem...

    nehmen wir an die Daten werden von einer TextDatei gelesen (also wieder Input Modul wie vorher... dann an ein Work Modul weitergegeben... dieses verändert die Daten aber jetzt nicht soo das sie einfach an eine andere Textdatei ausgeben werden können, sondern z.b. an eine Netzwerkschnittstelle
    (das Ansprechen der Schnittstellen wird jeweils in Input und OutputModul gecoded... das betrifft mich nicht... ich muss nur die Übergabe klar machen... das jedes Modul mit jedem über das Framework kommunizieren kann)

    Das Framework soll praktisch eine Basis darstellen in die beliebige Module hinterandere geschalten werden können.
    also z.b.

    Textfile -> Textfile to Ethernet -> Ethernet
    Ethernet -> Ethernet to RS232 -> RS232
    RS232-> RS232 to Textfile -> Textfile
    und noch viele viele weiter Schnittstellen... die ihr sicher nicht kennt...

    wie würdet ihr das Problem lösen...

    ich bräuchte einen Datentyp in den ich universell alles mögliche reinspeichern kann... und den ich dann fest in das Framework einbauen kann also Übergabeparameter zwischen den Modulaufrufen... weil das Framework soll ja nicht mehr verändert werden, aber die Module immer neu hinzukommen... und je nach wunsch über die XML Konfig Datei "hintereinandergeschaltet" werden

    und die hätten dann halt praktisch beim Input den selben Rückgabewert wie jedes Workmodul wiederum den selben Eingabewert hat... und wieder Rückgabewert beim Inputmodul und dann wieder Eingabewert beim Outputmodul...

    Ist das Problem verstanden?

    Irgend eine IDEE??
    MIT BEISPIEL?

    merci
    UFO



  • UFOSWORLD schrieb:

    ...
    ich bräuchte einen Datentyp in den ich universell alles mögliche reinspeichern kann
    ...

    hab die hälfte übersprungen
    aber so einen datentyp solltest du einfach als union modellieren
    in der MS welt gibts einen "VARIANT" typen, nach dem könntest du dich richten.

    würde in etwa so ausschauen.

    struct myVariant
    {
     enum EType {
      EInt,
      EDbl,
      EStr
     }
    
     union {
      int i;
      double d;
      string s;
     }     m_U;
     EType m_Type;
    
     myVariant& operator=(int i) { m_U.i = x; m_Type = EInt; return this; }
     myVariant& operator=(double d) { m_U.d = d; m_Type = EDbl; return this; }
     myVariant& operator=(string const& s) { m_U.s = s; m_Type = EStr; return this; }
    
    };
    


  • Nimm einen std::wstring.
    EDIT: habs jetzt nochmal etwas genauer gelesen, und ich denke ich hab dich zuerst falsch verstanden. Sieht so aus als ob du ein System für Byte-Streams und gewisse "Operatoren" basteln willst.
    Guck dir mal die CryptoPP an, die hat da ein recht nettes System.
    Natürlich müsstest du die ganzen Klassen über eine Factory erzeugen lassen, das sollte sich aber leicht machen lassen.



  • Hab jetzt von anderer Seite gehört ich soll doch folgendes verwenden

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

    hat mit dem std::list und vor allem mit dem boost::any schon jemand erfahrung gemacht??

    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::listboost::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

    p.s. zu Union hab ich nix gutes gehört , genauso wie zu void*


Anmelden zum Antworten