Variable mit besonderem Namen generieren



  • Möchte folgende Variable Muster... erstellen und hoffe hier auf Hilfe.
    Ich habe 3 Varablen (cc,hh,ll), die jeweils Werte von 0 bis 9 annehmen können:
    Beispiel cc=3, hh=4, ll=5.
    Wie kann ich nun eine Variable erstellen, die den Namen Muster_3_4_5 trägt?
    Wie kann man prüfen, ob diese Variable bereits existiert?

    Bedanke mich im Vorraus

    mit Gruß

    hewi


  • Mod

    Exakt so wie du das beschreibst geht das nicht. Was willst du denn damit erreichen?

    Die Lösung für das was du machen willst ist sehr wahrscheinlich einer der folgenden Begriffe (zum Selbstnachlesen):

    1. STL-Container, insbesondere std::map und std::vector
    2. Arrays
    3. Templatespezialisierung


  • hewi schrieb:

    Wie kann ich nun eine Variable erstellen, die den Namen Muster_3_4_5 trägt?

    Garnicht.

    Wie kann man prüfen, ob diese Variable bereits existiert?

    Garnicht.

    Bedanke mich im v******

    Gern 😃



  • Wenns zur Compilezeit feststeht, könnte man mit dem Präprozessor da ganz eklige Dinge machen:

    #define VAR(NAME, N1, N2)  NAME ## _ ## N1 ## _ ## N2
    
    int VAR(Muster, 3, 4) = 2;
    

    Allerdings natürlich völlig sinnfrei. 😃



  • Im kompilierten Programm existieren keine Variablennamen mehr. Du kannst aber ein Struct bauen, das diesen Bezeichner als String speichert.



  • hewi schrieb:

    Wie kann ich nun eine Variable erstellen, die den Namen Muster_3_4_5 trägt?
    Wie kann man prüfen, ob diese Variable bereits existiert?

    int Muster_3_4_5;

    strg+f -> "Muster_3_4_5"

    🤡



  • hewi schrieb:

    ...

    Vielleicht beschreibst du lieber einmal, was das Ziel davon sein soll. Dann könnte man dir mit Sicherheit sinnvolle Alternativen nennen.



  • Hallo liebe Leute,
    zunächst mal vielen Dank für die rege Beteiligung. Das ist ein ein
    superaktives Forum.

    Zum Problem:
    Ich würde im Prinzip gern ein Array generieren mit 10 hoch 10
    (oder mehr) Elementen - das ist ein bisschen viel.
    Von den vielen Elementen werden nur etwa 8 Tausend mit Werten gefüllt.
    Es wäre daher evt. sinnvoll nur die gefüllten Variablen zu generieren.
    🙂

    mfg

    hewi



  • Wie? 😮

    Aber nur ein Array mit 8000 Werten zu erstellen ist wohl zu einfach? 😕


  • Administrator

    hewi schrieb:

    Es wäre daher evt. sinnvoll nur die gefüllten Variablen zu generieren.

    Ehm, ja, aber ... wieso brauchst du mehr Variablen, wenn du sie gar nicht benötigst? Und wieso erstellst du dir dann nicht ein Array mit 8'000 Elementen? Also bei mir herrscht nun völlige Verwirrung, was du tun willst ... 😕

    Grüssli



  • Edit: Ok, dann bleibt das 1010 unter uns. 🙂


  • Administrator

    Nexus schrieb:

    Edit: Ok, dann bleibt das 1010 unter uns. 🙂

    Dieser Off-Topic Beitrag muss nun noch sein:
    LoL, danke. Als ich auf "Absenden" gedrückt habe, ist es mir aufgefallen, Beitrag editieren geht aber zum Teil so lange, 44 Sekunden, aber der Nexus hat es natürlich gesehen, mist ... 😃 🤡

    Grüssli



  • @hewi: nimm eine map oder hash_map.

    std::map<int, int> m;
    m[1] = 123;
    m[100000] = 5;
    // ... 8000 werte an beliebigen positionen (mit beliebigen keys)
    
    int i = m[100000]; // holt die 5 wieder raus
    

    Als Key musst du dabei nicht einen Integer verwenden:

    std::map<boost::tuble<int, int, int>, int> m;
    m[boost::make_tuple(1, 2, 3)] = 123;
    m[boost::make_tuple(1000, 12, 10101013)] = 666;
    // ...
    

    (Als Wert kannst du natürlich auch nehmen was du willst (fast))



  • hewi schrieb:

    Ich würde im Prinzip gern ein Array generieren mit 10 hoch 10
    (oder mehr) Elementen - das ist ein bisschen viel.
    Von den vielen Elementen werden nur etwa 8 Tausend mit Werten gefüllt.

    Wenn ich es aber richtig sehe hast du eine Koordinatenangabe, und du hast du nur eine grobe Angabe dafür wie viele Plätze du tatsächlich brauchst.

    Es gibt mehrere mögliche Lösungsansätze, eine davon wäre die Verwendung einer Struktur mit den Koordinatenangaben und dem Wert (und dies dann beispielsweise in einen std::vector abzulegen). Ein anderer Wäre die Angaben voneinander zu trennen (Schlüssel [Koordinate] / Wert und std::map verwenden)...

    Einfaches Beispiel:

    #include <vector>
    
    struct Foo{
       int x;
       int y;
       int z;
       int value;
    
       Foo(int x=0, int y=0, int z=0, int value=0)
       : x(x), y(y), z(z), value(value)
       {}
    };
    
    int main()
    {
      std::vector<Foo> foos;
      foos.reserve(10000); // Wenn du weißt, wieviele Elemente ca. zu erwarten sind.
    
      foos.push_back(Foo(0,0,1,4));
      foos.push_back(Foo(0,1,3,8));
      foos.push_back(Foo(1,1,2,12));
      foos.push_back(Foo(2,1,1,16));
      foos.push_back(Foo(3,3,3,20));
      //...
    }
    

    Die Struktur braucht zwar mehr Speicher als nur ein Wert, aber mit Sicherheit ist bei dir 8000 x Strukturgröße geringer als 10^10 x Wertgröße.



  • hustbaer schrieb:

    @hewi: nimm eine map oder hash_map.

    Aber aufpassen:

    int i = m[100000]; // holt die 5 wieder raus
    

    Falls hier der Eintrag an der Position 100000 nicht existiert, wird dieser angelegt! (über find usw. lässt sich dies aber vermeiden).



  • Also:
    Es wird ca. 8000 verschiedene Elemente geben.
    Die Eigenschaften sollen anhand Ihrer Indize charakterisiert werden.
    Falls ich also die Eigenschaft anhand des Namens angeben könnte würden
    folgende Variablen entstehen:
    Muster_3_4_5.... bzw. Muster_x_y_z... abhängig von den Ergebnissen, die
    sich beim Programmablauf ergeben und die Variablen cc, hh, ll... (s. oben)
    bestimmen.

    Aber wenn ich es richtig verstanden habe, kann man die Namen einer
    Variablen (Muster_x_y_z...) nicht durch den Progrmmablauf bestimen?

    mfg

    hewi



  • asc schrieb:

    hustbaer schrieb:

    @hewi: nimm eine map oder hash_map.

    Aber aufpassen:

    int i = m[100000]; // holt die 5 wieder raus
    

    Falls hier der Eintrag an der Position 100000 nicht existiert, wird dieser angelegt! (über find usw. lässt sich dies aber vermeiden).

    Jo ich weiss 🙂



  • hewi schrieb:

    blub

    Ja. Verwende bitte eine map. Hab ich schon geschrieben. Aber erklärs ruhig noch 2x, ich schreib dir dann noch 2x dasselbe, ne?

    Aber wenn ich es richtig verstanden habe, kann man die Namen einer
    Variablen (Muster_x_y_z...) nicht durch den Progrmmablauf bestimen?

    Wow, da hast du jetzt garnicht lange gebraucht um das zu überzuckern.



  • Sorry, habe den letzten Beitrag geschrieben und die aktuellsten Beiträge noch nicht gehabt.
    Leider bin ich kein Programmierer und weiß daher im Moment noch nicht was ein
    map oder hush_map ist.
    Läuft der Vorschlag von asc mit dem Vector auf was anderes hinaus?
    Kann man vorher abprüfen, ob das Element schon angelegt ist.

    Vielen Dank für Eure Mühe

    mfg

    hewi


  • Administrator

    hewi schrieb:

    Leider bin ich kein Programmierer und weiß daher im Moment noch nicht was ein
    map oder hush_map ist.

    http://www.cplusplus.com/reference/stl/map/

    Allerdings solltest du in jedem vernünftigen C++ Buch davon erfahren, weil es Teil der Standardbibliothek von C++ ist.

    hewi schrieb:

    Kann man vorher abprüfen, ob das Element schon angelegt ist.

    Mit:
    http://www.cplusplus.com/reference/stl/map/count/

    Oder:
    http://www.cplusplus.com/reference/stl/map/find/

    Mit der hash_map aus dem TR1 von C++ habe ich noch nicht gearbeitet und da kenn ich auch keine Referenz dazu.

    Für allgemeine Erklärungen was eine Map oder Hashmap ist, kann man Wikipedia konsultieren. Eine Map ist meistens als Baum implementiert:
    http://de.wikipedia.org/wiki/Baum_(Graphentheorie)

    Eine Hashmap heisst auf Deutsch meistens Hashtabelle:
    http://de.wikipedia.org/wiki/Hashtabelle

    Grüssli


Anmelden zum Antworten