Problema salvataggio file[RISOLTO]

di il
25 risposte

25 Risposte - Pagina 2

  • Re: Problema salvataggio file[RISOLTO]

    Direi che ci sei.

  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Direi che ci sei.

    wow.. Ora, ultimo "piccolo problema". Alla fine di una mano chiedo se salvare la partita(dati giocatori, mazzo e mazzo di carte usate) tramite la funzione save su un file ad accesso casuale. Il salvataggio sembra che vada a buon fine, però quando vado a richiamare la partita con load mi da valori completamente sballati. Numel è uguale a 2 e lo salvo qui in save:
    void Save(List_utente *list,Mazzo *mazzo,Mazzo *mazzo_old)
    {
    	FILE *f;
    	El_list_utente *tmp = list->inizio;
    
    	f = fopen(FILENAME,"wb");
    	if(f == NULL)
    		printf("Impossibile salvare il file...\n");
    	else{
    		[b]//Salvo il numero di giocatori
    		fwrite(&list->numel,sizeof(int),1,f);[/b]
    
    		//Salvo i giocatori
    		while(tmp!=NULL)
    		{
    			fwrite(&tmp->el,sizeof(Utente),1,f);
    			tmp = tmp->next;
    		}
    
    	
    		fwrite(mazzo,sizeof(Mazzo),1,f);
    
    		fwrite(mazzo_old,sizeof(Mazzo),1,f);
    
    		fclose(f);
    
    		printf("Partita salvata correttamente...\n");
    	}
    }
    ma quando lo richiamo in load e lo stampo per fare la verifica mi da un numero nell'ordine dei milioni, com'è possibile???
    void Load(List_utente *list,Mazzo *mazzo,Mazzo *mazzo_old)
    {
    	FILE *f;
    	El_list_utente *tmp = list->inizio;
    	Utente utente;
    	int i,n;
    	char c;
    	
    	f = fopen(FILENAME,"rb");
    	if(f == NULL)
    		printf("Impossibile aprire il file...\n");
    
    	[b]if(fread(&n,sizeof(int),1,f) == 0)
    		printf("Numero di elementi uguale a 0...\n");
    	else
    	{
    		printf("Elementi caricati: %d", &n);[/b]
    		Pausa();
    		for(i=0;i<n;i++)
    		{
    			if(fread(&utente,sizeof(Utente),1,f) == 0) 
    				printf("Impossibile leggere i dati del giocatore...\n");
    			else{
    				printf("Giocatore letto...\n");
    				printf("%s%d", &utente.nome, &utente.soldi);
    				/*while (!feof(f)){ 
    					printf("%s%d",utente.nome,utente.soldi);
    					fread(&utente,sizeof(Utente),1,f);
    					while((c = getchar()) != '\n' && c != EOF);
    					Pausa();
    				}*/
    				while((c = getchar()) != '\n' && c != EOF);
    				Pausa();
    				AggiungiGiocatoreInCoda(list,&utente);
    				printf("Giocatore caricato in lista...\n");
    			}
    		}
    	
    		if(fread(mazzo,sizeof(Mazzo),1,f) == 0) 
    			printf("Impossibile leggere il mazzo...\n");
    
    		if(fread(mazzo_old,sizeof(Mazzo),1,f) == 0) 
    			printf("Impossibile leggere il mazzo usato...\n");
    
    		fclose(f);
    
    		printf("File caricato correttamente...\n");
    	}
    }
  • Re: Problema salvataggio file[RISOLTO]

    In pratica mi restituisce giusto il nome del giocatore, invece se cerco di stampare un numero intero, come il numero giocatori o il denaro dei giocatori, mi restituisce valori maggiori di 2milioni.
  • Re: Problema salvataggio file[RISOLTO]

    ururi1989 ha scritto:


    In pratica mi restituisce giusto il nome del giocatore, invece se cerco di stampare un numero intero, come il numero giocatori o il denaro dei giocatori, mi restituisce valori maggiori di 2milioni.
    Risolto, l'errore era piuttosto banale:
    printf("Elementi caricati: %d", &n);
    quell'"&" non so cosa ci faceva lì.
    Grazie per l'aiuto ragazzi. Come metto risolto?
  • Re: Problema salvataggio file[RISOLTO]

    Niente, l'inserimento in coda continua a darmi problemi. Sono pippa con le liste.
    //PushEnd
    /*
    Inserisce alla fine della lista un nuovo elemento di tipo User
    INGRESSO:
    list: lista nella quale inserire un elemento
    utente: elemento da inserire nella lista
    
    USCITA:
    list: lista dei giocatori aggiornata (con il giocatore inserito)
    */
    void PushEnd(List_utente *list,Utente *utente)
    {
    	El_list_utente *tmp;
    	El_list_utente *ptr = list->inizio;
    
    	tmp = (El_list_utente *)malloc(sizeof(El_list_utente));
    	if(tmp == NULL)
    		printf("Impossibile inserire utente\n");
    	else
    	{
    		tmp->el = *utente;
    		tmp->next = NULL;
    
    		if(list->numel == 0)
    		{
    			list->inizio = tmp;
    			list->numel++;
    			printf("Primo utente inserito...\n");
    		}
    		Pausa();
    		while(ptr != NULL)
    			ptr = tmp;//ptr = ptr->next;
    		list->numel++;
    	} 
    }
    continua a bloccarsi qui:
    		while(ptr != NULL)
    			ptr = tmp;//ptr = ptr->next;
    non restituisce nessun errore ma il programma non va avanti. helpppppp
  • Re: Problema salvataggio file[RISOLTO]

    Perché hai commentato "ptr = ptr-> next" ?

    E poi, se vuoi inserire un elemento in coda ti consiglio di scorrerre la lista con il criterio " while ( ptr->next != NULL )" e aggiungere l'elemento con "ptr-> next = tmp "
  • Re: Problema salvataggio file[RISOLTO]

    ale99 ha scritto:


    Perché hai commentato "ptr = ptr-> next" ?

    E poi, se vuoi inserire un elemento in coda ti consiglio di scorrerre la lista con il criterio " while ( ptr->next != NULL )" e aggiungere l'elemento con "ptr-> next = tmp "
    ho provato a risolvere così:
    void PushEnd(List_utente *list,Utente *utente)
    {
    El_list_utente *tmp, *prev_ptr, *curr_ptr;
    El_list_utente *ptr = list->inizio;
    
    tmp = (El_list_utente *)malloc(sizeof(El_list_utente));
    if(tmp == NULL)
    printf("Impossibile inserire utente\n");
    else
    {
    tmp->el = *utente;
    tmp->next = NULL;
    
    if(list->numel == 0)
    {
    list->inizio = tmp;
    list->numel++;
    printf("Primo utente inserito...\n");
    }
    Pausa();
    prev_ptr = list->inizio;
    curr_ptr = list->inizio->next;
    while(curr_ptr != NULL){
    prev_ptr = curr_ptr;
    curr_ptr = curr_ptr->next;
    }
    curr_ptr=tmp;
    list->numel++;
    }
    }
    infatti ora mi ordina la lista in modo giusto, ma l'errore di accesso si ripropone quando prova a distribuire la prima mano. Cosa che non succede se faccio l'inserimento in testa. Quindi c'è ancora qualcosa che non va in questa funzione.
  • Re: Problema salvataggio file[RISOLTO]

    Stai facendo lo stesso errore di prima: non capire la differenze tra puntatore ad un oggetto ed oggetto puntato. Esattamente lo stesso errore precedentemente corretto.

    Come dire che hai fatto la correzione 'per sbaglio'

    A che serve 'curr_ptr=tmp'?

    Non scrivere codice a capocchia!

    Una lista e' una struttura dati semplice: si puo' disegnare anche sulla carta con una matita.
    La scansione della lista non e' una cosa miracolosa: puo' essere compresa con il solo utilizzo di carta e matita.

    L'errore si trova, ovviamente, nella scansione della lista dopo il Pause.
    Disegnati su carta una lista di 3 o 4 nodi e segui, passo, passo, come si muovono i puntatori 'prev_ptr' e 'curr_ptr', SU CARTA!
    Una volta capito, SU CARTA, come vanno usati, riuscirai a fare la correzione.

    E' banale!

    Ma e' fondamentale che tu capisca che cosa e' un puntatore: senza questa comprensione, non ne verrai fuori.

    L'errore lo risolve con la sostituzione di 4 caratteri e l'aggiunta di altri 6!
  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Stai facendo lo stesso errore di prima: non capire la differenze tra puntatore ad un oggetto ed oggetto puntato. Esattamente lo stesso errore precedentemente corretto.

    Come dire che hai fatto la correzione 'per sbaglio'

    A che serve 'curr_ptr=tmp'?

    Non scrivere codice a capocchia!

    Una lista e' una struttura dati semplice: si puo' disegnare anche sulla carta con una matita.
    La scansione della lista non e' una cosa miracolosa: puo' essere compresa con il solo utilizzo di carta e matita.

    L'errore si trova, ovviamente, nella scansione della lista dopo il Pause.
    Disegnati su carta una lista di 3 o 4 nodi e segui, passo, passo, come si muovono i puntatori 'prev_ptr' e 'curr_ptr', SU CARTA!
    Una volta capito, SU CARTA, come vanno usati, riuscirai a fare la correzione.

    E' banale!

    Ma e' fondamentale che tu capisca che cosa e' un puntatore: senza questa comprensione, non ne verrai fuori.

    L'errore lo risolve con la sostituzione di 4 caratteri e l'aggiunta di altri 6!
    sei un grande, scrivere codice per vedere se va è inutile. Mi son messo con carta e matita e ho disegnato lo scorrimento della lista passo dopo passo e finalmente ho risolto. Ti posto il codice e metto risolto.
    void PushEnd(List_utente *list,Utente *utente)
    {
    	El_list_utente *tmp, *prev_ptr, *curr_ptr;
    
    	tmp = (El_list_utente *)malloc(sizeof(El_list_utente));
    	if(tmp == NULL)
    		printf("Impossibile inserire utente\n");
    	else
    	{
    		tmp->el = *utente;
    		tmp->next = NULL;
    
    		if(list->numel == 0)
    		{
    			list->inizio = tmp;
    			list->numel++;
    			printf("Primo utente inserito...\n");
    		}
    		prev_ptr = list->inizio;
    		do{
    			curr_ptr = prev_ptr;
    			prev_ptr = curr_ptr->next;
    		}while(prev_ptr != NULL);
    		curr_ptr->next=tmp;
    		list->numel++;
    	} 
    }
    Grazie mille per avermi spinto a ragionarci su senza darmi la pappa pronta. Alla prossima ragazzi.
  • Re: Problema salvataggio file[RISOLTO]

    Hai fatto anche piu' modifiche del necessario: non serviva ribaltare il ciclo while in do/while.

    Il precedente che avevi scritto era chiaro e semplice.

    La nuova versione e' di nuovo inutilmente impasticciata: hai anche cambiato il significato dei due puntatori!!!

    Se prev_ptr sta per puntatore precedente e curr_ptr per puntatore corrente, allora prev_ptr stara' sempre un passo indietro a curr_ptr.

    Invece, cosi' come lo hai scritto, anche se funziona, da l'impressione che funzioni per sbaglio : usi i due puntatori in modo contrario al loro nome!

    Dirai: e che differenza fa?

    La differenza e', ovviamente, nell'impostazione mentale: scrivere programmi richiede molto rigore e molto ordine. Altrimenti dopo una settimana non sarai in grado di capire quello che tu stesso avevi scritto una settimana prima.
  • Re: Problema salvataggio file[RISOLTO]

    migliorabile ha scritto:


    Hai fatto anche piu' modifiche del necessario: non serviva ribaltare il ciclo while in do/while.

    Il precedente che avevi scritto era chiaro e semplice.

    La nuova versione e' di nuovo inutilmente impasticciata: hai anche cambiato il significato dei due puntatori!!!

    Se prev_ptr sta per puntatore precedente e curr_ptr per puntatore corrente, allora prev_ptr stara' sempre un passo indietro a curr_ptr.

    Invece, cosi' come lo hai scritto, anche se funziona, da l'impressione che funzioni per sbaglio : usi i due puntatori in modo contrario al loro nome!

    Dirai: e che differenza fa?

    La differenza e', ovviamente, nell'impostazione mentale: scrivere programmi richiede molto rigore e molto ordine. Altrimenti dopo una settimana non sarai in grado di capire quello che tu stesso avevi scritto una settimana prima.
    hai ragione infatti ho cambiato i nomi ai puntatori, ti dirò di più, avevamo già risolto la prima volta, ma il problema era un altro ed ancora più infatile di questo. Mancava l'else dopo l'if che controllava se la lista fosse vuota. Quindi quando andavo a richiamare la PushEnd per inserire il secondo elemento i puntatori erano già incasinati e la funzione non usciva dal while.
    Grazie ancora per gli aiuti e i suggerimenti.
Devi accedere o registrarti per scrivere nel forum
25 risposte