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 weiter

    void 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: 000014d9

    lä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 programm 😉

    mfg 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));
    ...
    

Anmelden zum Antworten