Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler beim Linken

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.05.2004, 08:40 Uhr
ao

(Operator)


Am Sourcecode kann ich keinen Fehler erkennen.

Überprüf mal, ob die hashing.cpp tatsächlich frisch übersetzt und zum Projekt dazugebunden wird.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.05.2004, 09:42 Uhr
~Spacelord
Gast



Zitat:
Vriza postete
Hallo!

....

main_hash.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall hash_container::hash_insert(void *,char *)"
.....


C++:
...
void hash_container::hash_insert(void *p , char *name)
{    
    /*key für den namen wird erstellt*/
    int key;
    key = hashfunktion(name);
}
....





Deine Deklaration passt nicht zur Definition.

MfG Spacelord
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.05.2004, 09:45 Uhr
~Spacelord
Gast


Seh gerade im Header stimmt es,aber aus irgend welchen Gründen sucht er ne Implementierung für ne hashinsert Methode die nen int liefert.

MfG Spacelord
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.05.2004, 12:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


sollte spacelords vermutung stimmen kannst du ihm mit nem cast vielleicht dazu bewegen das doch zu akzeptieren
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.05.2004, 12:53 Uhr
~Spacelord
Gast


Hi Windalf,
ich denke eher dass er vorher die Methode noch mit int als Rückgabewert hatte und es dann geändert hat.Mit nem satten Klick auf "Alles neu erstellen" sollte das aus der Welt sein.
Die Fehlermeldung ist ja eindeutig,der sucht ne Methode:
int __thiscall hash_container::hash_insert(void *,char *)
und die gibt es nunmal nicht.

MfG Spacelord
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.05.2004, 13:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hoi Spacy...

also das Programm ist ja doch relativ komplex... der scheint ja auch nicht das erste mal zu programmieren so das ich davon ausgehe das der den "rebuild all-knopf" bestimmt schon lange kennt und ausprobiert hat...

letzens hatte ich mit dem vc auch so ein dummes problem... konnte ein projekt so 3-5 mal kompilieren aber dann hat er mir immer nen linker-error geschmissen... hab das projekt dann immer wieder neu erstellt weil ich nicht herausbekommen habe woran der sich aufgehängt hat und warum zum henker immer erst nach ner weile...
da half dann auch leider auch kein rebuild all mehr... Ich weiss bis heute nicht woran das lag...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.05.2004, 14:12 Uhr
~Spacelord
Gast


in so nem Fall einfach mal alle erzeugten Dateien löschen.

MfG Spacelord
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.05.2004, 16:41 Uhr
Vriza



Tja, ich hab den Fehler gefunden. Ich hatte komischerweise 2 hashing.h Dateien inkludiert gehabt, wobei aber nur eine gesehen habe. Eine war die alte .h Datei, die anderen die neue (obige) .h Datei. Der Compiler hat aber immer die alte .h Datei gelinkt und die neue ignoriert.

:
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: