Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Mehrdimensionale Felder



javatar
04-11-2012, 11:04
Hallo zusammen;

für eine Hausarbeit muss ich ein Programm in C++ schreiben, allerdings hab ich eigentliche nur Java- und teilweise C-Kenntnisse. Kombiniert mit Google komme ich eigentlich relativ gut klar, aber eine Sache kriege ich einfach nicht hin. Ich benötige für das Programm ein 3-Dimensionales Feld.

In Java ließe sich das ja ganz einfach realisieren

int[][][] tensor = new int[dim][dim][dim]

in C++ scheitere ich damit aber leider, lediglich das zweidimensionale Array habe ich bisher geschaft.


double** matrix;
matrix = new double*[dim];
for(int i=0 ; i<dim ; i++) {
matrix[i] = new double[dim];
}


Mein Versuch das ganze dann zu übertragen war folgender:


double*** tensor
tensor = new double**[dim];
for(int i=0 ; i<dim ; i++) {
tensor[i] = new double*[dim];
for(int j=0 ; i<dim ; i++) {
tensor[i][j] = new double[dim];
}
}


Hierbei erhalte ich aber einen Speicherzugriffsfehler. Kann mir da jemand weiterhelfen?

Nachtrag: hat sich erledigt, bei der zweiten For-Schleife war ich etwas blöd und hab die laufvariablen durchmischt.

locus vivendi
04-11-2012, 16:43
Hat sich zwar schon erledigt, aber ich möchte trotzdem antworten:


Ich benötige für das Programm ein 3-Dimensionales Feld.[...]
in C++ scheitere ich damit aber leider, lediglich das zweidimensionale Array habe ich bisher geschaft.
Verständlich, hier kann es zum Problem werden dass in C++ bei deklarierten Arrays nur die erste Dimension von variable Breite sein darf und das auch nur bei mit "new" erzeugten Arrays.

Anscheinend ist "dim" bei dir eine Konstante, sonst würde der Compiler meckern.


Mein Versuch das ganze dann zu übertragen war folgender:[...]
Hierbei erhalte ich aber einen Speicherzugriffsfehler.

Du könntest dir eine kleine Hilfsklasse schreiben, ähnlich dieser hier:


struct vec_3d
{
vec_3d(int size_x, int size_y, int size_z)
: size_x(size_x), size_y(size_y), size_z(size_z), storage(size_x * size_y * size_z) { }

int& get(int x, int y, int z)
{
return const_cast<vec_3d&>(*this).get(x, y, z);
}

int const& get(int x, int y, int z)
{
assert(x < size_x); assert(y < size_y); assert(z < size_z);
return storage.at(x * size_y * size_z + y * size_z + z);
}

std::vector<int> storage;
};


Dann hättest du eine Art mehrdimensionales Array mit rudimentärer Bereichsüberprüfung (d.h. die ist noch nicht ganz vollständig).

Generell würde ich empfehlen für Hausaufgaben den Compiler so aufzurufen, dass möglichst viele Sicherheitsüberprüfungen vorgenommen werden. Für den GCC z.B. die Optionen -D_GLIBCXX_DEBUG und -fstack-protector-all zu benutzen, wenn möglich. Und zusätlich viele Asserts in den Code einzubauen. Das kann einem die Fehlersuche ggf. erleichtern.

javatar
05-11-2012, 21:59
Vielen Dank, deine Hilfklasse erschlägt mich aber im Augenblick noch etwas. Mit den Sicherheitsüberprüfungen hast du natürlich recht, die Optionen vom gcc kannte ich bisher noch gar nicht. Mal schauen, was meine zukünftige "Karriere" mit C++ alles noch für mich bereit hält. :)