2-dimensionales Array als Rückgebewert einer Funktion
-
Hallo,
ich würde gerne ein 2D-Array in einer Funktion bearbeiten und nachher in der main-Funktion wieder als solches vorliegen haben. Ich habe schon eine ganze Weile dran probiert, aber komme nicht zum Ziel. Wahrscheinlich liegt es an dem zweiten Cast.
#include <stdio.h> int** clear(int x[2][2]){ int i; int j; for(i=0;i<2;i++) for(j=0;j<2;j++) x[i][j] = 0; return (int**) **x; } int main(){ int a[2][2] = { {5,4},{9,3} }; **a = (int[2][2]) clear(a); printf("%i",a[0][1]); //Test-Ausgabe... sollte jetzt 0 sein return 0; }
Kann mir jemand sagen wo der Fehler liegt und wie ich ihn beheben kann? re342
-
... return (int**) **x; }
Wenn du den Rückgabewert "x" 2 mal dereferenzierst mit den ** ... ist das nicht mehr vom Typ "int**" sondern vom Typ "int". Du willst ja aber etwas vom Typ "int**" zurückgeben.
=>
return x; }
Da sollte dann auch der cast (int**) überflüssig sein.
-
Ein Array wird immer nur als Zeiger (array to pointer decay) übergeben, so daß Änderungen auch in der aufrufenden Funktion sichtbar sind.
Dein Fehler ist, daß dein Rückgabewert kompletter Unsinn ist: du castest den Inhalt des ersten Array-Elements in einen Zeiger.Es reicht die Funktion ohne Rückgabewert zu definieren:
void clear(int x[2][2]) { int i; int j; for(i=0;i<2;i++) for(j=0;j<2;j++) x[i][j] = 0; } int main() { int a[2][2] = { {5,4},{9,3} }; clear(a); printf("%i",a[0][1]); //Test-Ausgabe... sollte jetzt 0 sein return 0; }
-
Vielen Dank euch!
-
Das Stichwort vom Zerfall (engl. decay) von Arrays zu Zeigern hat Th69 ja schon gebracht.
Wenn du ein
int[]
übergeben willst kommt nur einint*
an.
Analog degeneriert einint[2][2]
zu einemint (*)[2]
. (Zeiger auf int[2] - siehe Bemerkung unten.)So einen gibt
clear()
also zurück.Wie sieht nun die Deklaration von clear() aus?
clear( ) // clear ist eine Funktion clear(int x[2][2]) // die ein int[2][2] erwartet (eig. clear(int (*x)[2]) *clear(int x[2][2]) // und einen pointer zurückgibt (*clear(int x[2][2]))[2] // auf ein Array [2] von int (*clear(int x[2][2]))[2] // int
Evtl. kannst Du das vereinfachen mit ein paar
typedefs
#include <string.h> typedef int row[2]; typedef row matrix[2]; row* clear(matrix x) { return memset(x, 0, sizeof(matrix)); // Funktion aus der C-Bibliothek }
Vielleicht besser, vielleicht nicht.
Fußnote:
Warum die Klammerungint(*)[2]
?
Die naheliegende Schreibweiseint *[2]
ist im Gegensatz dazu ein Array von 2 Zeigern auf int. Deswegen die Klammern.