Dynamische, mehrdimensionale Felder



  • Hallo, wir sollen für die Uni ein Memoryspiel programmieren, bei dem der Benutzer selbst die Größe des Spielfeldes bestimmen darf.
    Ich bekomme leider die Fehlermeldung "Der Ausdruck muss den Typ 'pointer to object' aufweisen".

    char *feld;
    char *spielfeld;
    int n, m, a=1, i, j;
    
    feld = malloc((n*m) * sizeof(char));
    spielfeld = malloc((n*m )* sizeof(char));
    
    	for (i = 0; i < n; i = i + 2)
    	{
    		for (j = 0; j < m; j++)
    		{
    			if ((n*m) / 2 != 0) 
                           //Falls das Spielfeld eine ungerade Anzahl an Karten hat,
                           //wird der Platz oben links hiermit 'freigehalten'.
    			{
    				feld[0][0] = 'O';
    				spielfeld[0][0] = 'O';
    				i = 1;
    				continue;
    			}
    			feld[i][j] = a; 
    			feld[i][j+1] = a;
    			spielfeld[i] = 'X'; //X= verdeckte Karte
    			spielfeld[i + 1] = 'X';
    			a++;
    		}
    	}
    

    Die Variable a wird immer jeweils zwei Karten zugeordnet, welche dann ein Pärchen ergeben.

    Ich weiß leider wirklich nicht weiter und konnte auch im Internet nichts hilfreiches zu dem Thema finden.
    Vielen Dank im Voraus 😋



  • Der Compiler gibt zur Fehlermeldung noch die Zeilenummer und oft sogar die Spalte an, in der er den Fehler findet.
    Das ist ungemein hilfreich bei der Fehlersuche.

    Das Forum unterstützt Code-Tags, dann bleibt die Formatierung erhalten und es gibt sogar Zeilennummern.
    Code markieren und auf den C-Button unter dem 😡 klicken.
    Als Mitglied geht das noch nachträglich.

    Welche Werte haben n und m?

    feld ist kein Doppelzeiger und auch kein 2D-Array.
    Daher ist der Zugriff mit zwei Indizes nicht möglich.

    Reichen 128 (bzw 256) Kartenpaare aus?



  • Das wusste ich nicht, ich habe es jetzt geändert 😋
    Der Fehler ist in Zeile 16, 17, 21 und 22, also immer dann wenn ich versuche das Spielfeld wie ein 2 dimensionales Feld zu behandeln.
    Ich habe schon überlegt, mit einem eindimensionalen Feld zu arbeiten falls das so nicht funktioniert. Mein Dozent hat mir aber gesagt, dass es auch mit einem zweidimensionalen Feld funktionieren würde.
    Ich brauche höchstens 112 Kartenpaare, da das Feld nicht größer als 15*15 Plätze groß werden darf.
    n und m werden vom Benutzer eingegeben, n steht für die gewünschte Zeilenanzahl und m für die Spalten.



  • [x][y] kannst du nur nutzen wenn die Variable auch mit [][] definiert wurde - du musst es dynamisch machen also geht es nicht

    du musst den index bei feld[...] berechnen ueber deine breite/hoehe



  • Dynamische Mehrdimensionalitäten bildet man (ab C99) mit Zeiger auf VLA ab:

    int main()
    {
    	int z = 4;
    	int sp = 5;
    	char (*feld)[sp] = calloc(1,z*sp); /* Feld der gewünschten Größe DYNAMISCH definieren */
    
    	for(int x=0;x<z;++x,puts(""))for(int y=0;y<sp;++y) putchar('0'+feld[x][y]); /* Kontrollausgabe */
    
    	feld[1][2] = 1; /* Beispiel-Befüllungen */
    	feld[2][1] = 1;
    	feld[3][0] = 1;
    
    	puts("");
    	for(int x=0;x<z;++x,puts(""))for(int y=0;y<sp;++y) putchar('0'+feld[x][y]); /* Kontrollausgabe */
    
    	free(feld);
    
    	return 0;
    }
    
    00000
    00000
    00000
    00000
    
    00000
    00100
    01000
    10000
    

    https://ideone.com/DJnSxI



  • Bei 15*15 kannst du am Anfang auch das maximale Feld definieren.

    Du brauchst ja nur einen Teil davon benutzen.

    In deinem bisherigen Code sind m und n unbelegt. die können jeden beliebigen Wert eine int haben.
    Dann kommt beim malloc evtl nur Mist raus.


Anmelden zum Antworten