3d array



  • Wenn ich das in mein Programm schreibe kann ich es nach dem compilieren nicht mehr starten:
    "int punkte[100][100][100];"

    wenn ich "int punkte[1][100][100];" schreibe geht es wieder, ich möchte aber alle arrays mit 100 speicherfeldern haben.

    Warum funktioniert es nicht mit 100?



  • Kurze Überschalgsrechnung:

    100*100*100 = 1 Million
    1000000*4 = 4 Millionen Bytes

    4000000 / 1024 = ~3906 Kilobytes / 1024 = ~3,81 Megabyte

    Es ist gut möglich, dass du keinen Stack von 3,81 Megabyte hast. Versuch das Array doch mal am Heap anzulegen, bzw. benütze stattdessen:

    #include <vector>
    
    ...
    
    vector<vector<vector<int> > > punkte;
    

    MfG SideWinder



  • Ich weiß gar nicht was heap ist...

    Kennst du tutorials wo das mit dem vector bzw heap erklärt wird?



  • wenn du ein statisches array erzeugst zB.:

    char namenliste[20][30];
    

    wird das programm am stack (ein bereich im arbeitsspeicher) speicher zu reservieren versuchen.

    wenn du ein dynamisches array erzeugst zB.:

    char **namenliste;
    

    und den speicherbereich mit malloc, calloc, bzw realloc reservierst,
    wird das programm den arbeitsspeicher am heap reservieren.

    Bei deinem Programm könnte es sein, dass du bereits zu viel speicher reserviert hast... du kannst reservierten speicher, wenn er nicht mehr benötigt wird mit "free" wieder freigeben, um genügend speicherplatz zur verfügung zu haben.

    mfG (c)h

    @SideWinder PS.: das mit "vector" habe ich noch nicht gelernt 🙄 ... was macht dein beispiel genau?



  • Eine vordefinierte Klasse die für dich die ganze Speicherverwaltung eines Arrays übernimmt. Es allokiert dynamisch mehr Speicherplatz wenn nötig und gibt ihn auch immer korrekt frei.

    Du musst dich weder mit malloc/free/new/delete herumschlagen. Am Beginn ist der oben gezeigte Vektor ein [0][0][0], damit es sofort 100 sind kann man einen alternativen Konstruktor benützen oder die Methode .resize() für jeden Vektor aufrufen.

    Mehr dazu gibts im richtigen Forum -> Verschoben nach C++.

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der Stack ist iirc 1MB groß bei Windows.

    Zu dynamischen Arrays gibts nen Eintrag in der FAQ



  • SirLant schrieb:

    Der Stack ist iirc 1MB groß bei Windows.

    Afair kann man das bei Bedarf aber auch anpassen.



  • struct Container
    {
        int punkte[100][100][100];
    };
    
    boost::scoped_ptr<Container> ptr(new Container); // Alternativ: std::auto_ptr
    ptr->punkte[56][61][2] = 566;
    

    Arrays sind in C/C++ ziemlich kaputt, deshalb ist das IMHO die direkteste Umsetzung auf dem Heap.


Anmelden zum Antworten