Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    60

    (c++)tabella hash(errori di link)

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    60
    up

  3. #3

    Re: (c++)tabella hash(errori di link)

    prova così:
    codice:
    //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:
    codice:
    $ 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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.