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])
    {
    ...
    }
    

  • Mod

    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',' ',' ',' '},
    		                                             {' ',' ',' ',' '},};
    

  • Mod

    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 🙂


Anmelden zum Antworten