Problem mit 2-dimensionalen Arrays

Schnacki

Mitglied
Tag zusammen,

versuche mich gerade in C reinzuarbeiten, doch finde bei folgendem Programm den Fehler nicht.
C:
typedef int * FIELD[3];


void copy_field(FIELD src,FIELD target) {
	int i;
	for(i=0; i<9; i++) {
		target[i/3][i%3]=src[i/3][i%3];
	}
}



FIELD save_field(FIELD src) {
	FIELD **target;
	target = (int *) malloc(3*sizeof(int *));
	int i;
	for(i=0; i<3; i++) {
		target[i]= (int) malloc(3*sizeof(int));
	}
	copy_field(src,target);
	return target;
}

Bei der Kompilierung erscheint folgendes:

gcc test.c -o test_prog
In file included from test.c:1:
feld.h:21: error: ‘save_field’ declared as function returning an array
feld.h: In function ‘save_field’:
feld.h:23: warning: assignment from incompatible pointer type
feld.h:26: warning: assignment makes pointer from integer without a cast
feld.h:28: warning: passing argument 2 of ‘copy_field’ from incompatible pointer type
feld.h:12: note: expected ‘int **’ but argument is of type ‘int * (**)[3]’
feld.h:29: warning: return makes integer from pointer without a cast

Könnt ihr mir sagen, was ich an de m Abschnitt oben abändern muss?
 
Hi

nicht das eigentliche Problem, aber:
Beim ersten malloc sollte in int** statt int* gecastet werden.
sizeof(int*) passt aber, mit nur einem Stern.

Beim malloc in der Schleife auch entsprechend int* statt int nehmen (wieder nur beim Cast, nicht im Sizeof).

Zum eigentlichen Problem: Wenn FIELD einfach nur int wäre, würde alles passen.
Wozu so ein seltsames typedef?
C++:
typedef int FIELD;
und fertig.

Gruß
 
Hi.
nicht das eigentliche Problem, aber:
Beim ersten malloc sollte in int** statt int* gecastet werden.
Eigentlich sollte in C der Rückgabewert von malloc/calloc überhaupt nicht gecastet werden. Casten verschleiert nur Probleme; malloc gibt void* zurück und das kann in C implizit in jeden anderen Zeigertyp konvertiert werden.
Zum eigentlichen Problem: Wenn FIELD einfach nur int wäre, würde alles passen.
Nicht ganz. FIELD soll ein 2D Array sein. Dementsprechend müßte FIELD als Zeiger auf ein Array definiert werden:
C:
typedef int (*FIELD)[3]; // Zeiger auf int-Array der Größe 3

Gruß
 
Zurück