2016-03-29 14 views
0

Ich habe auf Google gesucht, aber nur Antworten für Single-Dimension-Arrays gefunden.Zeigen Sie auf dreidimensionale Matrix in C++

Ich habe ein 3-dimensionales Array, das Daten speichert, die später von einer Funktion verarbeitet werden. Mein Array sieht so aus: levelcode[400][20][100]. Es speichert alle Informationen, die die Dekodier-Level-Funktion benötigt. Ich bekomme sofort einen Stapelüberlauffehler.

Aber wie kann ich auf das gesamte Array zeigen, um die Werte davon zu erhalten (oder wie überlasse ich das gesamte Array?)?

Ich weiß, ich kann die Funktion für jeden vorhandenen Parameter technisch aufrufen, aber ich denke, es wäre schneller und es würde besser aussehen, wenn das gesamte Array übergeben oder mit einem Zeiger einer Art verwendet wurde. Wie kann ich das erreichen?

+0

Haben Sie die Antworten auf ähnliche Fragen wie diese hier gelesen: http://stackoverflow.com/questions/18283089/pointers-to-d-arrays-c –

+0

Ist es möglich, eine 'std :: array' zu verwenden stattdessen? – Tobias

+0

Können Sie Code posten, um anzuzeigen, wie Ihre Arrays deklariert sind? – Chiel

Antwort

1

Ich schlage vor, Sie verwenden eine std::vector. Es ist im Grunde ein selbstgesteuertes Grow-Array. Es speichert die Daten dynamisch (Heap), so dass Sie den vollen Systemspeicher anstelle des kleinen Speicherplatzes verwenden, den das Programm für automatische Objekte (Stack) erhält. Mit Ihrer levelcode[400][20][100] haben Sie 800.000 Elemente. Wenn das Array vom Typ int ist, benötigen Sie mehr als wahrscheinlich 3,2 MB Speicherplatz für das Array. in der Regel ist dies größer als als der Platz für das Programm zur Verfügung gestellt und würde eine stack overflow

Ich würde vorschlagen, verwenden Sie Single Dimension Vektor und dann können Sie Mathe verwenden, um die 3 Dimensionen zu fälschen. Dies wird die Daten Cache-freundlicher machen, da mehrdimensionale Vektoren nicht jede Dimension direkt nebeneinander haben müssen, wie dies bei einem mehrdimensionalen Array der Fall ist.

Anstatt also mit einem

std::vector<std::vector<std::vector<some_type>>> name{DIM1, vector<vector<some_type>>{DIM2, vector<some_type>{DIM3}}}; 

und dessen Verwendung wie

name[x][y][z] 

Wir haben eine

std::vector<some_type> name{DIM1 * DIM2 * DIM3}; 

haben könnte und dann können Sie die Elemente Zugang mit

name[x*DIM2*DIM3 + y*DIM3 + z] 
+0

wie soll ich es "fälschen"? Kann ich nur 3 davon benutzen? – MoustacheSpy

+0

Ich finde das keine gute Antwort auf die Frage ohne Beispiele und ohne die Erklärung, wie man drei Dimensionen zu einem einzigen zuordnen kann. – Chiel

+0

Außerdem ist der 'std :: vector' natürlich der beste Container, aber er erklärt nicht wirklich, warum die Stapelzuweisung überläuft. – Chiel