Mehrdimensionale Arrays auf Heap

Hallo,

ich habe da ein kleines Problem. Ich schreibe eine Funktion, in der ein 3-dim Array „int a[256][256][256];“ angelegt werden soll. Beim Ausführen erhalte ich einen Segmentation Fault. Wenn ich die Arraygröße herabsetzte funzt es. Jetzt möchte ich das Array auf dem Heap erzeugen, in der Hofffnung es funzt dann. Ein eindimensionales Array würde ich ja so erzeugen „int * a = new int[256];“, aber wie funktioniert das denn mit einem dreidimensional Array ??
Wär nett, wenn mir jemand helfen könnte.

Gruß

Sebastian

Ein eindimensionales Array würde ich ja so erzeugen „int
* a = new int[256];“, aber wie funktioniert das denn mit einem
dreidimensional Array ??

Sagen wir mal, du willst ein Array a[x][y][z] anlegen:

a = new int[x];
for( int i=0; i

Das ganze ist dann netterweise noch nicht initialisiert, das ließe sich aber mit einer weiteren inneren Schleife nachholen. Die Methode, die eher nach C++ aussieht und mit weniger Speicherlecks auskommt, ist:



    
    #include 
    using std::vector;
    
    vector \> \> a;




Das Interface ist in diesem Fall praktisch gleich, die Adressierung ist "sicherer" und man muss den Kram am Ende nicht von Hand per delete[] wieder wegräumen. Natürlich kann man das ganze nicht so einfach serialisieren oder sonstwie auf niedriger Ebene verwenden.

Noch was: Wenn du dreidimensionale Arrays verwendest, machst du ziemlich sicher irgendwas, was man mit zwei- oder sogar nur eindimensionalen erledigen könnte.

Noch was: Wenn du dreidimensionale Arrays verwendest, machst
du ziemlich sicher irgendwas, was man mit zwei- oder sogar nur
eindimensionalen erledigen könnte.

Klar könnte man das eindimensional erledigen, aber der Algorithmus, den ich implementieren will schlägt eine dreidimensional Struktur vor und ich dachte mir, wieso soll ich mir die arbeit machen ein dreidimensionales array eindimensional zu verwalten, is doch irgendwie umständlich…
Wie dem auch sei, ich werd deinen Vorschlag morgen ausproboieren und dich wissen lassen, ob’s funktioniert hat

Hallo Sebastian,

ich habe da ein kleines Problem. Ich schreibe eine Funktion,
in der ein 3-dim Array „int a[256][256][256];“ angelegt werden
soll. Beim Ausführen erhalte ich einen Segmentation Fault.
Wenn ich die Arraygröße herabsetzte funzt es. Jetzt möchte ich
das Array auf dem Heap erzeugen, in der Hofffnung es funzt
dann. Ein eindimensionales Array würde ich ja so erzeugen „int
* a = new int[256];“, aber wie funktioniert das denn mit einem
dreidimensional Array ??
Wär nett, wenn mir jemand helfen könnte.

Dein Problem liegt wohl an der grösse des Arrays. Das Array ist je nachdem wie gross int ist (16, 32 oder sogar 64 Bit) 32, 64 oder 128 MByte gross.
Jetzt kommt es noch darauf an welchen Compiler, CPU, Speichermodell und nicht zuletzt welches Betriebssystem du benutzt.

MfG Peter(TOO)

Hi,

ich habe da ein kleines Problem. Ich schreibe eine Funktion,
in der ein 3-dim Array „int a[256][256][256];“ angelegt werden
soll. Beim Ausführen erhalte ich einen Segmentation Fault.
Wenn ich die Arraygröße herabsetzte funzt es. Jetzt möchte ich
das Array auf dem Heap erzeugen, in der Hofffnung es funzt
dann. Ein eindimensionales Array würde ich ja so erzeugen „int
* a = new int[256];“, aber wie funktioniert das denn mit einem
dreidimensional Array ??

 #define NUM 1000

 struct SI { 
 int a[NUM][NUM][NUM];
 };

 int main(void)
{
 SI\* p = new SI;

 for (z = 0; za[z][y][x] = irgendwas;

 delete p;
}

Grüße

CMБ

Sehr elegante lösung. Alternativ dazu sollte auch das funktionieren:

#define DIM 256

union SI {
 int a[DIM][DIM][DIM];
 int \_a[DIM\*DIM\*DIM];
};

int main( void ) {
 SI\* p = new SI;
 for( unsigned int i=0; i\_a[i] = irgendwas;
}

Wenn man sowieso C++ verwendet kann man natürlich gleich eine entsprechende Klasse basteln, die per überladenen Operatoren und Casts ein „schöneres“ Interface anbietet.