Offenes Hashing - Was mache ich falsch???
-
BigRed schrieb:
Ich füge die for-schleife in den Konstruktor der Klasse ein.
Irrelevant.
Komischer Weise kann ich die for-Schleife acht mal durch laufen ohne Probleme, doch wenn ich mehr als 8 eingebe (in diesem Fall 1000), bricht das Programm ab...???
Es stürzt also *in* der Schleife ab. Kannst du mal ein wenig mehr Code posten ... z.B. die Klasse um die es überhaupt geht?
BigRed schrieb:
Kann es sein, dass ich dafür erst Speicher freigeben muss oder so?
Nein.
Ich habe es jetzt mal so versucht:
Point * hash[1000][1000][1000];
Damit kann ich mehrere Schlüssel verwenden.
Schön, aber dein Array hat dann 1000 * 1000 * 1000 = 1000000000 Einträge, von denen jeder 4 Byte groß ist => 4 Gigabyte. Ich sehe auch überhaupt nicht, was das mit dem Problem von oben zu tun hat.
-
Hallo!
Sorry.
Bei der Klasse handelt es sich um eine Klasse namens CData, welche ich unter global.h (extern class CData...) dem ganzen Programm zugänglich mache.
Die Implementiirung sieht so aus (irrelevante Funktionen raus):
class CData { public: void DeleteAll(); CData(); virtual ~CData(); private: struct Vertex { float x; float y; float z; }; typedef struct POINT { Vertex v; Vertex normal; struct POINT * next; struct POINT * prev; } Point; Point * hash[1000]; };
Im Konstruktor (oder unter DeleteAll) führe ich die for-Schleife aus...
-
Hallo,
Im Konstruktor (oder unter DeleteAll) führe ich die for-Schleife aus...
zeig doch mal den CTor und DeleteAll. Nur mit der Klassendeklaration koennen
wir nichts anfangen.mfg
v R
-
Wiso wird Point getypedeft, wenn du doch weißt, dass das quatsch ist (siehe Vertex)?
-
Hallo nochmal:
Zum ersten Zitat:
void CData::DeleteAll() { for (int i=0; i<1000; i++) hash[i] = NULL; }
Die Punkte sind im Moment noch Speicherleichen.
Zum zweiten Zitat:
Kann das sein, dass das der Fehler ist? Wie soll ich denn die Hash-Tabelle initialisieren, wenn ich den Typ "Point" nicht mehr habe?? Die Hash-Tabelle weiss dann doch gar nicht mehr, welche Typen sie beinhaltet? Kann sein, dass ich im Moment tierisch auf dem Schlauch stehe.
-
Reduzier das Programm doch mal bitte soweit, dass du es komplett posten kannst. Natürlich so, dass der Fehler noch auftritt! Du sagst zb oben was von einer extern-Deklaration usw. Es muss jedenfalls irgendwas sein, was nicht aus dem geposteten Code hervorgeht.
Denn die Klasse an sich ist, soweit du sie gezeigt hast, OK. Eine Instanz enthält ein Array mit 1000 Einträgen, darüber kannst du selbstverständlich frei verfügen und die Elemente Nullsetzen, wie es dir passt. Deine Fehlerbeschreibung riecht aber danach, dass überhaupt keine Instanz angelegt wurde. Machst du vielleicht irgendwo sowas? :
CData *d; // uninitialisiert d->DeleteAll();
Um solchem Ins-Blaue-Raten vorzubeugen, solltest du uns ein wenig entgegenkommen und dir nicht alles aus der Nase ziehen lassen.
PS: die Deklaration
struct Foo { ... };
führt den Typen Foo ein, auch ohne typedef.
-
Hallo!
Bei meinem Programm handelt es sich inzwischen schon um einen vollständig Funktionierenden STL-Viewer. In einer STL-Datei wird ein Objekt, zusammengesetzt aus lauter kleinen Dreiecken (je kleiner desto besser ;-), abgespeichert. Es ist also schwierig, irgendwelchen Code zu extrahieren. Die Hash-Tabelle ist eigentlich das einzig wichtige.
Zum Hintergrund:
Ich habe zwei Listen: Eine mit Punkten und eine mit den Dreicken. Jedes dieser Dreiecke zeigt auf 3 Punkte. Doch das ist ja hier irrelevant. Die Punkte werden von den Dreiecken ja nich beeinflusst.Der Grund, warum ich die Hash-Tabelle möchte ist, dass ich nicht jedesmal alle Punkte durchsuchen möchte, wenn ich einen neuen Punkte einlese.
Hier die Implementierung der Klasse:
global.h
#include "Data.h" // Global.h #ifndef __Global_h__ #define __Global_h__ extern CData Data; #endif // __Global.h__
// Global.cpp #include "StdAfx.h" #include "Global.h" CData Data;
Das ist der einzige Ort, an dem ich die Klasse implementiere.
Zuvor hatte ich eine einfachere Datenstruktur: Eine verkettete Liste von Dreiecken. Damit funktionierte es auch.Das Problem liegt wohl irgendwo anders. Wenn ich die for-Schleife raus mache gehts und wenn sie drin ist, stürzt das Programm ab (beim Debuggen wird auf Assember-Code verwiesen).
So bin ich noch nie auf dem Schlauch gestanden. Kann sein, dass ich mir einen anderen Weg suchen muss...
Dankte trotzdem!!
-
Du implementierst di Klasse da nicht, sondern instanzierst sie.
Verwendest du vielleicht die Einträge des Feldes, obwohl sie noch NULL sind?
-
Nein, ich verwende die Einträge der Hash-Tabelle noch nicht.
Wenn das der Fall wäre, würde mir der Debugger wenigstens die Stelle des Fehlers anzeigen... aber der Zeigt nur auf Assembler-Code.
-
Zusatz:
Ich habe zum Spaß mal folgendes implementiert:
private: int test[1000];
und dann unter CData::CData()
CData::CData() { for (int i=0; i<1000; i++) test[i] = 0; }
Das Programm wird erst gar nicht ausgeführt. Ohne Fehlermeldung bricht es einfach ab.
Ich hoffe, dass es sich hierbei nicht um ein unlösbares Problema handelt...
-
Ich habe nun eine Lösung gefunden. Warum meine alte Hash-Tabelle nicht funktionierte, wird wohl unklar bleiben.
Die Lösung:
struct INIT_HASH { struct POINT * key[10][10][10]; } InitHash; INIT_HASH * hash;
und im Konstruktor:
CData::CData() { INIT_HASH * Hash = (INIT_HASH *)malloc(sizeof(INIT_HASH)); hash = Hash; for (int i=0; i<10; i++) for (int j=0; j<10; j++) for (int k=0; k<10; k++) hash->key[i][j][k] = NULL; }
ist zwar ein bischen komisch, aber es funktioniert. Ich habe jetzt einen Pointer auf den HASH und der Speicherplatz des Hash wurde mit malloc frei gegeben. Kann sein, dass es am Speicher oder so lag...
Gruss und Danke
BigRed