Keine Fehler beim Kompilieren, dafür aber beim Ausführen...
-
Hallo,
habe beim Kompilieren meines Programms keine Fehlermeldungen, allerdings wenn ich dann meine Main-Methode ausführen möchte, erscheint diese Fehlermeldung:
MSVCRT.lib(crtexe.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "_main".
C:\Dokumente und Einstellungen\...\Eigene Dateien\Visual Studio 2005\Projects\HashTable\Release\HashTable.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\...\Eigene Dateien\Visual Studio 2005\Projects\HashTable\HashTable\Release\BuildLog.htm" gespeichert.
HashTable - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Dann:
Das Programm C:\....\HashTable.exe kann nicht gestartet werden.
Das System kann die angegebene Datei nicht finden.Mein Main-Programm, das die Template-Klasse HashTable ausführen soll, sieht wie folgt aus...
#include "HashTable.h" #include<iostream> #include<string> #include<cstddef> using namespace std; template <class K, class V> //Habe diese Angabe auch probeweise wegelassen, //funktionert trotzdem nicht. int main () { string eins("Eins"); string zwei("Zwei"); int e = 1; int z = 2; HashTable <string, int>* ht = new HashTable <string, int>(); ht->put(eins, e); ht->put(zwei, z); int zWert = ht->get(eins); cout << "Der gesuchte Wert ist : " << zWert << endl; return 0; }Woran könnte das liegen?

Gruß
Generic412
-
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
DAS nennst Du "keine Fehler"?

Wieso möchtest Du aus main ein Template machen? Wenn Du die Angabe (nicht nur probeweise, sondern endgültig) weglässt, müsste es besser klappen. Wenn nicht: geänderten Code zeigen.
-
Die main()-Funktion als Template? Das habe ich auch noch nicht gesehen (erstaunlich, daß das vom Compiler geschluckt wird).
Ansonsten solltest du mal überprüfen, ob du nicht versehentlich ein WinAPI-Projekt angelegt hast.
-
So habe die Template-Deklaration in der Main-Funktion weggelassen und einige Fehler, die dann auftauchten, korrigiert, bis auf einen, da ich nicht weiß, wie ich umsetzen soll, einen Template Typ in ein int zu casten... und zwar in folgender Methode:
int toHash (const K& key, int size) { assert(size > 0); int keyValue = dynamic_cast<int>(key); int index = keyValue % size; return (int) index; }Gibt es eine Möglichkeit mit der ich dieses Problem umgehen kann? Dann hätte ich gleich noch eine Frage:
Wie kann man einen string in eine int-Darstellung konvertieren?
-
dynamic_cast funktioniert nur für Pointer und Referenzen auf miteinander verwandte Klassentypen, aber nicht für eine Konvertierung nach int. Dafür kannst du static_cast<> oder die aus C bekannten Cast-Ausdrücke
(int)keyverwenden*.Zur Umwandlung von Strings in Zahlen empfehle ich einen Blick in die FAQ - Thema "Einmal String nach Zahl und zurück".
Edit: * je nachdem, was in K drinsteht, könnte auch boost::lexical_cast<> geeignet sein.
-
Generic412 schrieb:
...Template Typ in ein int zu casten...
Ich befürchte, das geht nicht so, wie Du möchtest. Wenn Du eine Abbildung Deines Typs auf einen int-Wert haben möchtest, musst Du Dir das für diesen Typ selbst überlegen.
"dynamic-Cast" ist an der Stelle schon deswegen nicht angemessen, weil templates zur Compile-Zeit aufgelöst werden (d.h. schon der Compiler weiß, welchen Typkeyhat; dynamic_cast prüft einen Objektzeiger zur Laufzeit) und dynamic_cast für Casting innerhalb einer Vererbungshierarchie gemacht ist und da man von int nicht erben kann, wird key NIEMALS in einer Vererbungsverbindung zu int stehen...Ich weiß aber auc hnicht, ob ich richtig verstanden habe, was Du eigentlich tun möchtest. (vielleicht wäre "std::map" der richtige Typ für Dich ?) ...
Generic412 schrieb:
...
Wie kann man einen string in eine int-Darstellung konvertieren?Das steht gut in http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
Gruß,
Simon2.
-
@ alle
Danke für die Vorschläge...

@ Simon2
Es geht darum, eine Hashtabelle ohne Zuhilfenahme von Containern der STL zu implementieren. Dabei muss ich eine selbst erstellte Liste, die auch Template ist, innerhalb meiner Hashtabellen Klasse verwenden. Die Hashtabelle ist mit einem dynamischen Array realisiert, das je nach Größe mehrere Listen beinhaltet... Meine Hashtabellen Klasse ist auch als Template implementiert...
toHash ist dann eine Methode, die je nach Key Wert, und Größe des Arrays, den Hashwert eines übergebenen Objekts berechnen soll...
Die Funktion lautet:int index = key % size;
wobei key ein Template-Typ ist, der zur Berechnung in int konvertiert werden muss... size ist die Länge des Arrays...Index gibt dann vor in welche Liste des Arrays Key und Value eingefügt werden sollen...
Gruß
Generic
-
Da dürfte dein Hauptproblem wohl die Umwandlung eines beliebigen Datentyps in einen int sein. Dafür gibt es keine universelle Lösung, also solltest du dir eine entsprechende Umwandlungsfunktion als Template-Parameter mitgeben lassen.
Eventuell könntest du auch eine Default-Hashfunktion bereitstellen für den Fall, daß der Anwender keine Funktion mitliefert:
template<typename T> struct default_hash : public unary_function<T,int> { int operator()(const T& val) { return *reinterpret_cast<int*>(&val); }//nicht wirklich schön, aber i.A. verwendbar }; template<typename K,typename V,typename HF=default_hash<K> > class HashTable { HF hash; int toHash(const K& val,size_t size) { return hash(val)%size; } ... };(analog funktionieren auch die STL-Container - sie übernehmen einen Funktor, der zwei Werte vergleichen kann und deligieren alle Elementvergleiche an diesen)
-
CStoll schrieb:
Da dürfte dein Hauptproblem wohl die Umwandlung eines beliebigen Datentyps in einen int sein....
Das meinte ich.
Generic412 schrieb:
...
int index = key % size;wobei key ein Template-Typ ist...
Also key wird wohl höchstens ein Objekt sein, für dessen Typ Dein Container (template-)instantiiert wird.
Und da Du vermutlich für unterscheidliche Objekte (auch derselben Klasse) unterscheidliche index-e erhalten und als Typ nicht nur "Wertetypen" (int&Co) verwenden möchtest, wirst Du Dir selbst schon für jeden Typen überlegen müssen, wie Du einen entsprechenden Hashwert berechnest.
"%" ist an der Stelle nicht so hilfreich ... da würde ich lieber ein(e) freie(s) Funktion(stemplate) verwenden ...
Letztlich kann Dir ja auch niemand allgemein beantworten, wann zwei Objekte (im Sinne Deines Hashwertes) "identisch" sein sollen (selbe Speicheradresse ? Alle Attribute identisch ? "Primärattribute" identisch ? ...)... und genau daran hängt die Ermittlung eines Hashwertes nunmal.Wie bei CStoll die identische Speicheradresse zu nehmen, ist nicht immer sinnvoll. Z.B. sollten üblicherweise 2 int's mit demselben Wert auf denselben Hashwert haben .... auch wenn sie in unterschiedlichen Variablen stehen.
(Damit will ich nicht CStolls (tolle) Lösung madig machen, sondern nur auf die Notwendigkeit hinweisen, sich intensiver mit dem Thema zu beschäftigen)Gruß,
Simon2.