Forum: Kommentarer på en hash table

Forum huvudsida -> Programmering -> Kommentarer på en hash table

Sidor: 1

Till botten

Aderyn 20:51 - 21:a April 2007 | Post #1
Medlem
Inlägg: 27


Skicka PM
Tja,

(Jag fick syn på blinkenlightströjor som sprang runt på dh och blev medlem i samband med det men har inte orkat skriva förut.)

Jag tänkte skriva en irc-server i C för att lära mig. Har ett antal års erfarenhet av programmering i olika språk, men jag är inte så van vid just C. Tänkte att jag skulle göra ett halvstort projekt för att komma in i det.

Följande hash table är tänkt att användas för användar-listan resp. kanal-listan så jag kan göra snabba lookups. Eventuella kommentarer på valet av datastruktur är också av intresse. På freenode mumlade någon något om att ett träd skulle vara bättre, men jag känner ändå att en hashtable borde fungera.

Koden fungerar men jag antar att det finns en del minnesläckor, och säkert en del systemfel/dålig vanor som är svåra för mig som författare att se.

Av någon anledning jag inte riktigt kan sätta fingret på så får free(cur); i hashtable_delete glibc att hoppa ur och ge en traceback också.
http://lanfear.c0la.se/~emil/hashtable.txt /a>

- Emil

-------------------------
Ingen signatur!

Senast redigerad 20:52 - 21:a April 2007


Slash 01:49 - 22:a April 2007 | Post #2
Medlem
Inlägg: 141


Skicka PM
I just en IRC-klient spelar det nog inte så otroligt stor roll, tror en hashtable kan fungera bra. Angående dina problem så vet jag inte vad du använder för C-kompilator, men det kompilerar inte för mig. Använder jag en C++-kompilator så kompilerar det åtminstone, då hittade jag att du har allokerat för lite minne på rad (runt) 78. D.v.s:
  1. cur = (struct bucket*)malloc(sizeof(struct bucket*));

som allokerar på tok för lite minne. Verkar vara ett genomgående tema när du allokerar minne. Tänk på att när du ska allokera minne till 5 my_struct:ar så är det:
  1. struct my_struct *p = (struct my_struct*)malloc(sizeof(struct my_struct) * 5);

och inte

  1. struct my_struct *p = (struct my_struct*)malloc(sizeof(struct my_struct*) * 5);


Eftersom du då bara får storleken på en pekare (som på många platformar bara är 4 bytes).

Rätta till det och se om det fungerar åtminstone lite bättreSmiley

Lycka till med din fortsatta C-programmeringskarriär!


-------------------------
Ingen sigantur!



Aderyn 02:55 - 22:a April 2007 | Post #3
Medlem
Inlägg: 27


Skicka PM
Kompilerar under gentoo med gcc.
gcc version 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)

Tack för påpekandet med minnesallokeringen. Funderat på det, men inte varit säker. Löste även problemet med att glibc klagade på minneskorruption.Smiley

-------------------------
Ingen signatur!

Senast redigerad 03:00 - 22:a April 2007


sdac 13:48 - 23:e April 2007 | Post #4
Medlem
Inlägg: 235


Skicka PM
Använd valgrind i fortsättningen när du löser minnesrelaterade problem så tjänar du några timmars fundering.

Eftersom du använder gentoo så:
emerge -av valgrind

Sen startar du programmet hel vanligt fast under valgrind, t.ex.:
valgrind ./a.out

Annars:
http://valgrind.org/

EDIT: Valgrind skulle även ha upptäckt problemet du hade, t.ex. att man allokerar plats för en int* (dvs, storleken på pekaren) och refererar till det som en int x[y] där &x+y*sizeof(int) blir högre än &x+sizeof(void*). Liknande problem märks ibland inte utan valgrind, t.ex. på 64-bitars system har pekare storlekar på 8 byte, vilket ger en plats för två 32-bitars integervärden som oftast även på 64-bitars system denoteras med 'int'. Men valgrind upptäcker det.



Senast redigerad 16:20 - 24:e April 2007


Sidor: 1

Forum huvudsida -> Programmering -> Kommentarer på en hash table
Atom feed

Du får inte posta i den här tråden | Till toppen