Feld aus einer Funktion zurückgeben



  • Hallo,

    ich habe hier ein kleines Testbeispiel in dem eine Funktion ein Feld übergeben bekommt und auch wieder ein Feld zurückgeben soll. (Die Funktion überprüft alle Elemente und macht aus jeder 1 eine 4)

    Dabei muss soweit ich mich erinnern kann der Zeigervektor zurückgegeben werden. Vielleicht könnte sich das jemand mal ansehen ich bekomm das leider nicht so ganz hin.

    Vielen Dank.

    #include <stdio.h>
    
    int** aus1mach4(int feld[2][2]);
    void ausgeben(int feld[2][2]);
    
    void main(void)
    {
    	int i;
    	int feld[2][2]={1,2,3,4};
    	int kopie[2][2];
    	kopie=aus1mach4(feld);
    	ausgeben(kopie);
    }
    
    int** aus1mach4(int feld[2][2])
    {
    	int i;
    	for(i=0;i<4;i++) if(feld[0][i]==1) feld[0][i]=4;
    	return feld;
    }
    
    void ausgeben(int feld[2][2])
    {
    	printf("%i", feld[0][0]);
    	printf("%i", feld[0][1]);
    	printf("%i", feld[1][0]);
    	printf("%i", feld[1][1]);
    }
    


  • Kannst du vllt. sagen, ob es einen KOmpilerfehler gibt oder ob es ein Logikfehler ist?

    (Die Funktion überprüft alle Elemente und macht aus jeder 1 eine 4)

    tut sie nicht sie überprüft feld[0][0], feld[0][1], feld[0][2], feld[0][3], wobei die letzten beiden gar nicht bestimmt sind.



  • Hi!

    Folgendes wird ausgegeben:

    C:\Programme\Microsoft Visual Studio\MyProjects\test\main.c(11) : warning C4047: '=' : 'int [2][2]' differs in levels of indirection from 'int ** '
    C:\Programme\Microsoft Visual Studio\MyProjects\test\main.c(11) : error C2106: '=' : left operand must be l-value
    C:\Programme\Microsoft Visual Studio\MyProjects\test\main.c(19) : warning C4047: 'return' : 'int ** ' differs in levels of indirection from 'int (*)[2]'

    feld[0][2] und feld[0][3] besetzen den gleichen Speicher wie feld[1][0] und feld[1][1], daher geht das schon.



  • #include <stdio.h> 
    
    int[b]*[/b] aus1mach4(int feld[2][2]); 
    void ausgeben(int feld[2][2]); 
    
    void main(void) 
    { 
        //int i; 
        int feld[2][2]={1,2,3,4}; 
        int kopie[2][2]; 
        [b]*(int*)kopie = *aus1mach4(feld);[/b]
        ausgeben(kopie); 
    } 
    
    int[b]*[/b] aus1mach4(int feld[2][2]) 
    { 
        int i; 
        for(i=0;i<4;i++) if(feld[0][i]==1) feld[0][i]=4; 
        [b]return (int *)feld; [/b]
    } 
    
    void ausgeben(int feld[2][2]) 
    { 
        printf("%i", feld[0][0]); 
        printf("%i", feld[0][1]); 
        printf("%i", feld[1][0]); 
        printf("%i", feld[1][1]); 
    }
    

    Funktioniert es?



  • Er sagt 0 Fehler, 0 Warnungen

    Die Ausgabe sind aber irgendwelche Zahlen ausm Speicher



  • Ich weiß nicht, ob du unbedingt die kopie brauchst, wenn nicht könntest du doch statt

    int kopie[2][2]; 
    *(int*)kopie = *aus1mach4(feld);
    ausgeben(kopie);
    

    dies

    aus1mach4(feld);
    ausgeben(feld);
    

    machen, da du in der aus1mach4-Funktion die Adressen von feld ansprichst.

    edit: es scheint, als ob die schleife nicht funktioniert. Laut debugger werden nur [0][0] und [0][1] untersucht und wenn du die 1 und die 4 beim initialisieren vertauschst, kommt dann auch nur 4231 raus


Anmelden zum Antworten