Maximale Dimension mehrdimensionaler Arrays
-
Hallo!
Mein Problem: Während ich eindimensionale Array praktisch beliebiger Größe deklarieren kann, geht das bei mehrdimensionalen nicht mehr.
double myMatrix[500][500];funktioniert noch aber ab etwa
double myMatrix[600][600];reagiert das kompilierte Programm nicht mehr (übrigens direkt von Anfang an, nicht erst wenn die Zeile mit der Deklaration kommt) und Code::Blocks wirft einen 0xC0000FD Fehler aus.
Kann man in C++ tatsächlich nicht größere 2-dimensionale Arrays deklarieren oder mache ich etwas falsch?! Würde mich sehr über Hilfe freuen!
Viele Grüße,
Marco
-
Du solltest so große Arrays nicht auf dem Stack anlegen sondern auf dem Heap. Im zweiten Fall sind das über 2.5 MB, der Stack ist unter Windows üblicherweise 1 MB.
-
Hallo!
Vielen Dank für deine Antwort. Ohje, dann werden jetzt leider Informatik Kentnisse nötig, die ich nicht habe.
Könntest du oder jemand anderes kurz schreiben, wie ich das in obigem Beispiel machen könnte? Oder ist das mit dem Heap so kompliziert, dass ich mich erstmal tiefgründiger Einarbeiten muss?Nach wie vor wundert mich, dass
double Array[100000];keine Probleme verursacht. Wäre natürlich eine mögliche Lösung, das 2D Array als 1D Array zu speichern. Aber lieber wäre mir, wenn das auf dem Heap halbwegs einfach als zweidimensionales Array geht. Denn das soll eine Matrix werden und da wäre es der Anschauung halber zweidimensional schöner.
Viele Grüße!
-
++Marc0 schrieb:
Hallo!
Vielen Dank für deine Antwort. Ohje, dann werden jetzt leider Informatik Kentnisse nötig, die ich nicht habe.
Könntest du oder jemand anderes kurz schreiben, wie ich das in obigem Beispiel machen könnte? Oder ist das mit dem Heap so kompliziert, dass ich mich erstmal tiefgründiger Einarbeiten muss?Das ist nichts kompliziertes. Das ist einfach nur Informatikersprech dafür, dass du std::vector benutzen sollst. Also nichts wildes.
Nach wie vor wundert mich, dass
double Array[100000];keine Probleme verursacht. Wäre natürlich eine mögliche Lösung, das 2D Array als 1D Array zu speichern. Aber lieber wäre mir, wenn das auf dem Heap halbwegs einfach als zweidimensionales Array geht. Denn das soll eine Matrix werden und da wäre es der Anschauung halber zweidimensional schöner.
Das hat nichts mit 1D vs 2D zu tun. Es wird einfach sizeof(double[100000)) < sizeof(myMatrix[600][600]) = sizeof(myMatrix[360000]) sein.
-
Achso! Ok dankeschön!
Nur noch eine Frage: Ist ein deutlich schneller mit einem Array zu arbeiten statt mit einem (gleichgroßem) Vector? Gerade das war nämlich der Sinn der Sache. Ich habe mein Programm bisher mit der Vector-Klasse geschrieben, aber das war sehr langsam. Deshalb wollte ich es jetzt mit Arrays ausprobieren, was jetzt aber auf Grund der Größenbeschränkung nicht wirklich Sinn macht. Würde es auch aus Performance-Sicht keinen wirklichen Vorteil liefern? Dann kann ich mir den Aufwand nämlich gleich sparen und lieber versuchen an anderen Stellen die Geschwindigkeit zu optimieren
Marco
-
++Marc0 schrieb:
Achso! Ok dankeschön!
Nur noch eine Frage: Ist ein deutlich schneller mit einem Array zu arbeiten statt mit einem (gleichgroßem) Vector? Gerade das war nämlich der Sinn der Sache. Ich habe mein Programm bisher mit der Vector-Klasse geschrieben, aber das war sehr langsam. Deshalb wollte ich es jetzt mit Arrays ausprobieren, was jetzt aber auf Grund der Größenbeschränkung nicht wirklich Sinn macht. Würde es auch aus Performance-Sicht keinen wirklichen Vorteil liefern? Dann kann ich mir den Aufwand nämlich gleich sparen und lieber versuchen an anderen Stellen die Geschwindigkeit zu optimieren
Marco
Stell mal den release mode ein und du wirst merken, dass vector vs array absolut keinen unterschied macht.
-
Dynamische Arrays und Vectoren sollten exakt gleich schnell sein, und beide sollten nur minimal langsamer sein als statische Arrays (unmerklich, eventuell so im Nanosekundenbereich beim ersten Zugriff). Wenn das nicht so ist, machst du was falsch. Gute Kandidaten für's Falschmachen sind Debugmodus benutzen (das ist beim Testen aber ok. Sein froh, dass vectoren soviele Fehler abfangen können!) oder eine dumme Standardbibliothek die selbst beim Release noch Laufzeitchecks einbaut (MSVC ist berüchtigt dafür. Jeden Monat kommt hier jemand mit einem Benchmark, wie lahm vector doch sein, dabei haben sie nicht beachtet, dass man beim MSVC noch irgendein Makro setzen muss, um solche Checks auszuschalten)
-
Alles klar! Besten Dank euch allen für die super-schnelle Hilfe

-
Und dieses "dumme" Makro heißt: _SECURE_SCL
Unter Visual Studio war es bis inkl. VS2008 auch im Release-Build standardmäßig als 1 definiert (also checked element access). Seit VS2010 ist es im Release - Gott sei Dank - standardmäßig abgeschaltet.