PDA

Visualizza la versione completa : (c++)tabella hash(errori di link)


manu86
04-07-2009, 12:29
Salve, nn riesco a compilare questo programma in c++, mi continua a dare errori di link che nn mi spiego...mi potete dare una mano??




//dizionario.h
//Implementazione di un dizionario tramite programmazione generica[template]

#ifndef DIZ_H
#define DIZ_H
#include <cmath>

template<class T,class S>class Dizionario{

public:
Dizionario(int DimensioniTabella=5,double constA=0.445){
if(DimensioniTabella=!0){
// Lista Tabella[DimensioniTabella];
Tabella=new Lista[DimensioniTabella];
// PROVA=new Lista;
}
}
~Dizionario(){delete []Tabella;}

class Lista{
public:
Lista(){PrimoElemento=0;}

class Elemento {
public:
Elemento(){
ElementoSuccessivo=0;
ElementoPrecedente=0;
chiave=0;
}
~Elemento(){}
Elemento * ElementoPrecedente;
Elemento * ElementoSuccessivo;
T chiave;
S datoSatellite;
};

bool InserisciElemento(T,S);
Elemento * Ricerca(T);
S Cancella(T);
int RestituisciNumElementi(){return NumElementiDellaLista;}
void SettaPrimoElemento(Elemento *q){PrimoElemento=q;}
Elemento * RestituisciPrimoElemento(){return PrimoElemento;}
static int NumElementiDellaLista;
private:

Elemento * PrimoElemento;


};

bool InserisciChiave(T,S);
S EliminaChiave(T);
S RicercaChiave(T);
int FattoreDiCarico();
int RestituisciDimensioniTab(){return DimensioniTabella;}
Lista * Tabella;
// Lista PROVA;//lista di prova
// Lista Tabella[5];
protected:

virtual unsigned long ConvertiChiave(T);
double constA;
int DimensioniTabella;
int GeneraHashVal(T);

};

template <class T,class S>int Dizionario<T,S>::Lista::NumElementiDellaLista=0;


//funzioni classe Lista
template <class T,class S>bool Dizionario<T,S>::Lista::InserisciElemento(T chiave,S dato){
Elemento *x=new Elemento();
Elemento *y=0;
y=RestituisciPrimoElemento();
x->chiave=chiave;
x->datoSatellite=dato;
if(y==0){SettaPrimoElemento(x);}
else{
do{
y=y->ElementoSuccessivo;
}while(y->ElementoSuccessivo!=0);
y->ElementoSuccessivo=x;
x->ElementoPrecedente=y;
NumElementiDellaLista++;
return 1;
}
}


template <class T,class S>Dizionario<T,S>::Lista::Elemento * Dizionario<T,S>::Lista::Ricerca(T chiave){
Elemento *y=0;
y=RestituisciPrimoElemento();
while((y!=0) && (y->chiave!=chiave)){
y=y->ElementoSuccessivo;}
return y;
}


template <class T,class S>S Dizionario<T,S>::Lista::Cancella(T chiave){
Elemento *y=0;
y=Ricerca(chiave);
if((y!=0)&&(y->chiave==chiave)){
y->ElementoPrecedente->ElementoSuccessivo=y->ElementoSuccessivo;
if(y->ElementoSuccessivo!=0){
y->ElementoSuccessivo->ElementoPrecedente=y->ElementoPrecedente;
}
NumElementiDellaLista--;
return y->datoSatellite;
}else{
return 0;
}
}


//Funzioni classe Dizionario
template <class T,class S>int Dizionario<T,S>::FattoreDiCarico(){
double media;
int dim=RestituisciDimensioniTab();
for(int i=0;i<dim;i++){
media=media + Tabella[i].RestituisciNumElementi();
}
media=media/dim;
return media;
}

