000
26.05.2004, 17:06 Uhr
Vriza
|
Hallo!
Ich programmiere gerade ein Programm, das Personen in einer Hashtabelle verwaltet. Jedoch bekomme ich beim Linken des nachfolgenden Codes folgenden Fehler:
main_hash.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall hash_container::hash_insert(void *,char *)" (?hash_insert@hash_container@@QAEHPAXPAD@Z)
Debug/Hashcontainer.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Der Code schaut wiefolgt aus:
Das ist die hashing.cpp in der die Funktionen der Hashtabelle von der hashing.h implementiert sind:
C++: |
# include "hashing.h" # include <string.h> # include "person.h" # include "strings.h"
# define m 31
hash_container::~hash_container() {
}
hash_container::hash_container() { for(int i=0; i<50; i++) {
h[i].info_ptr=NULL; h[i].key=NULL; } } void hash_container::hash_insert(void *p , char *name) { /*key für den namen wird erstellt*/ int key; key = hashfunktion(name); }
int hash_container::hashfunktion(char *name) {
int k; int j=13; int length = strlen(name);
for(int i=0; i< length; i++,j--)
k=(k+j*64*i+*name++)%31;
return k; }
|
Die hashing.h :
C++: |
# pragma once # include <stdio.h>
struct hash{ char *key; void *info_ptr; };
class hash_container { hash h[50];
public: hash_container(); ~hash_container(); int hashfunktion(char *name); void hash_insert(void *p, char *name);
};
|
Das Hauptprogramm:
C++: |
# include <stdio.h> # include "hashing.h" # include "person.h" # include "strings.h"
void main() { hash_container hash_var; int nummer; char *wohnort = (char*) malloc (30); char *name = (char*) malloc(20); char c; person *p; int wahl;
while (wahl != 0) {
/** HAUPTMENÜ***/ printf("\nWas wollen Sie tun?\n"); printf("1. Person hinzufuegen\n"); scanf("%d", &wahl);
system ("cls");
switch(wahl) {
/* Einfügen von so vielen Personen, wie der User bestimmt*/ case 1: c='y'; while (c != 'n')//solange bei der Abfrage nicth 'n' eingegeben wird, kann man Items eingeben { printf("\nGeben Sie die Nummer der Person ein:\n"); scanf("%d", &nummer);//Nummer der Person wird eingegeben fflush(stdin);
printf("Geben Sie den Namen ein\n");//Name der Funktion wird eingegeben scanf("%s", name); fflush(stdin);
printf("Geben Sie den Wohnort an\n");//Wohnort wird eingegeben scanf("%s", wohnort); fflush(stdin); system("cls"); p = new person (nummer ,name, wohnort); //speicherbereich für p wird allokiert hash_var.hash_insert(p, name);
//system("cls"); printf("\n Weitermachen? (y/n) \n"); //abfrage ob weiter personen eingegeben werden sollen scanf("%c", &c); } break; } } }
|
Das sind eigentlich die wichtigsten Dateien dieses Programms. Es besteht weiterhin noch aus einer person.h bzw. person.cpp in der die Funktionen implementiert sind, die für die Personenverwaltung genutzt werden. Eine strings.cpp und strings.h habe ich auch. Das ist eine String Klasse, die ich selbst geschrieben habe. Diese Dateien habe ich schon öfters in Programm genutzt aber nie Probleme damit gehabt.
Vollständigerweise poste ich sie aber trotzdem:
C++: |
# pragma once # include <stdio.h> # include "strings.h"
class person{
int nr; string name; string wohnort; public:
int char_cmp(const void*p1,const void*p2); //Prototypen der Compare funktionen int int_cmp(const void *p1,const void*p2); int int_cmp2(const void *p1,const void*p2); //adressen auf pointer der objekte person (int a, string b, string c); //c'tor person();//c'tor void print_person();//gibt eine einzelne person aus int GetNr();//um die nummer der person zu bekommen string GetName();//um den namen der person zu bekommen person & operator = (const &person); void ausgabe (); };
|
# pragma once # include <stdio.h> # include "strings.h" # include "person.h"
person::person (int a, string b, string c) //Constructor für Person { nr=a; name=b; wohnort=c; } person::person()//Constructor von Klasse Person { nr=NULL; name=NULL; wohnort=NULL; }
int person::GetNr() //Funktion um die Nummer eines Objekts zu bekommen { return nr; }
string person::GetName()//funktion um den namen eines Objektes zu bekommen { return name; }
person & person::operator = (const &person) //Überladungsfunktion für Operator = für //Objekte von Klasse Person { this->nr=nr; this->wohnort=wohnort; this->name=name; return *this; }
void person::print_person() //funktion zum Ausgeben eines Objektes {
printf("\nNummer: %d\n", nr);//Nummer der Person wird ausgegeben printf("Name: "); name.output();//String wird ausgegeben printf("Wohnort: "); wohnort.output();//String wird ausgegeben }
C++: |
# pragma once # include <stdio.h> # include <string.h> # include <stdlib.h>
class string{ char *str; public:
string ();
string (char *s); ~string ();//D'tor
string (const string &s); //Copy c'tor string& operator += (const string& s); string& operator = (const string &s); // rechtes element void output(); bool operator == (const string &s); bool operator != (const string &s); bool operator < (const string &s); bool operator > (const string &s); string operator + (const string& s) ; int operator - (const string& s); operator char*(); operator int*();
};
|
C++: |
# include "strings.h" # include <stdio.h> # include <string.h>
string::string(){str=NULL; } //c'tor für s1
string::string (char *s) { if(s == NULL) str=NULL; str=strdup(s); }//c'tor für s2, s3 string :: ~string () { if(str) free (str); }//D'tor
string::string (const string &s) {if(s.str)str=strdup(s.str); } //Copy c'tor string& string:: operator += (const string& s) {
if(s.str == NULL ) return *this;
else if(str == NULL) {
str = (char *) malloc (strlen(s.str)+1); strcpy(str, s.str); return *this;
}
else {
char *temp = (char*) malloc (strlen(s.str) + strlen(str) + 1); strcpy(temp, str); strncat(temp, s.str, strlen(s.str)); str = temp; return *this;
} }
string &string::operator = (const string &s) // rechtes element { // string tmp (*this); //linkes element bei zuweisung
if (this->str == NULL && s.str == NULL) return *this;
else if(this->str == NULL && s.str != NULL) { //printf("Linkes element NULL\n"); this->str=strdup(s.str); return *this; }
else if (s.str == NULL) { str=NULL; return *this; } else{
if (str) free (str); str = strdup(s.str); return *this; } // return *this; } void string::output() { printf("%s \n", str); }
/* string operator == (const string& s) { if(strcmp (this->str, s.str)) return *this; else return NULL; }*/
bool string ::operator == (const string &s) { if (s.str == NULL && str == NULL) return true; else if (s.str == NULL || str == NULL) return false; else
return (strcmp(str, s.str) == 0); }
bool string::operator != (const string &s) { if (s.str == NULL && str == NULL) return false; else if (s.str == NULL || str == NULL) return true; else
return (strcmp(str, s.str) == 0); }
bool string::operator < (const string &s) { if (str == NULL && s.str != NULL) return true; else if (s.str == NULL && str != NULL) return false; else return (strcmp(str, s.str)==-1); }
bool string::operator > (const string &s) { if (str == NULL && s.str != NULL) return false; else if (s.str == NULL && str != NULL) return true; else return (strcmp(str, s.str)==1); } string string::operator + (const string& s) { string tmp (*this); if (s.str == NULL && tmp.str == NULL) { return *this; } else if (tmp.str == NULL && s.str != NULL) { tmp.str=(char *) malloc (strlen(s.str)+1); strcpy(tmp.str, s.str); return tmp; } else //fehler { tmp.str=(char *) realloc (tmp.str, strlen (tmp.str) + strlen(s.str)+1); strcat (tmp.str, s.str); return tmp; } }
//vergleicht 2 strings int string::operator - (const string& s) { if(str=NULL && s.str == NULL) return 0; else if( s.str == NULL) return 1;
else if (str == NULL) return -1;
else return strcmp(str,s.str); }
string::operator char*() { return str; }
/*string::operator int*() { int h; sscanf(str, "%d", &h); return h; }*/
|
Die strings.cpp ist recht lang, aber ich bin mir sicher dass sie nicht für den obigen Fehler verantwortlich ist.
Danke schonmal im Vorraus
mfG
Vriza |