mehrdimensionales array verwenden/indizieren
-
hallo,
ich brache ein mehrdimensionales feld in einer funktion.wenn ich es so mache
int main(){ int feld [SIZE][SIZE][SIZE]; funktion(feld); }
sagt er mir:
Warnung: passing arg 2 of `platziere_pferd' from incompatible pointer typewenn ich es so mache:
int main(){ int feld [SIZE*SIZE*SIZE]; funktion(feld); }
kann ich ja in der funktion nicht so: feld [x][y][z] darauf zugreifen.
wie kann ich es realisieren, daß ich in der funktion auf die jeweilige dimension zugreife.danke
-
#include <stdio.h> void fnFunktion (int iBekommen[10][10][10]) ; int main (void){ int iZahlen[10][10][10] ; fnFunktion (iZahlen) ; printf ("%d", iZahlen[1][2][3]) ; return 0 ; } void fnFunktion (int iBekommen[10][10][10]){ iBekommen[1][2][3] = 1975 ; }
so musste es funzen
-
Bei der Deklaration und beim Funktionskopf kann man sogar die erste Grenze weglassen. Also:
void fnFunktion (int iBekommen[][10][10]);
-
@toom das funktioniert soweit ganz gut.
wieso kann ich jetzt aber nicht trotzdem einfach sequentiell durch das array laufen. etwa so:
for(c=0;c<SIZE*SIZE*SIZE;c++) printf("%d\n", ***(feld+c));
das verstehe ich noch nicht so ganz...
-
int* soso = feld; for(c=0;c<SIZE*SIZE*SIZE;c++) printf("%d\n", *(soso+c));
sollte gehen. Beachte: es sind keine ***, sondern nur ein Stern!
-
hallo,
hier:int* soso = feld;
bekomme ich dann aber wieder die warnung:
Warnung: initialization from incompatible pointer typees funktioniert zwar, aber was heißt das?
-
mezzo mix schrieb:
hallo,
hier:int* soso = feld;
bekomme ich dann aber wieder die warnung:
Warnung: initialization from incompatible pointer typees funktioniert zwar, aber was heißt das?
Das heißt, besorge die ganz dringend Literatur zu C, oder lerne logisch denken.
void benutze_feld(int ***feld) { feld[1][2][3] = 1; } int main(void) { int f[5][5][5]; benutze_feld(f); return 0; }
-
dein progrämmchen wird jedoch auch von einer compilerwarnung begleitet:
test.c: In functionmain': test.c:9: Warnung: passing arg 1 of
benutze_feld' from incompatible pointer type
-
Und jetzt sage mir mal, wie inkompatibel die Pointer denn sind!
Gruß Tobias
-
Sicherlich erhältst Du in meiner Version ein Pointertype-Warning, denn es findet ein implizites Pointercasting statt. Es liegt an dem Warning-Service eines Compilers, ob er sogar bei explizitem casting int* soso = (int*)feld noch warnt. Pointercastings sind eine niemals zu unterschätzende Gefahr, deshalb wird da kräftig gewarnt. (Letztlich ist der 'grenzenlose' Zugriff, wie Du ihn willst schlampig - jedoch nicht unbedingt langsamer als drei Loops ;))
Man muss sich auch von dem Gedanken trennen, ein Programm unbedingt warnfrei entwickeln zu wollen - ein Kommentar, weshalb eine Warnung getrost ignoriert werden kann, tut es in den meisten Fällen.
Jedenfalls handhabe ich das so.