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??
codice:
//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
codice:
#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