Extendible Hashing mit quicksort
-
Danke fuer den Tip,das ist mein erstes Post ueberhaupt auf einem Programmier-Forum *blush*
Die Sache ist,ich kenne mich mit Debugger nicht aus und da ich das dringend loesen muss dachte ich mir dass es sich nicht auszahlt...deswegen hab ich nur "per Hand" Bugs geloest bis jetzt...siehst du vlt oben irgendwas was auf ein Bus Error deuten koennte?
LG
M.
-
for (size_t i=(num_werte-1);i>=nl; i--)Kann n1 Null werden?
Wenn ja hast du da ein Problem.
-
Hm,nl hat das Wert 0 (Compiler hat die ganze Zeit geschrien,dass unsigned und int vergliechen wurden,deswegen)...warum ist das ein Problem? Ich meine auf wert[0] wollen wir den Funktor auch anwenden,nicht?
LG
-
size_t ist ein vorzeichenloser Ganzzahltyp (das dürfte es sein, worauf dich auch der Compiler aufmekrsam machen wollte), das hat keine negativen Werte. Wenn du einer vorzeichenlosen Null nach unten gehst, landest du nicht bei -1 (die gibt's nicht), sondern provozierst einen Unterlauf, der dich zum größten darstellbaren Wert bringt.
-
ja, aber nachdem n1 null ist, wird es um 1 verringert. Dann ist es minus eins. Aber, n1 ist unsigned. Also ist es auf jeden Fall nicht negativ. Und damit auf jeden Fall >= 0. Und schon haste ne endlosschleife
-
Wow,dankeschoen! Ich hab es behoben,aber anscheinend gibt es immer noch das Buss Error...ich wuerde so gerne wissen warum..Bus Error heisst dass man versucht auf einen nicht existierenden Speicherplatz zuzugreifen oder? Uninitialisierte pointer,variablen,arrays...
LG,M.
-
Was ist denn num_values und warum erstellst du noch eine Variable num_werte, die sich lediglich durch die Sprache von ihr unterscheidet?
-
Deine Klammersetzung ist ja schrecklich... Kann es sein, dass in Z. 25 eine zu viel ist?
-
Weil ich bloed bin
ist mir auch aufgefallen aber es schadet nicht,oder?Was die Klammersetzung angeht das war meine erste Gedanke und ich hab es getestet und sollte stimmen...vl soll ich nochmal versuchen..
Eine frage ueber dem Teil von Code unten: ich hab es so gemeint,dass man erstens das doppelte Vorkommen von Werten verhindert beim Funktor-Anwenden und daher alle Felder auf Null setzen sollte die gleiche Buckets referenzieren(i+2 ist weil benachbarten Zeilen zeigen immer auf verschiedene Buckets weil es nach letzten d Ziffern gehasht wird).Danach wollte ich die die Bucket Inhaelte hinkriegen und es in das Feld einfuegen.Das was ich mir gedacht hab ies dass man zuerst vlt lieber die Felder auf Null setzen sollte und dann sie in das Feld holen...so ist ein bisshen kompliziert....was denkt ihr darueber?
Quicksort sollte jetzt clean sein wenn ich das mit nl behoben habe.
Mein Problem ist,dass ich absolut kein Buss Error Ursache in dem ganzen Code sehe...
for (size_t i=0; i<num_entries; i++) { if (hilfarr[i] != NULL) //Falls noch nicht durchlaufen { for (size_t j=i+2; j<num_entries; j++){ if (hilfarr[i] == hilfarr[j]){ hilfarr[j]=NULL;//Alle Indexeintraege, die das gleiche Bucket referenzieren auf NULL setzen } for (size_t k=0; k<(hilfarr[i]->getNumEntries()); k++){ werte[num_werte]=*(hilfarr[i]->getVal(k)); //werte[num_werte] referenziert ein Element (E) in einem Bucket num_werte++; } } } }Danke fuer die Tips.
LG
M.
-
Könntest du sie bitte trotzdem vernünftig einrücken? Sonst ist es sehr schwierig, deinen Code zu lesen.
P.S.: Du solltest nicht [i] als Index in deinem Code verwenden, sonst hält es der Forumparser als Kursiv-Tag ohne End-Tag.
-
Hat es denn einen besonderen Grund, daß du bei der inneren Schleife (Zeile 5) den Eintrag i+1 überspringst? Und die Einrückung ist wirklich grauenhaft - und passt nicht zu den Anweisungs-Verschachtelungen.
wxSkip schrieb:
P.S.: Du solltest nicht [i] als Index in deinem Code verwenden, sonst hält es der Forumparser als Kursiv-Tag ohne End-Tag.
Nein, tut er nicht
Allerdings ist es hilfreich, wenn man den BBCode aktiviert hat 
-
wxSkip schrieb:
Könntest du sie bitte trotzdem vernünftig einrücken? Sonst ist es sehr schwierig, deinen Code zu lesen.
P.S.: Du solltest nicht [i] als Index in deinem Code verwenden, sonst hält es der Forumparser als Kursiv-Tag ohne End-Tag.
Wuerde ich ganz gerne aber ich weiss nicht wie du das meinst(wie das ausschauen sollte)...
CStoll schrieb:
Hat es denn einen besonderen Grund, daß du bei der inneren Schleife (Zeile 5) den Eintrag i+1 überspringst? Und die Einrückung ist wirklich grauenhaft - und passt nicht zu den Anweisungs-Verschachtelungen.
wxSkip schrieb:
P.S.: Du solltest nicht [i] als Index in deinem Code verwenden, sonst hält es der Forumparser als Kursiv-Tag ohne End-Tag.
Nein, tut er nicht
Allerdings ist es hilfreich, wenn man den BBCode aktiviert hat 
i+1 wird uebersprungen weil die benachbarten felder haben verschiedene letzte ziffer zb 00,01,10,11 und da koennen zb 00 und 10 auf dem selben Bucket zeigen aber nicht 00 und 01 weil die letzten Ziffer anders sind(so hab ich das hashing gemacht,dass man letzten d Ziffern vergleicht).
-
Da gehen mir jetzt auch die Ideen aus - du solltest doch mal versuchen, dich mit deinem Debugger anzufreunden.
PS: Nur ein Tip, damit deine Beiträge lesbarer werden - geh mal in dein Nutzer-Profil und stell den Eintrag "BBCode immer aktivieren" auf Ja. Dann werden die Formatierungen deiner Beiträge auch verarbeitet.
-
Also nen Fehler zu finden, wenn man nichtmal weiss wo es crasht, ist schon recht lästig.
Vielleicht ist der Fehler ja in der Quicksort Funktion? Oder die Werte in den Membervariablen sind vor dem Funktionsaufruf schon kaputt? Oder ...?BTW: auf was für einer Plattform läuft das denn? Bus-Error klingt mir nach nem Hardware-Fehler. Das sollte auf Systemen mit virtuellem Speicher eigentlich nicht passieren können.
Vielleicht kannst du den Programmteil ja auch mal für Windows/Linux compilieren, und auf dem Entwicklungs-PC im Debugger laufen lassen. Mit den meisten IDEs ist das ultimativ einfach: ein Klick auf einen Toolbar-Button und das Ding startet im Debugger.
-
Formatierung? Ganz einfach. Du setzt die End-Klammer einfach immer auf die Höhe der Anfangs-Klammer.
Gut:
a { { blah { } if { } } }Schlecht:
a { { blah { } if { } } }