Fragen zu Pointern



  • Hi,

    ich soll eine Hashtable schreiben nur habe ich ein paar COmpilerwarnungen die ich nicht so ganz verstehe.

    also die definition für die wichtigen sachen ist:

    typedef struct _node
    {
        char *key;
        int value;
        struct _node *next; 
    } node;
    
    typedef struct
    {
        node **slot;
    } hash_table;
    

    nun will ich mit einen node array auf slot verweisen

    hash_table *create_hash_table()
    {
       /* speicher fuer den root und das nodes array
       * allokieren */
       hash_table *ht = malloc(sizeof(hash_table));
       node *nodes = malloc(currentSize * sizeof(node));
       if (ht == NULL || nodes == NULL)
       {
          printf("Fehler bei Allokierung!");
          return NULL;
       }
       ht->slot = (node*) nodes; /* hier kommt der fehler */
    
       return ht;
    }
    

    nur bekomme für die gegebene zeile die meldung
    hash_table.c:85: warning: assignment from incompatible pointer type
    was muss ich tun um das weg zu bekommen?



  • Ich hab selbst < 1 Jahr C++ Erfahrung, deshalb sind die Angaben ohne Gewaehr 😉

    slot ist bei dir ein "Pointer auf einen Pointer auf einen node". Du uebergibts aber nur einen einfachen Pointer. Du koenntest einerseits folgendermassen zuweisen (C++-Syntax und ungetestet)

    ht->slot = new slot*[currentSize]; // Die ganzen nodepointer anfordern
    for(unsigned int = 0;i < currentSize; ++i)
         slot[i] = &(nodes[i]); // jedem nodepointer die adresse des nodes in 'nodes' zuweisen
    

    Allerdings ist das keine sehr sinnige Methode, du brauchst keinen Doppelpointer. Ein Pointer stellt ja lediglich das erste Element in einem Array da. Mach's doch einfach so:

    typedef struct
    {
      node *slot;
      t_size size;
    } hash_table;
    

    Musst halt die groesse des Arrays mitspeichern.



  • Hi,

    danke werden es mal so testen, kann leider an den struct nichts ändern ist so in der Aufgabenstellung gegeben 🙂

    noch ne frage will dann alles wieder freigeben

    void free_hash_table(hash_table *ht)
    {
       /* erst fuer jeden bucket free_list aufrufen
       * und danach die hash_table deallokieren
       * wobei slot der pointer auf das erste
       * element des node arrays ist
       */
       int i = 0;
       for (i = 1; i <= currentSize; i++)
       {
          free_list((ht->slot)+i);
       }
       free(ht->slot);
       free(ht);
    }
    
    hash_table *create_hash_table()
    {
       /* speicher fuer den root und das nodes array
       * allokieren */
       hash_table *ht = malloc(sizeof(hash_table));
       node *nodes = malloc(currentSize * sizeof(node));
       if (ht == NULL || nodes == NULL)
       {
          printf("Fehler bei Allokierung!");
          return NULL;
       }
       ht->slot = (node*) nodes;
    
       return ht;
    }
    

    habe mal in den code geschrieben was ich denke wie es ablaufen müsste, nur bekomme immer den fehler ich versuche speicher freizugeben den ich nicht allokiert habe.
    Und das kann ich nicht ganz nachvollziehen, den versuche doch nur durch alle elemente des arrays zu gehen und da zu schauen ob es einträge gibt und für die free aufzurufen.
    free_list((ht->slot)+i); wobei ich hier auch noch n poiunter fehler bekomme



  • sebf

    vielleicht solltest du dir einfach über das Konzept von Zeigern und was du da genau tust einfach besser klar werden. Eine von den vielen möglichen Informationsquellen ist z.B. http://www.pronix.de/pronix-623.html

    tt



  • danke, ja ist was ziemlich neues und ist schon an manchen stellen schwer nachzuvollziehen was da passiert 🙂


Log in to reply