Wie kann ein Doppel-pointer verwendet werden, für die eine zwei-dimensionale matrix?
Ich versuche, meine hand auf C durch die Implementierung von Conway ' s game of Life.
Ich versuche, dynamisch zu erstellen zwei Netze (int
Matrizen), eine für die aktuelle und für die nächste generation, also nachdem ich bestimmen, was in der nächsten generation aussieht, habe ich nur die swap-Zeiger.
Zuerst habe ich versucht hoffnungslos definieren Sie den Zeiger, um das raster wie int * grid
, die Sie nicht Tiefgestellt mit einem zweiten Satz von Klammern wie [][]
weil - offensichtlich - der erste Satz von Klammern gibt ein int.
Ich habe auch versucht, so etwas wie int * grid[HEIGHT][WIDTH]
, aber das gibt Probleme mit der Zuordnung ein Zeiger, wie dieser zu einem anderen. (Und in der Tat, ich habe keine Ahnung, was diese wirklich im Gedächtnis!)
In meiner naiven Hoffnung, dachte ich, könnte das folgende funktionieren nach stolpern über Doppel-Zeiger. Das Programm kompiliert, aber nicht beim laufen auf der Linie angegeben. (In Windows bekomme ich keine mehr detail anderes, als dass das Problem Event Name APPCRASH
).
HAFTUNGSAUSSCHLUSS: Dies ist nicht das eigentliche Programm, nur ein proof-of-concept für das problem.
#include <stdio.h>
#include <stdlib.h>
int HEIGHT = 20;
int WIDTH = 20;
int ** curr_gen; //Current generation
int ** next_gen; //Next generation
/* Entry Point main */
int main(int argc, char** argv) {
//Allocate memory for the grids
curr_gen = malloc(sizeof (int) * WIDTH * HEIGHT);
next_gen = malloc(sizeof (int) * WIDTH * HEIGHT);
curr_gen[0][0] = 0; //<< PROGRAM FAILS HERE
//Release heap resources
free(curr_gen);
free(next_gen);
return 0;
}
- c-faq.com/aryptr/dynmuldimary.html
- Sie können nicht einen link Antworten. Um Ihren Fall, die Sie benötigen, um zu verstehen, was Los ist in Speicher
- Der Begriff "doppelte pointer" ist mehrdeutig. Es kann bedeuten, entweder ein Zeiger auf Zeiger (Typ
some_type**
) oder ein Zeiger auf Typdouble
(double*
).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen gemeinsamen Weg, dies zu tun ist beschrieben in http://c-faq.com/aryptr/dynmuldimary.html
Können Sie ganz einfach reservieren Sie den Raum und warf den Zeiger auf den Typ, das legt die col-und row-Größen. Auf der Suche nach einem Zeiger über [][] ist teuer. Und Aufbau eines dynamischen mehrdimensionalen array auf diese Weise sollte reserviert werden für ragid-arrays.. SPRICH: nur verwenden, wenn notwendig.
Können Sie einen Typ definieren:
Und dann warf die malloc Zeiger auf den Typ Sie möchten:
Allerdings setzt dies Voraus, dass Sie eine bekannte und Konstante zur compile-Zeit, Höhe und Breite. Wenn es muss dynamisch sein, dann mit allen Mitteln verwenden Sie den index in einen Zeiger-Tabelle-Methode. Aber denken Sie daran, dass der eigentliche Zeiger schaute nach oben geladen werden muss, in der letzten möglichen minute führt zu Pipeline stalls, und potenzielle cache-misses. So dass es 100-mal teurer als nur tun die Mathematik selbst über [row * 20 + col].
Also die eigentliche Frage die Sie sich stellen sollten ist, "braucht es Nicht, um schnell zu laufen, oder muss ich den code zu schauen 'Ordentlich'?"
Können Sie einfach
int*
als die Art von raster auf meine Weise.Konvertieren der 2D-position zu 1D durch ein makro definieren, oder eine Funktion:
Besuchen Sie die Daten für die 2D-position in
int*
: