Dynamische Variable



  • Hallo, bin erst bei meinen Anfängen mit C++ und verzweifle gerade bei der Zuweisung einer dynamischen Variable. Folgendes:

    //global deklarierte Variablen
    short index;
    short DA4 = 50;
    short Num;
    
    //weiter im Code wird eine Eingabe abgefragt.
    cin >> index // index = 4;
    
    //hier möchte ich jetzt den Inhalt von DA4 übergeben
    Num = DA index  //hier komme ich nicht weiter, möchte das erreichen:
    //Num = DA4
    

    Hoffe, ihr versteht das Problem und kennt eine Lösung! Danke im Voraus! 👍


  • Mod

    Das kann man so nicht machen. An das was du vorhast kommt die Datenstruktur std::map sehr nah heran. Die würde ich dir aber noch nicht empfehlen, da sie für Anfänger doch recht komplex ist.

    Stattdessen gebe ich dir mal zwei Stichworte:
    std::vector: Ist sowas ähnliches wie std::map aber ein besserer Einstiegspunkt.
    Arrays: Die C-Variante von std::vector und auch in C++ vorhanden. Es ist wahrscheinlich noch einfacher für einen Anfänger überhaupt etwas mit Arrays als mit std::vector zu machen, aber dafür sind Arrays nicht gerade Anfängerfreundlich wenn es über die Grundlagen hinausgeht.

    edit: Und damit du mal einen Überblick hast, wie man dein Problem mit den unterschiedlichen Srukturen angehen würde, mal ein bisschen Code dazu:

    Variante mit std:🗺

    #include <iostream>
    #include <map>
    using namespace std;
    
    int main ()
    {
      map<int,int> mymap;   // Eine Map verbindet zwei Werte. Hier wollen wir ints mit anderen ints verbinden, dazu <int,int>
    
      mymap[4] = 50; // Jetzt verweist der int mit dem Wert 4 auf einen anderen int mit dem Wert 50
    
    int index;
    cin >> index;
    
     int num=mymap[index]   // Falls index==4, dann hat num jetzt den Wert 50, ansonsten wird num auf den Standardwert 0 gesetzt.
    
      return 0;
    }
    

    So würde man's mit std::vector machen:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main ()
    {
      vector<int> myvector;   // Ein Vector verbindet Indizes mit anderen Werten. Hier wollen wir, dass den Indizes int-Werte zugewiesen werden.  
    
    /* Der Vector ist am Anfang komplett leer. Normalerweise würde man jetzt beim Index 0 anfangen ihn zu befüllen. Wir können ihm aber auch direkt eine Größe geben: */
     myvector.resize(10); // Nun hat der Vector 10 Elemente, myvector[0] bis myvector[9]. Alle haben den Standardwert 0
    
      myvector[4] = 50; // Jetzt verweist der Index 4 auf einen int mit dem Wert 50
    
    int index;
    cin >> index;
    
     int num=myvector[index]  // Falls index==4, dann hat num jetzt den Wert 50, für andere index Werte zwischen 0 und 9 bekommt man num==0. Für Werte > 9 oder < 0 bekommst du undefiniertes Verhalten - in den meisten Fällen dürfte sich dies darin äußern, dass eine zufällige Zahl ausgegeben wird.
    
      return 0;
    }
    

    Und jetzt mit Arrays:

    #include <iostream>
    using namespace std;
    
    int main ()
    {
      int myarray[10];   // Ein Array ist einem Vektor recht ähnlich. Hier legen wird ein Array mit 10 int-Elementen angelegt. Was für einen Wert die Elemente haben ist jedoch nicht festgelegt. Derzeit sind es einfach zufällige Werte.
    
     myarray[4] = 50; // Jetzt verweist der Index 4 auf einen int mit dem Wert 50
    
    int index;
    cin >> index;
    
     int num=myarray[index]   // Falls index==4, dann hat num jetzt den Wert 50, für andere index Werte zwischen 0 und 9 bekommt man undefinierte Werte, weil den Indizes noch nichts zugewiesen wurde. Für Werte > 9 oder < 0 passiert ähnliches.
    
      return 0;
    }
    


  • Das ging ja schnell!

    Wollte nur wissen, ob es eine elegante und einfache Lösung gibt, anstatt durch switch alle Möglichkeiten zu überprüfen und das durch normale Zuweisung zu lösen. Möchte mich jetzt noch nicht auf schwere Themen stürzen.

    Danke vielmals!


  • Mod

    Argh 😡 , jetzt hast du meine erste Antwort schon gelesen, bevor ich meine Programmbeispiele in meinen Beitrag reineditiert hatte. Ich poste daher nochmal, damit du siehst, dass es in diesem Thread noch Informationen gibt, die du nicht gelesen hast.



  • Tut mir Leid, hätte ja nicht wissen können, dass du gerade noch editieren wolltest 🙄

    Elegant gelöst! Wenn man sich die Codes ansieht, sehe ich keine wesentlichen Unterschiede. Wie sieht es mit Speichernutzung aus? Die Array-Variante wird wohl am meisten Speicher beanspruchen, da der Compiler Platz für 10 Elemente reserviert.
    Die vector - Variante sieht nahezu identisch aus. Daher vermute ich, dass die map - Variante am wenigsten Speicher braucht, da nur bei einer Zuweisung eines Wertes (mymap[4] = 50;) auf den Speicher zugegriffen wird. Habe ich soweit recht?

    MfG, Dbof



  • Dbof schrieb:

    Tut mir Leid, hätte ja nicht wissen können, dass du gerade noch editieren wolltest 🙄

    Elegant gelöst! Wenn man sich die Codes ansieht, sehe ich keine wesentlichen Unterschiede. Wie sieht es mit Speichernutzung aus? Die Array-Variante wird wohl am meisten Speicher beanspruchen, da der Compiler Platz für 10 Elemente reserviert.
    Die vector - Variante sieht nahezu identisch aus. Daher vermute ich, dass die map - Variante am wenigsten Speicher braucht, da nur bei einer Zuweisung eines Wertes (mymap[4] = 50;) auf den Speicher zugegriffen wird. Habe ich soweit recht?

    MfG, Dbof

    Muss nicht heißen. Wie der Speicher intern allokiert wird, ist nicht gewiss, dazu kannst du im Standard mehr dazulesen.
    Wobei die Variante mit std::vecotr/std::map einfach eleganter ist, weil sie sich um das dynamische reservieren des speichern kümmert und du nicht explizit die größe des Containers angeben musst.



  • Muss nicht heißen. Wie der Speicher intern allokiert wird, ist nicht gewiss, dazu kannst du im Standard mehr dazulesen.
    Wobei die Variante mit std::vecotr/std::map einfach eleganter ist, weil sie sich um das dynamische reservieren des speichern kümmert und du nicht explizit die größe des Containers angeben musst.

    das heißt ja.
    wenn du einem Element ein anderes zuordnen willst -> std::map
    wenn du einen Haufen Elemente brauchst, die zwar nummeriert werden, deren Nummerierung aber irrelevant ist(Sprich keine Zuordnung, einfach ein Variablenahaufen) -> std::vector.



  • JustAnotherNoob schrieb:

    das heißt ja.

    Nein, heisst es nicht.

    Wie gesagt, kannst du über die Implementierung im Allgemeinen nichts sagen. Meistens benötigen Bäume als Datenstrukturen jedoch ein wenig mehr Overhead, da Zeiger gespeichert werden müssen, die bei dynamischen Arrays wegfallen.

    P.S.:

    JustAnotherNoob schrieb:

    wenn du einen Haufen Elemente brauchst, die zwar nummeriert werden, deren Nummerierung aber irrelevant ist(Sprich keine Zuordnung, einfach ein Variablenahaufen) -> std::vector.

    Warum nummeriert, aber irrelevante Nummerierung? Wenn man mehrere Indizes direkt aufeinanderfolgend hat, kann man gerade so gut std::vector einsetzen.



  • Hallo, bin erst bei meinen Anfängen mit C++

    ..Nexus' Gerede..

    Und jetzt nochmal eine geeignete Antwort.



  • JustAnotherNoob schrieb:

    Hallo, bin erst bei meinen Anfängen mit C++

    ..Nexus' Gerede..

    Und jetzt nochmal eine geeignete Antwort.

    Das finde ich ziemlich unverschämt von dir. Du scheinst leider nicht in der Lage zu sein, sachlich zu argumentieren.

    Was passt dir an meiner Antwort nicht? Ist es der Punkt, dass sie deine falsche Aussage korrigiert und die Thematik genauer erklärt? 🙄



  • JustAnotherNoob schrieb:

    wenn du einem Element ein anderes zuordnen willst -> std::map
    wenn du einen Haufen Elemente brauchst, die zwar nummeriert werden, deren Nummerierung aber irrelevant ist(Sprich keine Zuordnung, einfach ein Variablenahaufen) -> std::vector.

    Das ist Quark. Ein Vektor hat eine eindeutige Zuordnung der Elemente zu dem dazugehörenden Index. Sonst würde eine Sortierung eines Vektors keinen Sinn machen.



  • ich sage ja nicht, dass deine Einwände falsch sind, sondern nur didaktisch ungeeignet.

    das heißt ja.

    Nein, heisst es nicht.

    Wie gesagt, kannst du über die Implementierung im Allgemeinen nichts sagen. Meistens benötigen Bäume als Datenstrukturen jedoch ein wenig mehr Overhead, da Zeiger gespeichert werden müssen, die bei dynamischen Arrays wegfallen.

    ist mir schon klar, aber wenn du bedenkst, dass &vec[0] ein Array zurückgeben muss und dass nichts festgelegt ist, ist es sinnvoll davon auszugehen, dass sie sich so verhält, als sich auf ungarantierte Implementierungsdetails zu verlassen, die nicht fix sind. Oder habe ich da etwas falsch verstanden?

    Warum nummeriert, aber irrelevante Nummerierung? Wenn man mehrere Indizes direkt aufeinanderfolgend hat, kann man gerade so gut std::vector einsetzen.

    auch hier war es nur ein didaktischer Einwand, der Sinn einer map ist nunmal eine solche Zuordnung, der Sinn eines vectors nicht, dass es in manchen Fällen dennoch sinnvoll ist bestreite ich nicht, halte ich aber in dem Moment für irrellevant, die Ausnahme bringt vielleicht kostenlose Performance, aber keinen semantisch relevanten Unterschied.

    Das ist Quark. Ein Vektor hat eine eindeutige Zuordnung der Elemente zu dem dazugehörenden Index. Sonst würde eine Sortierung eines Vektors keinen Sinn machen.

    habe nie etwas anderes behauptet.



  • JustAnotherNoob schrieb:

    ist mir schon klar, aber wenn du bedenkst, dass &vec[0] ein Array zurückgeben muss und dass nichts festgelegt ist, ist es sinnvoll davon auszugehen, dass sie sich so verhält, als sich auf ungarantierte Implementierungsdetails zu verlassen, die nicht fix sind. Oder habe ich da etwas falsch verstanden?

    Ehh, WAS?

    JustAnotherNoob schrieb:

    ...keinen semantisch relevanten Unterschied.

    Wenn zwei Varianten sich praktisch nicht unterscheiden, aber eine der beiden Varianten deutlich weniger Overhead hat, welche sollte man dann wohl bevorzugen?



  • JustAnotherNoob schrieb:

    ich sage ja nicht, dass deine Einwände falsch sind, sondern nur didaktisch ungeeignet.

    Nein. Du tust meinen Post als Gerede ab und forderst eine geeignete Antwort. Niemand weiss, was du dir darunter vorstellst - mal abgesehen davon, dass das für mich nicht mehr unter höfliches Verhalten geht.

    JustAnotherNoob schrieb:

    ist mir schon klar, aber wenn du bedenkst, dass &vec[0] ein Array zurückgeben muss und dass nichts festgelegt ist, ist es sinnvoll davon auszugehen, dass sie sich so verhält, als sich auf ungarantierte Implementierungsdetails zu verlassen, die nicht fix sind. Oder habe ich da etwas falsch verstanden?

    Ja, hast du. Was hat &vec[0] damit zu tun? Das liefert immer einen Zeiger auf ein dynamisches Array. Aber unabhängig davon sagte ich nur, dass ein std::vector genauso als Container verwendet werden kann, bei dem die Reihenfolge eine Rolle spielt. Für Weiteres siehe Tachyons Post.

    JustAnotherNoob schrieb:

    auch hier war es nur ein didaktischer Einwand, der Sinn einer map ist nunmal eine solche Zuordnung, der Sinn eines vectors nicht, dass es in manchen Fällen dennoch sinnvoll ist bestreite ich nicht, halte ich aber in dem Moment für irrellevant, die Ausnahme bringt vielleicht kostenlose Performance, aber keinen semantisch relevanten Unterschied.

    Wieso soll der Sinn des vector s keine Zuordnung sein? Steht das irgendwo, oder hast du das mal eben festgelegt? std::vector ist ein STL-Container, der Random Access unterstützt. Als solcher kann er dafür verwendet werden, Elemente mittels Indizes anzusprechen. Wozu sollte der operator[] sonst gut sein?

    JustAnotherNoob schrieb:

    habe nie etwas anderes behauptet.

    Doch, du hast behauptet, dass man std::vector nehmen solle, wenn die Reihenfolge irrelevant sei. In diesem Post hast du das nochmals bestätigt, indem du gesagt hast, der Sinn des std::vector sei ein anderer als eine Index-Element-Zuordnung.



  • Nein. Du tust meinen Post als Gerede ab und forderst eine geeignete Antwort. Niemand weiss, was du dir darunter vorstellst - mal abgesehen davon, dass das für mich nicht mehr unter höfliches Verhalten geht.

    Hab deinen Post auch nicht für höflich gehalten, wobei es in diesem Forum ja üblich zu sein scheint erst einmal falsch! zu brüllen.

    Aber unabhängig davon sagte ich nur, dass ein std::vector genauso als Container verwendet werden kann, bei dem die Reihenfolge eine Rolle spielt. Für Weiteres siehe Tachyons Post.

    hab nie was anderes behauptet.
    Ich hab nie gesagt, dass es nicht geht, ich wollte nur einen Leitfaden liefern, wozu welche Container üblicherweise verwendet werden. Das was du ansprichst ist ein Sonderfall und dann war da noch der Verweis auf den Standard, habs einfach nicht für Einsteigerfreundlich erachtet - falsch wollt ichs nie nennen?

    Wieso soll der Sinn des vectors keine Zuordnung sein? Steht das irgendwo, oder hast du das mal eben festgelegt? std::vector ist ein STL-Container, der Random Access unterstützt. Als solcher kann er dafür verwendet werden, Elemente mittels Indizes anzusprechen. Wozu sollte der operator[] sonst gut sein?

    Okay, ich hör auf, das führt zu nix, weil du mir immernoch mit technischen Einwänden kommst und wir da völlig einer Meinung sind, ich nur eben jemandem der scheinbar noch nie was von Containern oder Arrays gehört hat typische Anwendungszwecke nennen wollte.

    In diesem Post hast du das nochmals bestätigt, indem du gesagt hast, der Sinn des std::vector sei ein anderer als eine Index-Element-Zuordnung.

    nö. Oder willst du mir nun erklären, was ich denke?

    also nochmal:
    ich denke nicht, dass man vector nicht für Key-Value Beziegungen, in denen der Key eine spezielle Bedeutung neben seinem Dasein als Index hat verwenden KANN
    ich denke auch nicht, dass es nicht manchmal besser ist.
    Ich denke nur nicht, dass es die originale Intention hinter diesem Container war und die technische Ausführung ist hier irrelevant, da es mir nur um die Didaktik ging.



  • JustAnotherNoob schrieb:

    Hab deinen Post auch nicht für höflich gehalten, wobei es in diesem Forum ja üblich zu sein scheint erst einmal falsch! zu brüllen.

    Es ist also unhöflich, wenn ich dich auf deinen Fehler hinweise? Siehst du den Unterschied zwischen Kritik an Aussagen auf sachlicher Ebene (oder war ich das nicht?) und Darstellung des Posts als ungeeignetes Gerede?

    JustAnotherNoob schrieb:

    Okay, ich hör auf, das führt zu nix, weil du mir immernoch mit technischen Einwänden kommst und wir da völlig einer Meinung sind, ich nur eben jemandem der scheinbar noch nie was von Containern oder Arrays gehört hat typische Anwendungszwecke nennen wollte.

    Darf ich nicht mit technischen Einwänden argumentieren? Und ich hatte bisher nicht ganz das Gefühl, wir wären gleicher Meinung. Du schreibst die ganze Zeit etwas von Didaktik. Klar wird eine Map häufiger für Schlüssel-Wert-Zuordnungen benötigt, ich habe nur geschrieben, bei linearen Zahlenfolgen könne man gerade so gut den sequenziellen Container std::vector nehmen. Meiner Ansicht nach bringt es dem Threadersteller mehr, wenn man ihm mehrere Anwendungen und nicht nur die übliche einzig wahre™ aufzeigt. Warum wehrst du dich dann so gegen meine Ergänzung? So verwirrend ist der Einwand wohl nicht, zumal man Arrays oder Vectors wahrscheinlich als erste Containertypen kennenlernt...

    JustAnotherNoob schrieb:

    Oder willst du mir nun erklären, was ich denke?

    Nein. Nur, was du geschrieben hast.

    Ich glaube, wir sind uns inzwischen mehr oder weniger einig. Trotzdem wäre die ganze Diskussion nicht nötig gewesen, hättest du den von mir erwähnten Fall mit std::vector unkommentiert stehen gelassen. Er wäre eine Ergänzung, ein Sonderfall geblieben. Naja...


Anmelden zum Antworten