Variablennamen dynamisch machen?



  • Hallo,

    ich habe einen Datentyp-Pointer. Beispielsweise

    Datentyp* test = Funktion_mit_Pointer_Rueckgabe(...);

    Funktionsaufruf_x();

    Jetzt geht Funktionsaufruf_x() hin, und vearbeitet alle jemals erstellten Objekte vom Datentyp "Datentyp". Mein Problem ist aber, dass aufgrund der Laufzeitumgebung ich das ganze dynamisch gestalten muss. Beispielsweise so

    For-Schleife{
    Datentyp* DynamischerName = Funktion_mit_Pointer_Rueckgabe(...);
    }
    Funktionsaufruf_x();

    Wie schaffe ich es, einen Variablennamen dynamisch zu erstellen? Geht sowas überhaupt? Oder habt ihr eventuell einen anderen Ansatz? Danke und bye 🙂



  • Also den NAMEN eines Types kannst du nicht dynamisch erstellen.

    Aber du kannst Objkete dynamisch erzeugen mit new/delete. Und ev. wäre da noch etwas Polymorphie angebracht. Weiss jetzt aber nicht, ob dir das was sagt..



  • DonnerCobra schrieb:

    Mein Problem ist aber, dass aufgrund der Laufzeitumgebung ich das ganze dynamisch gestalten muss.

    Wie meinst du das mit der Laufzeitumgebung?

    Wie schaffe ich es, einen Variablennamen dynamisch zu erstellen? Geht sowas überhaupt? Oder habt ihr eventuell einen anderen Ansatz? Danke und bye 🙂

    Es geht nicht. Es kann schon allein deshalb nicht gehen, weil die Variablennamen im compilierten ausführbaren Programm überhaupt nicht mehr auftauchen (Sonderfälle wie Debuginformationen mal außen vor).
    Man müsste jetzt wissen, wozu du das brauchst, um einen alternativen Vorschlag machen zu können. Meistens läuft es wohl auf Arrays oder Maps hinaus, aber ich weiß wie gesagt nicht, was du mit Laufzeitumgebung meinst.



  • Hi! Beispielsweise kann ich während der Laufzeitumgebung in ein Textfeld Namen eingeben, und zwar so

    ErsterEintrag;30
    ZweiterEintrag;50

    Jetzt zieht der jeder Zeile das erste Wort heraus (hier also ErsterEintrag und ZweiterEintrag) und belegt diese Variablen mit den dahinterstehenden Zahlen.

    Diese können aber nur mittels des "Datentyps" übermittelt werden. Danach werden sie von einer Funktion vearbeitet. Da ich nicht weiß, wieviele Einträge der User macht, müsste ich das dynamisch machen.

    Danke



  • dann mit einer Map.

    #include <map>
    #include <string>
    
    using std::string;
    using std::map;
    map<string, int> meineMap;
    
    string s = "ZweiterEintrag";
    meineMap[s] = 20;
    meineMap["VierterEintrag"] = 40;
    ...
    cout << meineMap[s];
    


  • #define NAMELEN 64
    struct Textfeld
    {
        char name[NAMELEN+1];
        double wert;
    }
    
    // main
    
    struct Textfeld* ptf;
    [code]
    // Pseudo code
    Solange Daten eingegeben werden, erzeuge eine neue
    Struktur und speichere sie mit dem neuen Inhalt.
    [/code]
    

    Für das Speichern der Struktur gibt es mehrere Möglichkeiten. Verkettete Liste, Binäre Bäume, Vektoren, usw.



  • abv schrieb:

    #define NAMELEN 64
    ...struct Textfeld* ptf;
    ...
    

    ...

    😮 Ächz ... da ist aber jemand noch nicht wirklich bei C++ angekommen ....

    Gruß,

    Simon2.



  • sind strukturen in C++ nicht üblich ?



  • "struct Typ variable" zum definieren von Variablen von Strukturtypen ist in C++ nicht üblich. Defines als Konstanten sind in C++ nicht üblich.



  • Bashar schrieb:

    dann mit einer Map.

    #include <map>
    #include <string>
    
    using std::string;
    using std::map;
    map<string, int> meineMap;
    
    string s = "ZweiterEintrag";
    meineMap[s] = 20;
    meineMap["VierterEintrag"] = 40;
    ...
    cout << meineMap[s];
    

    Lesende Zugriffe auf Elemente in einer Map (vor allem, da der Threadersteller anscheinend den Key über Tastatureingaben generiert/abfragt) sollte man immer mit map.find(key) bewerkstelligen, da sonst sehr schnell unerwünscht neue Paare erzeugt werden, ohne das man das vielleicht möchte:

    #include <iostream>
    #include <map>
    #include <string>
    
    typedef std::map<std::string, int> IntMap;
    
    int getMapElem(const std::string& key, const IntMap& map)
    {
        IntMap::const_iterator iElem = map.find(key);
        if(iElem == map.end())
        {
            throw NotFoundExcetion();
        }
        return iElem->second;
    }
    
    int main()
    {
        IntMap map;
    
        map["aaa"] = 1;
        map["bbb"] = 2;
    
        try
        {
            //sicherer Zugriff, wirft exception
            std::cout << getMapElem("aaaa", map) << std::endl;
    
            //boese, erzeugt neues Schluessel/Wert-Paar mit default für den Wert
            //aber eigentlich soll auf "aaa" zugegriffen werden
            // (nur Beispiel, Schluessel wuerde normal vermutlich aus Variable
            // kommen, z.B. ueber cin eingelesen)
            std::cout << map["aaaa"] << std::endl;
        }
        catch(...)
        {
            std::cout << "Element nicht gefunden\n";
        }       
    
        return 0;
    }
    


  • Hi!

    Ich bedanke mich RECHTHERZLICH füre eure vielen Antworten. Dank an alle... Werde die Lösungsansätze jetzt mal ausprobieren 🙂

    merci *thumbsup*



  • DonnerCobra schrieb:

    *thumbsup*

    Da haben wir sogar ein Smiley für: 👍
    🙂


Anmelden zum Antworten