2016-04-06 3 views
-1

Also habe ich Rätsel mit folgendem Format:Warum wird die Quellstruktur entsprechend der Kopie geändert?

1 2 3 
4 x 5 
6 7 8 

In dieser Funktion I ‚x‘ bewegen, 4 möglichen Variationen zu erzeugen, von denen jeder mit ‚x‘ Währungspositionen mit einem seiner Nachbarn.

Das Problem ist: Jedes Mal, wenn ich eine der Kopien modifiziere, wird auch die ursprüngliche Struktur geändert, so dass die nächsten Variationen die vorherigen xs akkumulieren. Am Ende der Funktion current ist:

1 x 3 
x 7 x 
6 x 8 

(die erste Änderung tatsächlich richtig ist, das ist, warum die mittlere 'x' verschwindet)

Mein Code:

struct state{ 
    char** puzzle; 
    // (...) 
    bool valid; 
    int xi; // x's row 
    int xj; // x's column 
}; 

void next_states(state current, state next[4]){ 
    next[0] = current; 
    next[1] = current; 
    next[2] = current; 
    next[3] = current; 

    if(current.xj-1>=0){ // moves 'x' left 
     next[0].puzzle[current.xi][current.xj] = current.puzzle[current.xi][current.xj-1]; 
     next[0].puzzle[current.xi][current.xj-1] = 'x'; 
     --next[0].xj; 
    } else { 
     next[0].valid = false; 
    } 

    if(current.xj+1<3){ // moves 'x' right 
     next[1].puzzle[current.xi][current.xj] = current.puzzle[current.xi][current.xj+1]; 
     next[1].puzzle[current.xi][current.xj+1] = 'x'; 
     ++next[1].xj; 
    } else { 
     next[1].valid = false; 
    } 
    if(current.xi-1>=0){ 
     next[2].puzzle[current.xi][current.xj] = current.puzzle[current.xi-1][current.xj]; 
     next[2].puzzle[current.xi-1][current.xj] = 'x'; 
     --next[2].xi; 
    } else { 
     next[2].valid = false; 
    } 
    if(current.xi+1<3){ // moves 'x'down 
     next[3].puzzle[current.xi][current.xj] = current.puzzle[current.xi+1][current.xj]; 
     next[3].puzzle[current.xi+1][current.xj] = 'x'; 
     ++next[3].xi; 
    } else { 
     next[3].valid = false; 
    } 

    print(current.puzzle); // ERROR: accumulating all the changes above 
} 
+0

Hat die Klasse einen richtigen Kopierkonstruktor und Kopierzuweisungsoperator? – NathanOliver

+1

Hinweis: Wenn Sie denken, dass 'char **' ein 2D-Array ist, liegen Sie falsch. Es ist keines und kann nicht als eins verwendet werden. Verwenden Sie stattdessen ein 2D-Array. – Olaf

+4

C und C++ sind verschiedene Sprachen! Wählen Sie die, die Sie tatsächlich verwenden, und entfernen Sie das falsche Tag! – Olaf

Antwort

3

Die Problem bezieht sich auf das Mitglied char** puzzle von Ihrem struct.

Sie kopieren state nach Wert innerhalb next[4], die Sinn macht, aber die struct enthält ein Zeigerobjekt.

Das bedeutet, dass ohne der Wert puzzle in alle erstellten state kopiert wird, die denselben Zeiger auf denselben Speicher verwenden.

Dies ist eindeutig nicht das, was Sie brauchen, aber da Sie mit einer Reihe von fester Größe arbeiten, warum Sie nicht etwas mehr geeignet verwenden, die beispielsweise ohne Austausch irgendetwas richtig von Wert kopiert werden, eine std::array:

struct state { 
    std::array<std::array<char, 3>, 3> puzzle; 
    ... 
} 
+0

Danke, @Jack! PS: Es fehlt ein Komma nach 'Array ' – plethora

Verwandte Themen