zweidimensionales char array (Dereferenzierungsprobleme)
-
Moin moin,
hab folgendes Problem:
An "rotate" wird eine 4x4 char-Matrix übergeben bzw. darauf gezeigt.
Diese Matrix enthält in jedem Feld entweder einen Buchstaben oder ein Leerzeichen.
In dieser Funktion soll "temp_pt" um 90° nach links gedreht werden.
Deswegen benötige ich eine temporäre Matrix "matr2d".
1. Warum enthält "matr2d" am Ende nicht dasselbe wie "temp_pt" sondern irgendwelche ASCII-Zeichen z.B. "@".
2. Warum bekomme ich folgende Warnungen:warning C4047: 'function' : Anzahl der Dereferenzierungen bei 'char (*)[4]' und 'char ** ' unterschiedlich
warning C4024: 'print_puzzleteil' : Unterschiedliche Typen für formalen und uebergebenen Parameter 1
void rotate(char temp_pt[][DIM_PUZZLETEIL]) { int z, s; char **matr2d; matr2d = (char**) malloc(sizeof(char*) * DIM_PUZZLETEIL); for(z = 0; z < DIM_PUZZLETEIL; z++) matr2d[z] = (char*) malloc(sizeof(char) * DIM_PUZZLETEIL); for(z = 0; z < DIM_PUZZLETEIL; z++) for(s = 0; s < DIM_PUZZLETEIL; s++) matr2d[z][s] = temp_pt[z][s]; print_puzzleteil(matr2d); // hier kommen die Warnungen } void print_puzzleteil(char puzzleteil[][DIM_PUZZLETEIL]) { ... }
-
matr2D ist bei dir vom Typ char**. print_puzzleteil erwartet einen char (*)[4]. Das sind zwei ganz unterschiedliche Typen, deshalb kommt nur Mist heraus.
-
Das hat mir der Compiler auch schon gesagt...
Wie müsste ich den matr2d deklarieren damit's klappt?
-
enci schrieb:
Wie müsste ich den matr2d deklarieren damit's klappt?
Hier ist eine mögliche Variante:
#include <stdio.h> #include <stdlib.h> // malloc #include <memory.h> // memcpy #define DIM_PUZZLETEIL 4 #define ARRAY_SIZE (DIM_PUZZLETEIL*DIM_PUZZLETEIL) void print_puzzleteil_1 ( char* puzzleteil ) { int z,s; for(z = 0; z < DIM_PUZZLETEIL; z++) for(s = 0; s < DIM_PUZZLETEIL; s++) printf("%c\n", puzzleteil[z*DIM_PUZZLETEIL+s]); } void print_puzzleteil_2 ( char puzzleteil[][DIM_PUZZLETEIL] ) { int z,s; for(z = 0; z < DIM_PUZZLETEIL; z++) for(s = 0; s < DIM_PUZZLETEIL; s++) printf("%c\n", puzzleteil[z][s]); } void rotate ( char temp_pt[][DIM_PUZZLETEIL] ) { char* matr2d; if ( NULL == ( matr2d = malloc ( ARRAY_SIZE ))) return; memcpy ( matr2d, temp_pt, ARRAY_SIZE ); print_puzzleteil_1 ( matr2d ); print_puzzleteil_2 ( (char (*)[4])matr2d ); free ( matr2d ); }
Weil deine Dimensionen feststehen, ist diese Variante wohl die bessere Wahl:
#include <stdio.h> #define XY 4 #define ARRAY_SIZE (XY*XY) void print_puzzleteil ( char puzzleteil[XY][XY] ) { int z, s; for( z = 0; z < XY; z++ ) for( s = 0; s < XY; s++ ) printf( "%c\n", puzzleteil[z][s] ); } void rotate ( char temp[XY][XY] ) { char copy[XY][XY]; memcpy ( copy, temp, ARRAY_SIZE ); print_puzzleteil ( copy ); }
-
Vielen Dank für deine Mühe!
Hab's inzwischen auch ohne malloc gelöst.
Nur verstehe ich den Ausdruck "(char (*)[4])matr2d )" leider immer noch nicht. Wie kann man das denn interpretieren?Vielleicht zum besseren Verständnis: temp_pt ist eine Kopie von puzzle_teil1,
welches folgendermaßen definiert ist:char puzzle_teil1[DIM_PUZZLETEIL][DIM_PUZZLETEIL] = {{'r',' ',' ',' '}, {'r','r',' ',' '}, {'r',' ',' ',' '}, {' ',' ',' ',' '},};
-
enci schrieb:
Nur verstehe ich den Ausdruck "(char (*)[4])matr2d )" leider immer noch nicht. Wie kann man das denn interpretieren?
Ein Cast von matr2d zu einem Zeiger auf ein char[4]. Also zu dem Typen, den deine Funktion erwartet.
-
[quote="enci"]
char ()[4] bedeutet soviel wie Zeiger auf ein oder mehrere Array vom Typ char der Dimension 4.
Wird hier benutzt, um von char auf char (*)[4] zu casten und dient eigentlich nur dazu, damit der Compiler nicht meckert. Wichtig ist ja nur, dass der Zeiger auf das erste Element eines zusammenhängenden Speicherbereichs ankommt.
-
Vielen Dank für eure Hilfe