Need Help: HashTables
-
Hallo werte Coder.
Ich hab wieder mal ein Problem: um Laufzeit zu sparen möchte ich einen HashTable aufbauen, in dem ich meine Daten ablegen möchte.
Nungut: ich hab die Syntax von hier übernommen, aber mein VC++ weigert sich, das anzuerkennen:using namespace System; using namespace System::Collections; //irgendwelcher andrer Code, der läuft Hashtable^ openWith = gcnew Hashtable(); //und noch mehr Code
Meine Frage ist nun: wie initialisiere ich den Hashtable? Ich nur Fehlermeldungen a la Hashtable ist unbekannter Bezeichner...
Aja, ich arbeite ohne CLR.
Tipps anyone?
-
Hallo nervender Mathematiker,
alles mit System:: ist CLR,
alles mit Hashtable^ ist CLR,
alles mit gcnew ist CLR,du arbeitest ohne CLR
Wenn du C++ machen willst, nimm hash_map
http://msdn.microsoft.com/de-de/library/0d462wfh.aspx
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
erstmal danke, da hätte ich noch lange suchen können.
jetzt hab ich folgendes Problem: ein Teil meines Progs ist in C, der Großteil in C++: ich erschaffe den Hash im C++ Part, reiche ihn rüber nach C, und von C aus wird ein andrer C++ Part aufgerufen, wo der Hash ausgewertet wird... irgendwelche Ideen, wie ich das hinkrieg?
Muss ich mit das Hash Ding selber schreiben damit s der C Part versteht?
So long
-
Muss ich mit das Hash Ding selber schreiben damit s der C Part versteht?
Nein, aber dem Hash Ding ein C Interface verpassen.
-
Ist es denn wirklich C ?
Also wird es von einem reinen C-Compiler (nicht von Visual Studio) übersetzt ?
Oder sind es Funktionen die nur C-Sprachmittel verwenden und das ganze wird sowieso von VC als C++-Code übersetzt ?
In letzterem Fall ist die Unterscheidung doch eh nur theoretisch, du kannst ohne Probleme C++ Konstrukte im C-Code verwenden, für den Compiler ist eh alles C++.
-
Hallo.
Danke für Eure Mühen.
Mittlerweile habe ich mich entschlossen, die Hashes extern zu machen, dann muss ich mich mit dem C Part nicht rumschlagen... allerdings hab ich noch ein Problem:
i2=0; CString str_name; extern hash_map<CString, int> hm_r; extern hash_map<CString, int> hm_k; typedef pair<CString, int> paar; KnotenBasis* pKnot; for(POSITION pos = listKnot1.GetHeadPosition(); pos != NULL; ) { pKnot = (KnotenBasis*) listKnot1.GetNext(pos); str_name = pKnot->GetName(); hm_k.insert(paar(str_name, i2)); i2++; }
Da liefert mit VS den Fehler:
Fehler 24 error C2440: 'Typumwandlung': 'const CString' kann nicht in 'size_t' konvertiert werden C:\Programme\Microsoft Visual Studio 8\VC\include\xhash 61Was muss ich tun, damit die Fehlermeldung verschwindet?
-
schön, und bei welcher Zeile?
-
steht doch da:
Fehler 24 error C2440: 'Typumwandlung': 'const CString' kann nicht in 'size_t' konvertiert werden C:\Programme\Microsoft Visual Studio 8\VC\include\xhash 61
Also in der Datei, wo das Hash Zeug definiert wird... ich kann aber mit dem Zeug nichts anfangen... zu sehr Mathematiker, zu wenig Infotiker.
-
Ich sehe hier keine 61 Zeilen sondern nur 22, mhhhhh.
Gib mal Zeile 61.
-
Klick einfach doppelt auf die Fehlermeldung und die IDE bringt dich hoffentlich an die richtige Stelle...
-
hallo.
wie in der fehlermeldung zu lesen ist, liegt das problem in der library, wo die hasmap definiert wurde... ich versuche mit CString zu arbeiten, und irgendwie schluckt das die lib nicht:
template<class _Kty> inline size_t hash_value(const _Kty& _Keyval) { // hash _Keyval to size_t value one-to-one [b]return ((size_t)_Keyval ^ _HASH_SEED);[/b] }
in diesem Code Block passiert der Fehler, explizit wird auf die fette zeile verwiesen.
-
Was ist hash_map für eine Implementation?
Von wem?Die Klasse gehört nämlich nicht zum C++ Standard und bei MS ist sie im Namespace stdext.
Simon
-
theta schrieb:
Was ist hash_map für eine Implementation?
Ist schon mindestens seit VC 2002 dabei.
War auch früher schon in den alten SGI STLs, ist wohl einer der Container aus der ursprünglichen STL, die es nicht in den Standard geschafft haben.
Im neuen Standard wird sie durch unordered_map ersetzt.
-
Ok, das erklärt vermutlich die Fehlermeldung, mit CString als Key braucht man wohl eine eigene Hashfunktion.
Also besser mit unordered_map und string, so wie hier:
-
hallo.
danke für euren input.
ich hab mittlerweile das ding mit der hashmap hingekriegt, ABER noch hab ich ein Problem:
stdext::hash_map<LPCTSTR, int> hm_r; stdext::hash_map<LPCTSTR, int> hm_k;
Damit lege ich mir die Hashmaps an.
for( i = 0 ; i < listK_01.GetCount() ; i++ ) { pKnot = (KnotenBasis*) listK_01.GetAt( i ); str_name = pKnot->GetName(); hm_k[(LPCTSTR)str_name] = i2; i2++; }
hier befülle ich eine hashmap, die zweite wird analog befüllt.
stdext::hash_map <LPCTSTR, int> :: const_iterator hmiter;
hier baue ich mir einen iterator, der für beide maps funktionieren soll.
int i_ndex_ki, i_ndex_kk, i_ndex_rohr; hmiter = hm_k.find( (LPCTSTR)str_n1 ); if( hmiter == hm_k.end() )continue; i_ndex_ki = hmiter->second; hmiter = hm_k.find( (LPCTSTR)str_n2 ); if( hmiter == hm_k.end() )continue; i_ndex_kk = hmiter->second; CString str_lsx = (str_n1 + "_" + str_n2); LPCTSTR ls1 = str_lsx; hmiter = hm_r.find( ls1 );
hier hole ich mir i_ndex_ki/kk ab (funktioniert wunderbar).
ABER: ls1 liefert eingesetzt in find nur das ende der map... wo is mein fehler?
-
Einen LPCTSTR zu speichern halte ich für keine gute Idee, denn es kann ganz schnell passieren, dass der Speicher, auf den der Pointer zeigt, wieder gelöscht wird. So auch in deinem Code:
str_name = pKnot->GetName(); hm_k[(LPCTSTR)str_name] = i2;
Simon
-
hallo.
ich hab mein problem gelöst; ich kann leider die lösung nicht zeigen, da ich andre attribute benutze, als im bisher gezeigten code... und dafür müsste ich jede menge code hier reinstellen, der eigentlich nichts mit dem problem zu tun hat.
zur technischen lösung: am eigentlichen code wurde nichts geändert, nur eben die attribute.