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

Discussione: [C] - Puntatori int

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2016
    Messaggi
    6

    [C] - Puntatori int

    Salve,
    cercando soluzioni per creare una tabella hash con la funzione hash perfetta ho trovato una soluzione che mi ha lasciato dei dubbi circa alcuni punti del codice. Ad esempio non sono riuscito a comprendere proprio la funzione hash:

    codice:
    int funzHash(char* v[], const void* k){	return *(int*)k;
    }
    cosa ritorna *(int*)k?

    La funzione viene richiamata qui:

    codice:
    void insert(char* v[], char* e, int k){
    	k=funzHash(v, &k);
    se non violo alcun regolamento (che ho letto), qualcuno saprebbe spiegarmi cosa significa?

    Grazie in anticipo.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non so cosa tu voglia dire di preciso ma quel codice non ha molto senso ...

    La funzione restituisce soltanto il valore puntato dal puntatore passato. Quindi, se passi il puntatore all'intero k, restituisce il valore di k.

    Ma soprattutto non utilizza affatto il vettori di puntatori v ... quindi che lo passi a fare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2016
    Messaggi
    6
    Ciao, grazie per la risposta. Non ho messo tutto il codice perchè non volevo appesantire il topic

    codice:
    //Dizionario implementato con tavola hash con funzione hash perfetta (Comporta spreco di memoria)//con n chiavi distinte a cui viene associato un indice distinto, di consegunza n<=m
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define M 100
    #define DIM_ELEM 20
    
    
    void insert(char* v[], char* e, int k);
    void delete(char* v[], int k);
    char* search(char* v[], int k);
    int funzHash(char* v[], const void* k); //può trasformare chiavi di qualunque tipo in indici dell'array v[]
    void print(char* v[]);
    int menu();
    
    
    
    
    int main(){
    	char* v[M];
    	int i;
    	for(i=0;i<M;i++)
    		v[i]=NULL;
    	int chiave;
    	
    	while(1){
    		int scelta= menu();
    		char* elemento = (char*)malloc(DIM_ELEM * sizeof (char));
    		switch (scelta){
    			case 1: 
    				printf("Inserisci chiave:\n");
    				scanf("%d", &chiave);
    				printf("Inserisci elemento:\n");
    				scanf("%s", elemento);
    				insert(v,elemento,chiave);
    				break;
    			case 2:	
    				printf("Cerca chiave:\n");
    				scanf("%d", &chiave);
    				elemento=search(v,chiave);	
    				if(elemento==NULL)
    					printf("Chiave non trovata.\n");
    				else
    					printf("Elemento trovato: %s\n", elemento);
    				break;
    			case 3:
    				printf("Cancella chiave:\n");
    				scanf("%d", &chiave);
    				delete(v,chiave);
    				break;
    			case 4:
    				print(v);
    				break;	
    			default:
    				return 0;
    		}
    	}
    	
    	return 0;
    }
    
    
    void insert(char* v[], char* e, int k){
    	k=funzHash(v, &k);
    	if(v[k]!=NULL){
    		printf("Esiste già un elemento con questa chiave.\n");
    		return;
    	}
    	v[k]=e;
    	printf("Voce inserita nel dizionario.\n");
    	return;	
    }
    
    
    void delete(char* v[], int k){
    	k=funzHash(v, &k);
    	if(v[k]==NULL){
    		printf("Chiave non presente.\n");
    		return;
    	}
    	free(v[k]);
    	v[k]=NULL;
    	printf("Voce cancellata dal dizionario.\n");
    	return;
    }
    
    
    char* search(char* v[], int k){
    	k=funzHash(v, &k);
    	return v[k];
    }
    
    
    int funzHash(char* v[], const void* k){
    	return *(int*)k;
    }
    Questo è il codice. Puoi capire come viene usata e perchè.E' un esercizio di tipo accademico giusto per far comprendere la logica.

    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mi pare che per la funzHash

    codice:
    int funzHash(char* v[], const void* k){
        return *(int*)k;
    }
    non sia cambiato nulla rispetto a quanto ti ho detto prima ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2016
    Messaggi
    6
    Il mio problema era che non capivo cosa restituiva quel passaggio. Ma....
    - const void*k = non può cambiare ne il valore puntato ne il puntatore
    - la linea
    codice:
    k=funzHash(v, &k);
    restituisce lo stesso valore d'ingresso k o sbaglio?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da Linrush Visualizza il messaggio
    Il mio problema era che non capivo cosa restituiva quel passaggio.
    Te l'ho detto prima ... restituisce il valore di k puntato dal puntatore in ingresso.

    non può cambiare ne il valore puntato ne il puntatore
    Il valore puntato può essere cambiato.

    o sbaglio?
    Scusa, ma ci capiamo? E' la terza volta che te lo dico ...

    La cosa che non capisco ancora io è perché passi il vettore v ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2016
    Messaggi
    6
    Questo codice non l'ho scritto io. Sto cercando di comprenderne il significato- l'obiettivo è quello di realizzare una funzione hash perfetta.
    Ho capito quello che mi hai scritto ma a questo punto mi chiedevo a che serve creare funzhash . scrivere k=v[k] è lo stesso che richiamare la funzione.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ci siamo capiti o non mi spiego ...

    Quella funzione NON utilizza il vettore v ... è come se scrivessi

    k=k;

    L'hai copiata male? E' forse uno "scheletro" di funzione da completare ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2016
    Messaggi
    6
    no ti ho compreso in pieno La funzione prende come parametro un vettore che la funzione non usa in primis e poi ritorna lo stesso valore del secondo parametro preso.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da Linrush Visualizza il messaggio
    no ti ho compreso in pieno La funzione prende come parametro un vettore che la funzione non usa in primis e poi ritorna lo stesso valore del secondo parametro preso.
    Siccome avevi scritto "scrivere k=v[k]" pensavo che avessi capito che veniva utilizzato v mentre non viene affatto utilizzato ed è come se fosse k=k
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.