template <class T,class S>int Dizionario<T,S>::GeneraHashVal(T chiave){
int dim=RestituisciDimensioniTab();
unsigned long val=ConvertiChiave(chiave);
double HashFunzDouble=(fmod((constA*val),1)*dim);
double fraz=modf(HashFunzDouble,&HashFunzDouble);
int HashFunz=(int)HashFunzDouble;
return HashFunz;
}


template <class T,class S>bool Dizionario<T,S>::InserisciChiave(T chiave,S dato){
int hashVal=GeneraHashVal(chiave);
if(Tabella[hashVal].InserisciElemento(chiave,dato)){return 1;}
return 0;
}

template <class T,class S>S Dizionario<T,S>::RicercaChiave(T chiave){
int hashVal=GeneraHashVal(chiave);
Dizionario<T,S>::Lista::Elemento *y=Tabella[hashVal].Ricerca(chiave);
S dato=y->datoSatellite;
if(dato!=0){return dato;}
return 0;
}

template <class T,class S>S Dizionario<T,S>::EliminaChiave(T chiave){
int hashVal=GeneraHashVal(chiave);
S dato=Tabella[hashVal].Cancella(chiave);
if(dato!=0){return dato;}
return 0;
}


template <class T,class S>unsigned long Dizionario<T,S>::ConvertiChiave(T chiave){
unsigned long a=static_cast<unsigned long>(chiave);
return a;
}



#endif




#include "dizionario.h"
#include <iostream>
using namespace std;
int main(){

Dizionario<int,char> diz(10);
diz.InserisciChiave(2,'a');
diz.InserisciChiave(6,'x');
diz.InserisciChiave(8,'q');
char qq=diz.RicercaChiave(5);
cout<<qq<<endl;
cout<<6<<endl;
char aa=diz.RicercaChiave(2);
cout<<aa<<endl;
diz.EliminaChiave(2);
char bb=diz.RicercaChiave(2);
cout<<bb<<endl;
return 0;
}


e questi sono gli errori...
################################################## ###########
--------------------Configuration: dizion - Win32 Release--------------------
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Cancella(int)" (?Cancella@Lista@?$Dizionario@HD@@QAEDH@Z)
main.obj : error LNK2001: unresolved external symbol "public: class Dizionario<int,char>::Lista::Elemento * __thiscall Dizionario<int,char>::Lista::Ricerca(int)" (?Ricerca@Lista@?$Dizionario@HD@@QAEPAVElemento@12 @H@Z)
main.obj : error LNK2001: unresolved external symbol "public: bool __thiscall Dizionario<int,char>::Lista::InserisciElemento(int,char)" (?InserisciElemento@Lista@?$Dizionario@HD@@QAE_NHD @Z)
Release/dizion.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

dizion.exe - 4 error(s), 0 warning(s)
################################################## ########### Avevo gia chiesto in questo forum, ma la persona che cercava di aiutarmi nn riceveva gli stessi errori miei compilando il programma, potrei sapere se a voi linkando da gli stessi errori?
Potreste anche consigliarmi qualche compilatore free per c++ scaricabile da internet?
Grazie

manu86
08-07-2009, 10:52
up

MacApp
08-07-2009, 16:43
prova cosė:



//dizionario.h
...
template <class T,class S> typename Dizionario<T,S>::Lista::Elemento * Dizionario<T,S>::Lista::Ricerca(T chiave){
Elemento *y=0;
y=RestituisciPrimoElemento();
while((y!=0) && (y->chiave!=chiave)){
y=y->ElementoSuccessivo;}
return y;
}

...

template <class T,class S>S Dizionario<T,S>::RicercaChiave(T chiave){
int hashVal=GeneraHashVal(chiave);
typename Dizionario<T,S>::Lista::Elemento *y=Tabella[hashVal].Ricerca(chiave);
S dato=y->datoSatellite;
if(dato!=0){return dato;}
return 0;
}


compilato e linkato con successo con:


$ g++ --version
i686-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
Copyright (C) 2005 Free Software Foundation, Inc.

Loading