Problem mit free()

Hi.

Wenn ich das richtig sehe hast du ja sogar ein 3-dimensionales Array (welches du in einem 2 dim. Array abspeicherst).

Ich würde vermutlich auch ein 3-dim. Array verwenden, wenn sich für das Problem so eine Datenstruktur anbietet. (wie gesagt, ich kenne die Spielregeln nicht und weiß nicht warum man ein solches Raster benötigt usw.)

Ein 1-dim. Feld mußt du natürlich immer erweitern wenn du die Dimension änderst. Und du mußt natürlich die Elemente dann wieder auf die richtige Position schieben. Dazu brauchst du aber keine Kopie, das kannst du in situ mit einer temp. Variablen machen.

Gruß
 
aber wie machste das bei Erweiterung nach rechts/links****?

nach rechts erweitern: die unterste Zeile um 4 verschieben (Richtung höhere Indizes), die zweite von unten um 3, usw. ..., die 1. Zeile um 0 "verschieben", also gar nicht.

nach links erweitern: die unterste Zeile um 5 verschieben (Richtung höhere Indizes), die zweite von unten um 4, usw. ..., die 1. Zeile um 1 verschieben.

Gruß
 
Hi, also so wie ich es oben beschrieben habe, funktioniert es erstmal. Jetzt widme ich die nächste zeit erstmal dem restlichen programm.
Aber es ärgert mich schon enorm, dass ich da immer ne kopie erstelle, deshalb werd ich das am ende auch noch definitiv optimieren. Ich glaube sogar, dass ich gar keine tmp-variable brauche.....
 
So, das Programm ist soweit fertig und deshalb hab ich die Spielfeld-Erweiterung auch noch optimiert. Der Vollständigkeit halber poste ich hier noch fix den Code:
Code:
void erweitereSpielfeld(int x, int y, struct Feld *Karte){
    int i, j;
    if( x == xDim - 2){                             //Nach Unten erweitern
        if((feld_ptr = realloc(feld_ptr, (xDim + 1) * yDim * sizeof(struct Feld*))) != NULL){
            xDim++;
            for(i = 0; i < yDim; i++){
                feld_ptr[index(xDim - 1, i)] = NULL;
            }
            feld_ptr[index(x, y)] = Karte;
        } else Fehler();
    }
    if(x == 1){                                     //Nach Oben erweitern
        if((feld_ptr = realloc(feld_ptr, (xDim + 1) * yDim * sizeof(struct Feld*))) != NULL){
            for(i = xDim * yDim - 1; i >= 0; i--){
                feld_ptr[i + xDim] = feld_ptr[i];
            }
            for(i = 0; i < xDim; i++){
                feld_ptr[i] = NULL;
            }
            xDim++;
            feld_ptr[index(x + 1, y)] = Karte;

        }
    }
    if(y == 1){                                     //Nach links erweitern
        if((feld_ptr = realloc(feld_ptr, xDim * (yDim + 1) * sizeof(struct Feld*))) != NULL){
            printf("ERWEITERUNG NACH LINKS\n");
            yDim++;
            for(i = xDim - 1; i >= 0; i--){
                for(j = yDim - 1; j > 0; j--){
                    feld_ptr[index(i, j)] = feld_ptr[index(i, j) - (i + 1)];
                }
            }
            for(i = 0; i < xDim; i++){
                feld_ptr[index(i, 0)] = NULL;
            }
            feld_ptr[index(x, y + 1)] = Karte;


        } else Fehler();
    }
    if(y == yDim - 2){                              //Nach rechts erweitern
        if((feld_ptr = realloc(feld_ptr, xDim * (yDim + 1) * sizeof(struct Feld*))) != NULL){
            yDim++;
            for(i = xDim - 1; i >= 0; i--){
                for(j = yDim - 2; j >= 0; j--){
                    feld_ptr[index(i, j)] = feld_ptr[index(i, j) - i];
                }
            }
            for(i = 0; i < xDim; i++){
                feld_ptr[index(i, yDim - 1)] = NULL;
            }
            feld_ptr[index(x, y)] = Karte;


        } else Fehler();
    }
}

mit meiner vorherigen Methode waren das knapp 250 Zeile Code.....
so ists auf jeden Fall sehr viel übersichtlicher und das Programm auch schneller.
 
Zurück