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

Discussione: [C++] Problema debug

  1. #1

    [C++] Problema debug

    Ciao, il codice che sto per postare è un dizionario costruito con un hash table che in caso di fallimento della parola trovata, restituisce le parole più prossime (stile Google). Il codice fa quello che deve fare, ma dopo un certo numero di inserimenti di nomi, quandio vado a ricercare mi da il messaggio unhandled exception access violation 0xC0000005. Come compilatore uso il Visual C++ 6.0. Sinceramente il problema non so dove sia e spero che qualcuno mi possa rispondere. Grazie.

    codice:
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    class HashTable
    {
    private:
    	vector<string> htArray;
    	int htSize;
    public:
    	HashTable(int);
    	void MostraTabella();
    	int funzHash(const char *);
    	void inserisci(string);
    	bool trova(string);
    	void LCS(string, string, int);
    	void trovavocabolo(string);
    };
    int a_lcs[1000];
    vector <string> a;
    int i;
    HashTable::HashTable(int size)
    {
    		htSize=size;
    		htArray.resize(htSize); 
    		for(int j = 0; j < htSize; j++) 
    			htArray[j] = "";
    }
    void HashTable::MostraTabella()
    {
    		cout << "Tabella: " << endl;
    		for(int j = 0; j < htSize; j++)
    		{
    			if(htArray[j] != "")
    				cout << htArray[j]<< endl;
    		}
    		cout<<endl;
    }
    int HashTable::funzHash(const char *v)
    {
    		int h = 0;
    		int a = 127;
    		for(; *v != 0; v++)
    			h = (a*h + *v) % htSize;
    		return h;
    }
    void HashTable::inserisci(string elemento)
    {
    		string key = elemento;
    		int hashVal = funzHash(key.c_str());
    		while(htArray[hashVal] != "")
    		{
    			hashVal++;
    			hashVal %= htSize;
    		}
    		htArray[hashVal] = elemento;
    }
    bool HashTable::trova(string key)
    {
    		int hashVal = funzHash(key.c_str());
    		while(htArray[hashVal] != "")
    		{ 
    			if(htArray[hashVal] == key)
    				return true;
    			hashVal++;
    			hashVal %= htSize;
    		}
    		return false;
    }
    void HashTable::LCS(string s, string a, int k)
    {
        int* l;					
        l=new int[s.size()*a.size()];
        for(int r=0;r<=s.size();r++) 
    	for(int c=0;c<=a.size();c++)
    			l[r*a.size()+c]=0; 
    
    		for(  r=1;r<=s.size();r++)		
    			for( int c=1;c<=a.size();c++) { 
    			if(s[r-1]==a[c-1])		
    				l[r*a.size()+c]=l[(r-1)*a.size()+(c-1)]+1; 
    			else if(l[r*a.size()+(c-1)] > l[(r-1)*a.size()+c]) 
    				l[r*a.size()+c]=l[r*a.size()+(c-1)]; 
    			else				
    				l[r*a.size()+c]=l[(r-1)*a.size()+c];
    			}
    
    			 r=s.size(); int c=a.size();  
    			a_lcs[k]=l[r*a.size()+c];	
    }		
    void HashTable::trovavocabolo(string s)
    {
    	string p;
    	for(i=0; i<htSize; i++)
    	{
    		a=htArray;	
    	}
    
        for(int k=0; k<i; k++)
    	{
    		p=a[k];
    		LCS(s,p,k);
    	}
    	int temp,b;
    	string s_temp;
    	for( k=1; k <i; k++)		
    	{
    		temp=a_lcs[k];		
    		s_temp=a[k];	   
    		b = k-1;			
    		while (b >= 0 && a_lcs[b] > temp)	
    		{									 
    			a_lcs[b+1]= a_lcs[b];			
    				a[b+1]=a[b];
    				b--;						
    		}
    		a_lcs[b+1]=temp;					
    		a[b+1]=s_temp;
    	}
    
    }
    int main()
    {
    	string x;
    	string chiave,lcs;
    	int size;
    	char scelta = '0';
    	cout << "Inserisci la dimensione della hash table: ";
    	cin >> size;
    	cout<<endl;
    	HashTable myHashTable(size);
    	cout<<"Premi 1 per mostrare il dizionario"<<endl;
    	cout<<"Premi 2 per inserire un elemento"<<endl;
    	cout<<"Premi 3 per ricercare un elemento"<<endl;
    	cout<<"Premi 4 per uscire"<<endl;
    	while(scelta!='4')
    	{
    		cout <<"Inserisci la tua scelta: ";
    		char scelta;
    		cin >> scelta;
    		cout<<endl;
    		switch(scelta)
    		{
    		case '1':
    			myHashTable.MostraTabella();
    			break;
    		case '2':
    			cout << "Inserisci il valore chiave da aggiungere: ";
    			cin >> chiave;
    			cout<<endl;
    			myHashTable.inserisci(chiave);
    			break;
    		case '3':
    			cout << "Inserisci il valore chiave da trovare: ";
    			cin >> chiave;
    			if(myHashTable.trova(chiave) == false )
    			{
    				myHashTable.trovavocabolo(chiave);
    				cout << "Non trovato, cercavi forse " << a[i-1]<<", "<<a[i-2]<<" oppure "<<a[i-3]  <<endl;
    			}
    			else
    				cout<<"Trovato"<<endl;
    			break;
    		case '4':
    			return 0;
    		default:
    			cout << "Scelta non valida"<<endl;
    		} 
    	} 
    	system("pause");
    	return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A me non compila nemmeno.
    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
    Io uso Visual C++ 6 e va in esecuzione...non saprei proprio dire il motivo.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A parte qualche warning, l'ho compilato, ma non sono riuscito a replicare il problema.

    Riesci a darmi una esatta sequenza di operazioni da farsi e dati da inserire per "replicare" esattamente il problema?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Strano. Col VC++ 2008 espresso a me protesta su questo pezzo di codice. Il che a prima vista mi sembra normale dal momento che la variabile r è definita in un blocco di codice e nell'altro no.
    (Tra l'altro come dovrebbero essere annidati i for? )
    codice:
    void HashTable::LCS(string s, string a, int k)
    {
        int* l;					
        l=new int[s.size()*a.size()];
       // qui è definita
        for(int r=0;r<=s.size();r++) 
    	for(int c=0;c<=a.size();c++)
    			l[r*a.size()+c]=0; 
    
    		for(  r=1;r<=s.size();r++) // qui no.		
    			for( int c=1;c<=a.size();c++) { 
    			if(s[r-1]==a[c-1])		
    				l[r*a.size()+c]=l[(r-1)*a.size()+(c-1)]+1; 
    			else if(l[r*a.size()+(c-1)] > l[(r-1)*a.size()+c]) 
    				l[r*a.size()+c]=l[r*a.size()+(c-1)]; 
    			else				
    				l[r*a.size()+c]=l[(r-1)*a.size()+c];
    			}
    
    			 r=s.size(); int c=a.size();  
    			a_lcs[k]=l[r*a.size()+c];	
    }
    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.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non hai torto shodan, compilato con il 2008 fornisce quell'errore (e anche un altro simile per la variabile k ...) e mi sembra giusto che sia cosi'.

    Ma compilato con il 2003, a parte qualche warning, la compilazione va a buon fine ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Se posso dire anche la mia compilato su Mac mi da questi errori:
    codice:
    My-imac:desktop pacio$ g++ main.cpp
    main.cpp: In member function ‘void HashTable::LCS(std::string, std::string, int)’:
    main.cpp:79: error: name lookup of ‘r’ changed for new ISO ‘for’ scoping
    main.cpp:75: error:   using obsolete binding at ‘r’
    main.cpp: In member function ‘void HashTable::trovavocabolo(std::string)’:
    main.cpp:107: error: name lookup of ‘k’ changed for new ISO ‘for’ scoping
    main.cpp:100: error:   using obsolete binding at ‘k’
    Quindi concordo con quanto già affermato...

  8. #8
    Posto qui perchè il titolo è proprio inerente al mio problema:

    perchè il debug mi da un risultato mentre quando provo a compilarlo me ne da un altro?
    Ci sono solo due cose infinite: l'universo e la stupidità umana. Ma non sono del tutto sicuro della prima

  9. #9
    Scusate, vi posto i file in questione (bisogna aprire un file di testo)

    codice

    file
    Ci sono solo due cose infinite: l'universo e la stupidità umana. Ma non sono del tutto sicuro della prima

  10. #10
    Per quanto riguarda il tuo errore shodan il mio (non so che versione sia) mi dice che devi ridichiarare alcune variabili

    rigo 79-89 variabile r;
    rigo 107 variabile k.
    Ci sono solo due cose infinite: l'universo e la stupidità umana. Ma non sono del tutto sicuro della prima

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.