Probleme mit der Speicherung von Arrays auf dem Heap



  • @manni66 könnte == Konjunktiv



  • @Swordfish
    wieso nicht einen std::vector<std::vector<Point>>
    Die Indizes für eine flache Hex-Map sind ein bischen blöd zu berechnen, deshalb wollte ich mit Zeilen und Spalten arbeiten.
    Viele Grüße




  • Mod

    @rolber sagte in Probleme mit der Speicherung von Arrays auf dem Heap:

    @Swordfish
    wieso nicht einen std::vector<std::vector<Point>>
    Die Indizes für eine flache Hex-Map sind ein bischen blöd zu berechnen, deshalb wollte ich mit Zeilen und Spalten arbeiten.
    Viele Grüße

    Was Swordfish sagte. Aber als Ergänzung dazu: Das ist das gleiche Phänomen, das ich ansprach, als ich davon sprach, dass ein Zeiger auf einen Zeiger erst recht kein 2D-Array wäre. Dementsprechend ist ein Vector von Vectoren halt auch kein 2D-Array und auch kein 2D-Vector, sondern halt eben nur das: Ein Vector von Vectoren. Datenstrukturmäßig so etwas wie eine Liste von Listen, aber halt nicht die schachbrettartige Struktur, die du dir wünscht.

    Man kann solch eine Liste von Listen durch etwas Feintuning zwar auch schachbrettartig ansprechen (man muss halt sicher gehen, dass alle Unterlisten immer genau gleich lang sind), aber man zahlt dafür gleich doppelt: Zum einen zahlt man durchaus Laufzeitkosten für die Dynamik, die man aber gar nicht nutzt. Und zum anderen ist das ein unnötiger Logiklayer im Programm, um die Erhaltung der Schachbrettanforderungen sicher zu stellen, der dann Fehler enthalten kann.

    Daher: Nimm einen 1D-Vector der Größe X*Y (oder wie viele Dimensionen du brauchst) und darauf dann die relativ triviale Logik, 2D-Indexzugriffe auf (x, y) in den entsprechenden 1D-Index umzurechnen (der 1D-Index zu (x,y) ist x * Y + y, wenn Y die Länge der Y-Dimension ist). Das kostet auch keine Laufzeit, denn letztlich ist das genau das, was ein statisches 2D-Array intern selber auch macht. Das findest du, wie schon erwähnt, mindestens 100-fach hier im Forum vorgemacht.



  • Oder die von @DocShoe erstellte (finale) Klasse aus Array2D: Evolution von manueller Speicherverwaltung zur STL benutzen.



  • Erst einmal Vielen Dank für Eure Hilfe.

    Schon beim formulieren meiner Frage hatte ich Bedenken ob es so richtig ist. Ich bin CPP-Anfänger, kann aber ganz gut Java, also habe ich erst einmal so programmiert wie man es in Java machen würde. So sieht dann halt auch mein Code aus. Ein Grund warum ich CPP oder C lernen will, besteht in der Pflicht, sich um den Speicher selbst zu kümmern. Garbage collection ist eine feine Sache aber die meisten Roboter (und vor allem auch Spiele) werden wohl mit C bzw. CPP programmiert. Durch die objektorientierte Programmierung mit CPP habe ich mir eingebildet es könnte mehr wie einfaches C. Ohne es bisher umgesetzt zu haben, hätte ich C für meine Anwendung verwendet liefe es ganz sicher auf ein flaches Array hinaus.

    Würde ich meine Frage nochmals formulieren, dann so: Wieso ist dieser Code falsch obwohl er offensichtlich funktioniert?
    Und dann hätte ich nur den auskommentierten Teil (die dreieckige Geschichte) gepostet.

    Viele Grüße



  • @rolber sagte in Probleme mit der Speicherung von Arrays auf dem Heap:

    Ein Grund warum ich CPP oder C lernen will, besteht in der Pflicht, sich um den Speicher selbst zu kümmern.

    Das tut man in C++ seltenst. Siehe RAII/RDID und Rule of Zero



  • @Swordfish Vielen Dank für den Link, der scheint genau das richtige für mich zu sein:-)



  • @rolber: Du hast einen Speicherreservierungsfehler im Konstruktor

    points[RADIUS + q] = new Point*[2 * RADIUS + 1]; // [r2 - r1 + 1];
    

    Dadurch, daß du immer per RADIUS + col auf den 2. Index zugreifst (in print) , paßten deine Speicherzugriffe nicht, s.a. Ideone-Code.

    Alternativ in print jeweils r1 berechnen und damit indizieren.



  • @Th69 Hallo,
    wollte es erst nicht glauben, aber Du hast absolut recht, ich habe den Spalten-Index falsch berechnet.
    So klappt es:
    points[RADIUS + q][min(RADIUS, RADIUS + q) + r] = new Point(q, r);
    Im Destruktor und print dasselbe, und die Schleifen können bleiben wie sie sind.

    Das ich eine falsche Logik eingebaut habe, ist mir richtig peinlich.

    Vielen Dank, vielen Dank das Du dir die Mühe gemacht hast.


Anmelden zum Antworten