problem mit array und zeiger
-
hallo,
also vorweg muss ich sagen das ich gerade erst mit C++ angefangen habe, und folgendes programm mein erstes ist. (hab etwas vb erfahrung).also zum problem:
ich versuche den A* nachzubauen komm aber an dieser stelle nicht weitervoid DefineNodes () { int x, y; int i; i=0; for (x=0;x<10;x++) { for (y=0;y<10;y++) { node[x][y].mapcoordx=x; node[x][y].mapcoordy=y; node[x][y].kosten= GetKosten (mymap[x][y]) ; if (GetKosten (mymap[x][y])==0) { node[x][y].walkable=0; } else { node[x][y].walkable=1; } node[x][y].id=i; *pointer[i] = node[x][y]; // hier ist das problem!! i++; } }
der compiler(DEV-C++) zeigt keinen fehler und nur eine warnung an(das keine newline am ende ist) aber das dos-fenster stürtzt mit folgendem fehler ab (winxp):
pfadeinstieg.exe hat ein Problem festgestellt und muss beendet werden.
AppName: pfadeinstieg.exe AppVer: 0.0.0.0 ModName: pfadeinstieg.exe
ModVer: 0.0.0.0 Offset: 000014d9lässt man die zeile "*pointer=..." weg läuft das programm sauber.
so sind die beiden sachen deklariert:
struct nodes { int id; int parent_id; float path_fscore; float path_heuristic; int mapcoordx,mapcoordy; int kosten; int walkable; }node[10][10]; struct nodes *pointer[110];
ich hoffe jemand weiß da rat (und das ich mich nicht ins fettnäpfchen gesetzt hab
)
mfg bo
-
Zeig doch mal wie node deklariert ist und versuchs dann mal mit:
// pointer ist ein Array von Zeigern auf Nodes // pointer[i] ist ein bestimmter Zeiger auf einen Node // node[x][y] ist ein bestimmter Node // &(node[x][y]) ist die Adresse eines bestimmten Nodes pointer[i] = &(node[x][y])
Weiters:
- Wieso ist pointer 110 Elemente groß und x*y aber nur 100?
- Wenn du C++ udn nicht C programmierst, wieso deklarierst du dann alle Variablen am Beginn eines Blocks?So ganz blick ich da nicht durch...
MfG SideWinder
-
SideWinder schrieb:
Zeig doch mal wie node deklariert ist und versuchs dann mal mit:
// pointer ist ein Array von Zeigern auf Nodes // pointer[i] ist ein bestimmter Zeiger auf einen Node // node[x][y] ist ein bestimmter Node // &(node[x][y]) ist die Adresse eines bestimmten Nodes pointer[i] = &(node[x][y])
Weiters:
- Wieso ist pointer 110 Elemente groß und x*y aber nur 100?
- Wenn du C++ udn nicht C programmierst, wieso deklarierst du dann alle Variablen am Beginn eines Blocks?So ganz blick ich da nicht durch...
MfG SideWinder
danke für die schnelle antwort, aber das tut es auch nicht
compiler gibt folgendes aus:119 D:\_C++\PfadEinstieg\pfadeinstieg.cpp no match for 'operator=' in ' *pointer[i] = ((((x * 10) + y) * 32) + (&node))'
error D:\_C++\PfadEinstieg\pfadeinstieg.cpp:28 candidates are: nodes& nodes::operator=(const nodes&)p.s. die 110 beim array ist nur ein überbleibsel und schon korrigiert
ich werd selbst nochmal suchen, ansonsten post ich mal das ganze programmmfg bopp (ja ein schöner name)
-
Zeig mal lieber her was node sein soll!
MfG SideWinder
-
das ist node
struct nodes { int id; int parent_id; float path_fscore; float path_heuristic; int mapcoordx,mapcoordy; int kosten; int walkable; }node[10][10];
und das ist der zeiger
struct nodes *pointer[100];
-
@Side
Nur weil man die Freiheit hat in C++ Variablen zu deklarieren, wo immer man will, muss nicht heißen, dass man das auch tun muss ;).@bopp
Ein Fehler ist schon mal, dass du vor Pointer den * machst. Denn somit machst du einen Zeiger auf 100 Elemente deiner Struktur und so wie es im Quellcode aussieht, brauchst du einfach nur ein Array mit 100 Elementen von deiner Struktur.*pointer[i] = node[x][y];
So einfach wenn das Kopieren von Strukturen funktionieren würde :).
Du hast zwei Möglichkeiten:
- Entweder du kopierst jedes einzelne Element deiner Struktur
also so:pointer[i].id = node[x][y].id; pointer[i].parent_id = node[x][y].parent_id; ...
- oder du machst zusätzlich eine Union
das sieht dann so aus:typedef struct { int id; int parent_id; float path_fscore; float path_heuristic; int mapcoordx,mapcoordy; int kosten; int walkable; } st_node; typedef union { st_node daten; char bytes[64]; //gehen wir mal sicher und reservieren mehr als nötig ;) } un_node; un_node nodes[10][10]; un_node pointer[100];
Die Zuweisung sieht dann nur noch so aus:
#ifdef cplusplus #include <cstring> #else #include <string.h> #endif ... strncpy(pointer[i].bytes, nodes[x][y].bytes, sizeof(st_node)); //oder auch so //memcpy(pointer[i].bytes, nodes[x][y].bytes, sizeof(st_node)); ...