Dynamische Arrays, aber wie?



  • Ich brauche ein Array, dessen Größe ich zur Laufzeit festlegen kann.

    int G = 4;
    int Feld[G];
    

    Das geht nicht, weil G nicht konstant ist.

    [C++ Fehler] Unit1.cpp(21): E2313 Konstantenausdruck erforderlich

    Was soll ich machen?



  • Einen Pointer auf ein Feld erstellen.
    int* pFeld;

    Und dann mit new Speicherbereich erstellen und ihm zuordnen:
    pFeld = new int[256];

    ACHTUNG:
    Beim freigeben eines Feldes die [] nicht vergessen, da du das ganze Feld freigeben möchtest:
    delete [] pFeld;



  • Wie wäre es mit den Containern der Standardbibliothek? (std::vector und Co.)



  • Und den Beitrag in der FAQ zu den dynamischen Arrays.



  • und die Forensuche nicht vergessen 😉

    ps: so, jetzt haben wir wohl alles 🤡



  • Ändere einfach das int zu einem const int und das war's.



  • randa schrieb:

    Ändere einfach das int zu einem const int und das war's.

    Nein, Array-Größen müssen Compile-Time konstant sein; sowas zB geht wohl kaum:

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int getSz()
    {
            return rand()%64;
    }
    
    int main()
    {
            srand(time(0));
            const int sz = getSz();
            int foobar[sz][sz];
    }
    

    Schließlich will er ja die Größe zur Laufzeit festlegen können.



  • Ändere einfach das int zu einem const int und das war's.

    Nicht wirklich. Das funktioniert auch mit einem const nicht. Das einzige was funktionieren würde, wäre

    const int a = 4;
    int b[a];
    

    Aber das bringt ja wohl irgendwie nix, denn jetzt muss ja wieder zur Compile-zeit die größe feststehen. Wenn die Größe wirklich erst zur Laufzeit feststeht, bleibt als einzige Möglichkeit die Pointer/new - Variante. Oder eben gleich std::vector 😉

    Mfg, smasher1985

    Edit: wohl etwas zu lahm 😞



  • boost::array



  • 🙂 schrieb:

    boost::array

    nicht wirklich,die sind compile-time konstant



  • otze schrieb:

    und die Forensuche nicht vergessen 😉

    ps: so, jetzt haben wir wohl alles 🤡

    nein..."lese ein Lieblings-Buch deiner Wahl" fehlt 😃



  • nman schrieb:

    Nein, Array-Größen müssen Compile-Time konstant sein; sowas zB geht wohl kaum:

    Jaja, ich habe übersehen, dass er es eigentlich Dynamisch haben will.

    std::vector ist vielleicht für Anfänger ein bisschen zuviel, ein Array passt auch.



  • danke für die antworten. ich werds wohl so machen:

    int *asd, da = 4;
    asd = new int[da];
    

    Scheint mir am praktischsten zu sein.



  • Ha,
    gewonnen! :p



  • randa schrieb:

    std::vector ist vielleicht für Anfänger ein bisschen zuviel, ein Array passt auch.

    Was ist an std::vector zuviel? (Klar sollte man mit nackten Arrays auch umgehen können, aber was gegen das Verwenden derart praktischer fertiger Datenstrukturne sprechen soll weiß ich nicht.

    Blackshadow: Vergiss das delete[] nicht.



  • SeppSchrot schrieb:

    Ha,
    gewonnen! :p

    Gratuliere recht herzlich, Deine Methode ist einem C++-Nube mit 94 Beiträgen am sympathischsten, damit hast Du den goldenen Ego-Blumentopf gewonnen. *fg*



  • C++-Nube mit 94 Beiträgen

    Vielen Dank!



  • nman schrieb:

    Was ist an std::vector zuviel? (Klar sollte man mit nackten Arrays auch umgehen können, aber was gegen das Verwenden derart praktischer fertiger Datenstrukturne sprechen soll weiß ich nicht.

    Vielleicht hast du vergessen wie es war als du Anfänger warst.
    Falls er Klassen schon kennt, ist ok. Falls nicht, wird ihn das nur Verwirren.
    Wie auch immer, eine Arraylösung ist fast gleich Praktisch für den Anfang, bis auf ein new, ein delete und dem extra gespeicherten Größenwert. Ich sehe kein Drama darin, sodass wieder unbedingt auf den std::vector verwiesen werden muss.



  • Gratuliere recht herzlich, Deine Methode ist einem C++-Nube mit 94 Beiträgen am sympathischsten, damit hast Du den goldenen Ego-Blumentopf gewonnen. *fg*

    Ich glaube nicht, dass die Anzahl der Beiträge wirklich etwas darüber aussagen, ob jemand mit C++ umgehen kann oder nicht... wie wärs mit etwas weniger Arroganz?

    Mfg, smasher1985

    Edit: Das soll nicht heißen, dass ich mit C++ umgehen kann 😃 😃 😃



  • randa schrieb:

    Vielleicht hast du vergessen wie es war als du Anfänger warst.
    Falls er Klassen schon kennt, ist ok.

    Und falls nicht, lernt er sie halt jetzt kennen. new[]/delete[] ist IMHO aus vielen Gründen ein Feature in C++, das man lieber vergisst bzw. spät lernt. Und außerdem muss er ja nicht wissen, wie man eine Klasse (oder gar ein template) schreibt, um vector<T> zu verwenden. vector und string sind gut zum Üben und einfach nur Typen wie int und double auch.


Anmelden zum Antworten