Hallo, ich bins wieder.....
ich stehe vor folgendem Dilemma:
Ich habe ein globales Spielfeld:
Dieses beinhaltet wieder pointer auf struct Feld. Also quasi
Das Spiel funktioniert nach dem Prinzip Karten-Anlegen.
Wichtig: Die beiden äußeren Spalten SOWIE Reihen sind immer NULL! (Brauche ich für iwelche Prüfmethoden)
Das Spielfeld besteht anfangs deshalb aus 25 Feldern (soll heißen, dass dann nur das Feld in der Mitte belegt ist)
Was nun folgt ist klar: Wenn ich irgendwo am Rand anlege, muss ich das Spielfeld erweitern. Dazu habe ich mir jetzt folgende Funktion geschrieben:
Es geht übrigens hauptsächlich um die Zeilen 38 - 42.....falls irgendjemandem beim 1. Hinsehen der Fehler auffallen sollte.....
Der Code zeigt jetzt natürlich nur die Erweiterung in eine einzige Richtung, aber den ganzen Code wär wohl etwas zu viel des Guten.
So: Ihr seht hier die Erweiterung nach "links", also eine Spalte soll links angefügt werden.
Ich dachte mir einfach, ich nehm mir den " **feld_helper "
---> kopier mein aktuelles Feld darein
---> ändere mein eigentliches Feld ab
---> kopiere das alte Feld ins Neue
---> Füge die neue Karte ein.
Tja, klappt nicht. Er hängt sich bei der Position [2][2], also bei der einzigen Karte, die liegt, auf!
Ich habe jetzt halt überlegt, ob es daran liegt, dass beide Spielfelder ja auf denselben Speicherplatz zeigen!?
Dem wollte ich abhelfen, indem ich Zeile 9 - 19 erstellt habe und dort eine ganz neue Struktur erstelle......geht aber auch nicht.
Hat hier irgendjemand eine Lösung dazu?
Oder vllt ne Lösung für das "Erweiterungsproblem" an sich und nicht nur zum free().
Es führen ja bekanntlich viele Wege zum Ziel.
Ich bedanke mich im Voraus schonmal bei allen, die sich die Mühe machen den Text & Code zu lesen******
gruss micha
ich stehe vor folgendem Dilemma:
Ich habe ein globales Spielfeld:
Code:
struct Feld **feld_ptr;
Dieses beinhaltet wieder pointer auf struct Feld. Also quasi
Code:
struct Feld *Inhalt;
Das Spiel funktioniert nach dem Prinzip Karten-Anlegen.
Wichtig: Die beiden äußeren Spalten SOWIE Reihen sind immer NULL! (Brauche ich für iwelche Prüfmethoden)
Das Spielfeld besteht anfangs deshalb aus 25 Feldern (soll heißen, dass dann nur das Feld in der Mitte belegt ist)
Was nun folgt ist klar: Wenn ich irgendwo am Rand anlege, muss ich das Spielfeld erweitern. Dazu habe ich mir jetzt folgende Funktion geschrieben:
Es geht übrigens hauptsächlich um die Zeilen 38 - 42.....falls irgendjemandem beim 1. Hinsehen der Fehler auffallen sollte.....
Code:
void erweitereSpielfeld(int x, int y, struct Feld *Karte){
int i, j;
struct Feld **feld_helper;
if(y == 1){
if((feld_helper = malloc(xDim * yDim * sizeof(struct Feld*))) != NULL){
for(i = 0; i < xDim; i++){ //Mache Kopie von altem Feld
for(j = 0; j < yDim; j++){
/////if(feld_ptr[index(i, j)] != NULL){
///// struct Feld *hilfskarte;
///// if((hilfskarte = malloc(sizeof(struct Feld))) != NULL){
///// hilfskarte->N = feld_ptr[index(i, j)]->N;
///// hilfskarte->O = feld_ptr[index(i, j)]->O;
///// hilfskarte->S = feld_ptr[index(i, j)]->S;
///// hilfskarte->W = feld_ptr[index(i, j)]->W;
///// feld_helper[index(i, j)] = hilfskarte;
///// } else Fehler();
/////} else feld_helper[index(i, j)] = NULL;
feld_helper[index(i, j)] = feld_ptr[index(i, j)];
}
}
if((feld_ptr = realloc(feld_ptr, xDim * sizeof(struct Feld*))) != NULL){
for(i = 0; i < xDim; i++){ //Erste Spalte erstmal auf NULL setzen
feld_ptr[index(i, 0)] = NULL;
}
for(i = 0; i < xDim; i++){ //Kopiere altes Feld in neues Feld
for(j = 0; j < yDim; j++){
feld_ptr[index(i, j + 1)] = feld_helper[index(i, j)];
}
}
//FELD = Karte; //Speichere neue Karte im Spielfeld
//yDim++;
} else Fehler();
for(i = 0; i < xDim; i++){
for(j = 0; j < yDim; j++){
//free feld_helper
printf("bin drin, i: %i j: %i\n", i, j);
free(feld_helper[index(i, j)]);
}
}
yDim++;
FELD = Karte;
} else Fehler();
}
//free(feld_helper);
}
Der Code zeigt jetzt natürlich nur die Erweiterung in eine einzige Richtung, aber den ganzen Code wär wohl etwas zu viel des Guten.
So: Ihr seht hier die Erweiterung nach "links", also eine Spalte soll links angefügt werden.
Ich dachte mir einfach, ich nehm mir den " **feld_helper "
---> kopier mein aktuelles Feld darein
---> ändere mein eigentliches Feld ab
---> kopiere das alte Feld ins Neue
---> Füge die neue Karte ein.
Tja, klappt nicht. Er hängt sich bei der Position [2][2], also bei der einzigen Karte, die liegt, auf!
Ich habe jetzt halt überlegt, ob es daran liegt, dass beide Spielfelder ja auf denselben Speicherplatz zeigen!?
Dem wollte ich abhelfen, indem ich Zeile 9 - 19 erstellt habe und dort eine ganz neue Struktur erstelle......geht aber auch nicht.
Hat hier irgendjemand eine Lösung dazu?
Oder vllt ne Lösung für das "Erweiterungsproblem" an sich und nicht nur zum free().
Es führen ja bekanntlich viele Wege zum Ziel.
Ich bedanke mich im Voraus schonmal bei allen, die sich die Mühe machen den Text & Code zu lesen******
gruss micha