Zwei verschieden dimensionale Arrays mit denselben Adressen
-
Hi,
Ich bastele gerade an nem Sudoku-Spiel und habe dazu das Spielfeld in ein dynamisches 9*3*3 Array geschrieben.Um die Korrektheit der Spalten/Zeilen zu überprüfen ist es aber sinnvoller ein 9*9 Array zu haben.
Meine Versuche habe letztlich zu dem geführt:
sudoku::sudoku() { int n=0; int p=0; int q=0; m_Feld = new int **[9]; for (int i=0; i<9; i++) { m_Feld[i]=new int*[3]; for (int j=0; j<3; j++) { m_Feld[i][j]=new int[3]; for (int k=0; k<3; k++) { m_Feld[i][j][k]=0; } } } m_Feld2 = new int**[9]; for (int i=0; i <9; i++) m_Feld2[i]=new int*[9]; while (n<9) { for (int i=0; i<3; i++) { for (int j=n; j<n+3;j++) { for (int k=0; k<3; k++) { m_Feld2[p][q]=&m_Feld[j][i][k]; q++; if(q==8) { q=0; p++; } } } } n+=3; } }Das produziert allerdings nen Programmabsturz.
Bin immernoch sehr am zweifeln, ob ich die Frage überhaupt posten soll, weil es eigentlich so ne billige Sache ist, aber ich komme da irgendwie nicht weiter. Sieht jemand den Fehler?
-
Dein Code ist ein ziemliches Gefrickel. Nicht nur, dass ich ebenfalls nicht verstehe, warum 9*3*3, sondern auch der geteilte Speicher mit
m_Feld2[p][q]=&m_Feld[j][i][k];ist äusserst anfällig, besonders beim Freigeben.
Warum nimmst du nicht ein Feld mit 9*9, also 81 Elementen? Die Indizes kannst du dann abbilden über eine Funktion
int At(unsigned int x, unsigned int y).Viel einfacher wäre es natürlich, gleich fertige Container wie
std::vectoroderboost::multi_arrayzu nehmen. Aber wenn du aufnew[]beharrst, verwende auchdelete[]zur Freigabe und kapsle das Ganze ordentlich, sodass man es ohne Zeigerverbiegungen benutzen kann.
-
Mal eine Idee für den Feldzugriff:
std::vector<int> feld(9*9); /* sub - linke obere Ecke des Quadrates 0,0 ... 3,3 ... 6,6 x,y - Position im Quadrat 0,0 ... 1,1 ... 2,2 wenn sub == 0,0 kann ueber das gesamte Feld iteriert werden x,y --> 0,0 ... 8,8 */ int zahl(size_t subx, size_t suby, size_t x, size_t y) { return feld.at((suby + y) * 9 + (subx +x)); }