@peschmae:
Hast ja recht, da gibts einen Unterschied zwischen Vektoren fixer Länge und dynamisch allozieren Speicherbereichen an den ich nicht gedacht hab.
Probier einfach mal folgendes Beispiel:
Code:
int main (int argc, char **argv)
{
int foo[2][2];
int **bar;
bar = (int**) malloc(2 * sizeof(int*));
bar[0] = (int*) malloc(2 * sizeof(int));
bar[1] = (int*) malloc(2 * sizeof(int));
printf("foo: (%p == %p) == %i\n", (int*) foo, (int*) &foo[0][0], (int*) foo == (int*) &foo[0][0]);
printf("bar: (%p == %p) == %i\n", (int*) foo, (int*) &bar[0][0], (int*) bar == (int*) &bar[0][0]);
return 0;
}
Ausgabe bei mir (OpenBSD 3.6 i386):
Code:
foo: (0xcfbeeb5c == 0xcfbeeb5c) == 1
bar: (0x3c005030 == 0x3c005040) == 0
Wenns bei dir anders aussieht, dann wär das interessant was für ein System du benutzt?
Ergo, meine Erklärung war falsch, weil ich von fix deklarierten Vektoren ausging, es sich aber genau da anders verhält. Sie würde aber auf dynamische Speicherbereiche absolut zutreffen.
Folgender Code aus meinem vorangegangenen Post:
Code:
int foo[2][2];
foo[0][0] = 1;
foo[0][1] = 2;
foo[1][0] = 3;
foo[1][1] = 4;
müsste also der Korrektheit halber mit diesem ausgetauscht werden:
Code:
int **foo;
foo = (int**) malloc(2 * sizeof(int*));
foo[0] = (int*) malloc(2 * sizeof(int));
foo[1] = (int*) malloc(2 * sizeof(int));
foo[0][0] = 1;
foo[0][1] = 2;
foo[1][0] = 3;
foo[1][1] = 4;
Im speziellen Falle des OP werden zwar in main() fixe Vektoren (Deklaration int array[S][C];) verwendet, so dass array == &array[0][0] tatsächlich gilt, aber der Parameter der an die Funktion output() übergeben werden soll ist mit int **feld deklariert, d. h. das passt eh hinten und vorne nicht zusammen weil dynamische Felder eben anders organisiert sind.
Also hast du diese Deklaration kurzer Hand in int *feld umgeändert und den Zugriff über die Indices im Code der Funktion rausgeschmissen. Genau das hab ich aber übersehen und bin von gleich bleibender Funktion output() ausgegangen, Entschuldigund dafür.
Also dein Vorschlag als ganzes ist natürlich korrekt! Ziehe meinen Einwand, dass das so nicht klappen würde also zurück möchte aber anmerken, dass es IMHO nicht elegant gelöst ist, aber das ist Ansichtssache...
Allerdings, wenn man wie bei deinem Vorschlag die Funktion ändert, spricht trotzdem nichts dagegen einfach array statt &array[0][0] zu übergeben, ist ja ohnehin gleich, liesst sich einfacher und wenn man sowohl den Array in main() als auch die Funktion output() auf dynamische Felder umstellen möchte bleibt der Aufruf der gleiche...
Lesezeichen