Erstelle Struct/Variabel abhänig von einer Zeichenkette (ohne Switch Case)



  • Deine Funktion liefert doch einen void-Pointer zurück.



  • subra schrieb:

    also um mein Anliegen genauer zu beschreiben.

    Ich möchte eine Funktion xyz aufrufen die als Übergabeparmeter eine Variabel von der Strucktur abc benötigt.

    Ist der Typ ("abc") erst zur Laufzeit bekannt?

    Ich rufe also meine Funktion getStruct (liefert void zeiger zurück) auf und übergebe ihr den Parameter "abc" als String.

    Wieso als String? Wieso nicht z.B. als Template-Parameter?

    Nun muss meine Funktion getStruct die Strucktur erstellen, mit Werten vorbelegen welche Sie aus einer Textdatei ausliest und sie mir als Zeiger zurück geben.

    Ja, soweit kein Problem, das geht immer noch schön mit std::map.
    Mit dem Löschen wird's dann halt problematisch wie schon gesagt.



  • hey,

    also es würde mir schon viel helfen wenn folgendes funktionieren würde:

    char vartyp[255] = "int";

    vartyp[255] abc;

    abc = 354; // Wert wir eig. aus Textdatei gelesen

    also er erstellt abhänig von dem Inhalt des String die Variabel abc vom Typ "int".

    Das würde natürlich ganz einfach gehen wenn ich den Inhalt des Strings mit int vergleiche (if).

    Das Problem ist jedoch das ich paar hundert Strucktypen habe und nicht für jede eine If Anweisung machen möche.



  • Das Klingt sehr nach Factories.



  • abc = 354;
    

    Für diese Zuweisung muss der Compiler allerdings wissen, welchen Code er generieren soll. Aus nem void-Pointer oder was auch immer, kann der Compiler zur Compile-Zeit nicht durch Kaffeesatzleserei erkennen, was da zur Laufzeit vorliegt.



  • ja das abc = 354; nicht funktioniert ist klar.

    Die definition der Strucktur liegt ja auch in meiner Textdatei ab genauso die Anzahl der Elemente der Strucktur...



  • Okay, dann mal Tacheles, was hast du in deiner Textdatei genau stehen und was willst du damit machen 😉



  • Du solltest mal wirklich genau dein Ziel beschreiben, sonst wird das hier weiterhin Rätselraten.

    Wo kommen die Daten her?
    Welche Art von Information ist in den Daten enthalten?
    Was willst mit den Daten machen?



  • ok dann beschreib ich mal den ganzen use case

    1. Es sind ca. verschiedenne 300 Struckturen irgendwo definiert
    2. In meiner Textdatei steht zum Beispiel unter anderem drin:
    /begin
    structest
    int x = 5
    char p = c
    strucandere <- Zeiger auf andere Strucktur
    /end

    3. Die Funktion bekommt als Parameter übergeben das Sie nun eine Strucktur vom Typ "structest" haben möchte. Den zurück gelieferten void zeiger cast ich dann passend.

    So nun muss die Funktion dynamisch ein Element der Strucktur "structest" erstellen. Woher Sie das weiß? Ich übergebe den Namen "structest" als String der Funktion.

    Ich könnte natürlich jetzt über if/ bzw. switch/case Anweisungen eine Selektierung vornehmen, jedoch macht das bei ca. 300 Struckturen mit einigen Komponenten kein Spaß und kostet viel Zeit.

    Wenn dann nun die Strucktur erstellt worden ist (keine Ahnung wie^^), muss er zeiger_structest->x = 5 machen. Und natürlich wird das x auch aus der Textliste gehollt und nicht hardcoded abgelegt. Somit währe meine Funktion super dynamisch...

    Alternativ kann ich natürlich auch die Funktion so defieren, das ich zuerst die Strucktur definiere, und dann den Zeiger der Strucktur meiner Funktion übergebe.
    Über typdef bekomme ich ja dann in meiner Funktion den Namen des Struckturtypes zurück.

    Aber wie kann ich dann auf die einzelnen Komponenten zugreifen, ohne zu wissen wie diese heisen.

    Gibt es die möglichkeit zu sagen, geh einfach zum nächsten Komponenten? Die Anzahl der Komponenten bekomme ich ja aus der Textdatei herraus.



  • It0101 schrieb:

    Wo kommen die Daten her?
    Welche Art von Information ist in den Daten enthalten?
    Was willst mit den Daten machen?

    Die Datei wird von mir geschrieben und ich lege die Definition der Datei fest. Später soll diese über ein GUI Programm geändert werden können.

    Was mit den Daten gemacht wird habe ich weiter oben beschrieben.



  • man kann das natürlich machen, aber das hat dann nix mehr mit struktur_x->y zu tun sondern eher mit root->GetStruktur( "x" )->FindValue( "y" ); und dann brauchst du in den zurückgegebenen Typen jede Menge Konversionscode von String zu Typ usw. usf.

    Was willst du denn mit deinen "Struckturen" machen, sobald sie mal aus der Datei gelesen wurden und mit den Daten daraus gefüllt wurden?



  • ich möchte die Strucktur dann einer Funktion übergeben bzw ich übergebe dann den Zeiger der Strucktur an eine Funktion...



  • Naja, ich weiß ja nicht... Man kann sicherlich binärkompatible "Struckturen" dynamisch im Speichern erzeugen (zumindest plattformabhängig)... Aber ich erkenn den Sinn nicht... man müsste dem "Strucktur"-Interpreter ja wieder eine Definition liefern, die im Quellcode sowieso schon vorhanden ist... Naja, mach du da mal mit deinen "Struckturen".



  • 😃



  • Wir sind hier ja bei C++ 😉 Mach aus Deinen Struckturen 😃 Klassen.
    Die ganzen Klassen sind von einer abstrakten Basisklasse abgeleitet.
    Jede Klasse bekommt eine statische Create-Methode, die ein Objekt der jeweiligen Klasse erzeugt und als Zeiger auf ein Basisklassen-Objekt zurückgibt.
    Diese Create-Methode registrierst Du z.B. in einer Map, als Schlüssel nimmst Du Deinen Struckt:D Namen.

    Einige Vorredner haben das Vorgehen auch schon vorgeschlagen, nur kürzer - Stichwort Fabrik oder Factory und Registrierung 😉



  • Nein, er hat ja hunderte von diesen Struckturen und will den Serialisierungs-Code nicht selber schreiben, zudem soll das was hinten bei rauskommt binärkompatibel zu den hunderten Struckturen sein, die in seinem Quelltext schon definiert sind!
    Klingt halt nach einem typischen dynamischen lowelevel Linux-Interpreter.



  • MichelRT schrieb:

    Wir sind hier ja bei C++ 😉 Mach aus Deinen Struckturen 😃 Klassen.
    Die ganzen Klassen sind von einer abstrakten Basisklasse abgeleitet.
    Jede Klasse bekommt eine statische Create-Methode, die ein Objekt der jeweiligen Klasse erzeugt und als Zeiger auf ein Basisklassen-Objekt zurückgibt.
    Diese Create-Methode registrierst Du z.B. in einer Map, als Schlüssel nimmst Du Deinen Struckt:D Namen.

    Einige Vorredner haben das Vorgehen auch schon vorgeschlagen, nur kürzer - Stichwort Fabrik oder Factory und Registrierung 😉

    Ja, genauso geht's.
    Ich möchte nur anmercken, daß er von den Struckturen nicht unbedinckt abrücken muß, denn sie können auch Methoden, Konstrucktoren, Destrucktoren und so haben, genau wie Cklassen.



  • Ansonsten halt auf Klaßen umsteigen 😉



  • Ich beende das hier ja nur ungern, musste vor allem bei den letzten Beiträgen fast laut loslachen, aber ihr seid ganz schön gemein.

    @Subra:
    Es heißt Struktur, nicht Strucktur, mit einfachem k, ohne c.

    Aber andererseits... vielleicht programmiert er ja in CK++, und da heißen die Dinger vielleicht struckt.



  • DocShoe schrieb:

    [...], aber ihr seid ganz schön gemein. [...]

    vielleicht programmiert er ja in CK++, und da heißen die Dinger vielleicht struckt.

    👍


Anmelden zum Antworten