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 ein int* an.
    Analog degeneriert ein int[2][2] zu einem int (*)[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 Klammerung int(*)[2] ?
    Die naheliegende Schreibweise int *[2] ist im Gegensatz dazu ein Array von 2 Zeigern auf int. Deswegen die Klammern.


Log in to reply