Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: (c++)errori di link

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

    (c++)errori di link

    Salve, stavo provando a scrivere un programma che implementi un dizionario tramite tabelle hash e che risolva le collisioni tramite liste concatenate..me lo compila ma nn lo linka.
    Questo è il codice:
    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=100,double constA=0.445){
    			  if(DimensioniTabella=!0){
    				  Tabella=new Lista[DimensioniTabella];
    		  }
    		  }
              ~Dizionario(){delete []Tabella;}
    
       		     class Lista{
    			   public: 
    				    Lista(){PrimoElemento=0;NumElementiDellaLista=0;}
    
    				               class Elemento {
    				                               public:
                                                         Elemento(){
                                                         ElementoSuccessivo=0;
    													 ElementoPrecedente=0;
                                                         chiave=0;     
    													 }
    						                       ~Elemento(){}
                                                   Elemento * ElementoPrecedente;
    											   Elemento * ElementoSuccessivo;
                                                   T chiave;
    											   S datoSatellite;
    							   };
                       
                       bool InserisciElemento(T,S);
    				   S Ricerca(T);
    				   S Cancella(T);
    				   int RestituisciNumElementi(){return NumElementiDellaLista;}
    				   bool SettaPrimoElemento(Elemento *q){PrimoElemento=q}
    				   Elemento *RestituisciPrimoElemento(){return PrimoElemento;}
    				
    				private:
    
    				   Elemento *PrimoElemento;
                       static int NumElementiDellaLista;
                       
    			 };
                
    			 bool InserisciChiave(T,S);
                 S EliminaChiave(T);
    			 S RicercaChiave(T);
                 int FattoreDiCarico();
    			 int RestituisciDimensioniTab(){return DimensioniTabella;}
    			 
    			 protected:
                 
                 virtual unsigned long ConvertiChiave(T);
                 double constA;
    		     int DimensioniTabella;			 
                 int GeneraHashVal(T);
                 Lista *Tabella;
    };
    
    //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->ElementoSuccssivo;
    		}while(y->ElementoSuccssivo!=0);
            y->ElementoSuccssivo=x;
            x->ElementoPrecedente=y;
    		NumElementiDellaLista++;
    		return 1;
    	}
    }
    
    	
    template <class T,class S>S Dizionario<T,S>::Lista::Ricerca(T chiave){
    	Elemento *y=0;
        y=RestituisciPrimoElemento();
    	while((y!=0) && (y->chiave!=chiave)){
    		y=y->ElementoSuccessivo;}
    	return y->datoSatellite;
    }
    
    
    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);
    	S dato=Tabella[hashVal].Ricerca(chiave);
    	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=(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;
    	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 che mi da:

    -------------------Configuration: diz - Win32 Debug--------------------
    Linking...
    diz.obj : error LNK2001: unresolved external symbol "private: static int Dizionario<int,char>::Lista::NumElementiDellaLista " (?NumElementiDellaLista@Lista@?$Dizionario@HD@@0HA )
    diz.obj : error LNK2001: unresolved external symbol "public: bool __thiscall Dizionario<int,char>::Lista::InserisciElemento(int ,char)" (?InserisciElemento@Lista@?$Dizionario@HD@@QAE_NHD @Z)
    diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Cancella(int)" (?Cancella@Lista@?$Dizionario@HD@@QAEDH@Z)
    diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Ricerca(int)" (?Ricerca@Lista@?$Dizionario@HD@@QAEDH@Z)
    Debug/diz.exe : fatal error LNK1120: 4 unresolved externals
    Error executing link.exe.

    diz.exe - 5 error(s), 0 warning(s)

    Spero possiate aiutarmi.
    Grazie

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    static int NumElementiDellaLista;
    dev'essere definito al di fuori della dichiarazione di classe.
    (Non ricordo se il typename è necessario, al limite lo togli).

    codice:
         ...
                 int GeneraHashVal(T);
                 Lista *Tabella;
    };
    
    template <class T,class S>
    typename int Dizionario<T,S>::Lista::NumElementiDellaLista=0; // o il valore necessario.
     
    //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();
      ....
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    60
    ma la riga
    static int NumElementiDellaLista;
    la devo togliere?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    No, quella rimane. Le variabili static nella classe sono solo dichiarate, ma la definizione dev'essere esterna.
    Il motivo è che una variabile static esiste a prescindere dall'esistenza di un oggetto di quella classe o no.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    60
    ma la devo mettere public?
    o rimane private?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    La visibilità non c'entra col fatto della dichiarazione/definizione.
    Se hai bisogno di accesso esterno, mettila public, altrimenti lasciala private.
    Ma le due cose non sono collegate.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    60
    ho capito...bene, il primo errore se n'è andato...gli altri tre da cosa possono dipendere?
    Compiling...
    diz.cpp
    Linking...
    diz.obj : error LNK2001: unresolved external symbol "public: bool __thiscall Dizionario<int,char>::Lista::InserisciElemento(int ,char)" (?InserisciElemento@Lista@?$Dizionario@HD@@QAE_NHD @Z)
    diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Cancella(int)" (?Cancella@Lista@?$Dizionario@HD@@QAEDH@Z)
    diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Ricerca(int)" (?Ricerca@Lista@?$Dizionario@HD@@QAEDH@Z)
    Debug/diz.exe : fatal error LNK1120: 3 unresolved externals

    Un'altra cosa...in questa funzione..
    codice:
    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;
    }
    ha un senso fare il cast in questo modo per passare da double a int come in linguaggio c??
    codice:
    int HashFunz=(int)HashFunzDouble;

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da manu86
    Compiling...
    diz.cpp
    Linking...
    diz.obj : error LNK2001: unresolved external symbol "public: bool __thiscall Dizionario<int,char>::Lista::InserisciElemento(int ,char)" (?InserisciElemento@Lista@?$Dizionario@HD@@QAE_NHD @Z)
    diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Cancella(int)" (?Cancella@Lista@?$Dizionario@HD@@QAEDH@Z)
    diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Ricerca(int)" (?Ricerca@Lista@?$Dizionario@HD@@QAEDH@Z)
    Debug/diz.exe : fatal error LNK1120: 3 unresolved externals
    Se hai messo le funzioni template nel file indicato in rosso è normale avere errori di link.
    Un template va messo tutto nell'header file.

    Un'altra cosa...in questa funzione..
    codice:
    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;
    }
    ha un senso fare il cast in questo modo per passare da double a int come in linguaggio c??
    codice:
    int HashFunz=(int)HashFunzDouble;
    Premesso che sarebbe preferibile usare i cast stile C++ ( static_cast<> ), si: la funzione si aspetta un int come ritorno, non un double e il cast serve per quello, altrimenti avresti un errore di compilazione.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    60
    nono le funzioni template sono nel file dizionario.h..non credo sia quello il problema

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Compilando con VC++ l'unico errore di linker trovato si riferiva a quella dichiarazione static.
    Ho trovato altri errori, ma erano di compilazione non di link.
    Anche mettendo il codice in due file separati come da codice postato, non ho altri errori di link.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.