Array 16*16*16
-
Ich würde mir gern einen Würfel mit einer Kantenlänge von 16 Elementen anlegen. Ich habe gerade ein Loch im Kopf und versuche herauszufinden, wie ich vorgehen muss wenn ich den Würfel zum Beispiel so bearbeiten möchte:
MeinWuerfel[Ebene++][Reihe][Spalte--];
Die Elemente liegen im Speicher ja hintereinander, und wenn ich jetzt die Ebene Wechseln möchte muss ich den Zeiger ja um 256 Elemnte verschieben, richtig? Wie bekommt man es hin, dass die Ebene (oder Reihe [+16] bzw. Spalte [+1]) jeweils einfach mit den Operatoren ++ respektive -- verschieben kann?
-
timmix schrieb:
MeinWuerfel[Ebene++][Reihe][Spalte--];
Die Elemente liegen im Speicher ja hintereinander, und wenn ich jetzt die Ebene Wechseln möchte muss ich den Zeiger ja um 256 Elemnte verschieben, richtig?
Welchen Zeiger?
timmix schrieb:
Wie bekommt man es hin, dass die Ebene (oder Reihe [+16] bzw. Spalte [+1]) jeweils einfach mit den Operatoren ++ respektive -- verschieben kann?
Vielleicht verstehe ich dein Problem nicht ganz, aber eigentlich geht das ganz normal mit einfach Indexvariablen.
-
also ich verwende grundsätzlich nur 1 dimensionale Felder.
bei mir würde das also so aussehen:
int max = 256 * 16; // zu faul das auszurechnen ; int* wuerfel = (int*) malloc(max * sizeof(int));
die funktion für den zugriff würde dann so aussehen:
int umrechnung(int x, int y, int z) { return x + 16 * y + 256 * z; } // zugriff int x,y,z; . . . wurfel[umrechnung(x,y,z)] = ...
der Code ist jetzt zwar laufzeittechnisch absolut ineffizient, aber man hat nie probleme und brauch sich auch keine komplexen mehrdimensionalen dinge vorstellen, sondern gibt nur noch blind seine koordinaten ein und alles geht automatisch geht natürlich dann entsprechend auch mit mehr als 3 dimensionen.
wobei ich zugeben muss, wenn die laufzeit wichtig ist (Bsp. training neuronaler netze) dann verwende ich diese variante nicht
-
It0101 schrieb:
also ich verwende grundsätzlich nur 1 dimensionale Felder.
Du weißt aber schon, dass ein
int x[2][3];
im Speicher dann zu
int x[6];
wird, d.h. die gesamte Matrix als eindimensionales Array da drin liegt?!
-
wie ich bereits erwähnte ist der quelltext ineffizient macht aber meines erachtens sinn, wenn man funktionen hat, die nur EINEN wert zurückliefern, der eine bestimmmte position innerhalb eines mehrdimensionalen feldes bezeichnet. Wenn man von anfang an ein 1d feld verwendet hat man dann keine probleme.
oder meintest du das man auf ein feld
int feld[n][m]
auch mit
feld[o]
zugreifen kann.
Falls ja, hab ich auch heute wieder was dazu gelernt
-
Ja, in C kannst du durch ein
int x[2][3];
auch per:
int i=0; for ( ; i<6; ++i) x[i] = -587;
durchlaufen. C führt kein run-time range checking durch, im Gegensatz zu C++.
-
GPC schrieb:
C führt kein run-time range checking durch, im Gegensatz zu C++.
tztz... versucht da wieder einer mit aller gewalt c++ zu promoten?
runtime checks machen beide nicht, und ein c-compiler frisst auch keinint x[2][3]; x[...] = ...;
höchstens so:
x[0][...] = ...;
-
net schrieb:
GPC schrieb:
C führt kein run-time range checking durch, im Gegensatz zu C++.
tztz... versucht da wieder einer mit aller gewalt c++ zu promoten?
tztz... versucht da wieder einer mit aller gewalt c zu promoten
Ne, im Ernst. Ich mach das eh nicht, weil's halt auch ziemlicher murks ist, daher juckt mich's nicht, ob das er Compiler erlaubt, oder nicht.
runtime checks machen beide nicht,
Du hast doch sicherlich auch nen Link, der das untermauert. Mir war so, dass C++ Compiler das machen. Kann mich in dem Punkt aber auch täuschen, da ich grad nichts finde, was meine Behauptung stützen würde.
und ein c-compiler frisst auch kein
int x[2][3]; x[...] = ...;
höchstens so:
x[0][...] = ...;hm, ne, der gcc hat's bisher immer gefressen. Ob's der 4er auch noch tut, weiß ich nicht, ich hab noch den 3.3.x drauf, aber schon lange nicht mehr probiert, ob's geht.
-
GPC schrieb:
Du hast doch sicherlich auch nen Link, der das untermauert. Mir war so, dass C++ Compiler das machen. Kann mich in dem Punkt aber auch täuschen, da ich grad nichts finde, was meine Behauptung stützen würde.
links hab' ich auch nicht, aber aus'm gedächtnis: manche compiler machen solche checks im debugmodus, aber zur definition der sprachen gehört's nicht.
-
eingigen wir uns auf unentschieden und "compilerspezifisches Verhalten"
-
GPC schrieb:
und ein c-compiler frisst auch kein
int x[2][3]; x[...] = ...;
höchstens so:
x[0][...] = ...;hm, ne, der gcc hat's bisher immer gefressen. Ob's der 4er auch noch tut, weiß ich nicht, ich hab noch den 3.3.x drauf, aber schon lange nicht mehr probiert, ob's geht.
Also das sollte nicht gehen.
-
GPC schrieb:
eingigen wir uns auf unentschieden und "compilerspezifisches Verhalten"
nur wenn du versprichst hier nie wieder was über c++ zu schreiben
-
TactX schrieb:
Also das sollte nicht gehen.
bei welchem?
net schrieb:
GPC schrieb:
eingigen wir uns auf unentschieden und "compilerspezifisches Verhalten"
nur wenn du versprichst hier nie wieder was über c++ zu schreiben
hehe, ich hab ja eh keine Ahnung von C++, also halt ich einfach die Klappe :p
-
GPC schrieb:
TactX schrieb:
Also das sollte nicht gehen.
bei welchem?
Eigentlich bei allen
-
TactX schrieb:
GPC schrieb:
TactX schrieb:
Also das sollte nicht gehen.
bei welchem?
Eigentlich bei allen
hm, scheint so. Aber ich bin mir sicher, dass derartiger Code schon kompilierte, ich weiß nur nicht mehr, bei welchem Compiler. Verflucht. Ich werd bald mal meine alten Dinosaurier rausziehen und schauen, wo's noch durchgeht. Irgend so'n K&R Compiler wird's schon fressen
-
omg was hab ich angerichtet, ich schreib nie mehr was