Struct cambia valori senza che faccia nulla

di il
3 risposte

Struct cambia valori senza che faccia nulla

Ciao a tutti.
Devo fare un programma web in c. In pratica dovrei fare un client e un server per le aste online.
Il problema comunque non è sul funzionamento tra client e server. Posto la funzione che mi da problemi

offerta rilancia(utente u){
	offerta *of;
	char buff[MAXLINE];
	do{
		if(of == NULL) printf("Il numero dell'offerta non è valido\n");
		memset(buff,'\0',MAXLINE);
		printf("Digitare il numero dell'offerta: ");
		fflush(stdout);
		fgets(buff,MAX,stdin);
	}while((of=cercanumero(atoi(buff)))==NULL);
        printofferta(*of);                                       //fino a qua tutto bene
	memset(buff,'\0',MAXLINE);
	printf("Quanto vuoi offrire: ");
	fflush(stdout);
	fgets(buff,MAXLINE,stdin);
	printofferta(*of);                                 //qua la struttura è cambiata
	of->uoff = atoi(buff);
	of->offerente = u;
	printofferta(*of);                                 //qu cambia ancora
	return *of;
}


vi posto le strutture

typedef struct Utente{
	int id;
	char nome[MAX];
	char password[MAX];
	int connesso;
}utente;

typedef struct Offerta{
	int numoff;				//numero dell'offerta
	utente proprietario;     	 //utente che offre l'oggetto	
	char oggetto[MAXLINE];			//nome dell'oggetto
	char descrizione[MAXLINE];		//descrizione dell'oggetto
	struct timeval post;	//riferisce il momento in cui è stato postato l'oggetto
	int durata;				//durata dell'offerta
	int scash;				//prezzo di partenza
	int uoff;				//ultima offerta sull'oggetto
	utente offerente; 		//utente che ha fatto l'ultima offerta
}offerta;
e la funzione printofferta

void printofferta(offerta of){
	printf("N° offerta: %d\nProprietario: %s\nOgetto: %s\nDescrizione: %s\nPrezzo di partenza: %d\nDurata in secondi: %d\nUltima offerta: %d da %s\n",
					of.numoff,of.proprietario.nome,of.oggetto,of.descrizione,of.scash,of.durata,of.uoff,of.offerente.nome);
	printf("-----------------------------------\n");
}
Dalla seconda printofferta i campi di *of cambiano da struct timeval post fino all'ultimo. poi dopo la seconda printofferta aggiorno i campi uoff e offerente e infatti quelli assumono i valori giusti.
Non capisco come possono cambiare se nemmeno li tocco! Idee?

3 Risposte

  • Re: Struct cambia valori senza che faccia nulla

    Ho risolto così
    
    offerta rilancia(utente u){
    	offerta *of, temp;
    	char buff[MAXLINE];
    	do{
    		if(of == NULL) printf("Il numero dell'offerta non è valido\n");
    		memset(buff,'\0',MAXLINE);
    		printf("Digitare il numero dell'offerta: ");
    		fflush(stdout);
    		fgets(buff,MAX,stdin);
    	}while((of=cercanumero(atoi(buff)))==NULL);
    	temp = *of;
    	memset(buff,'\0',MAXLINE);
    	printf("Quanto vuoi offrire: ");
    	fflush(stdout);
    	fgets(buff,MAXLINE,stdin);
    	temp.uoff = atoi(buff);
    	temp.offerente = u;
    	return temp;
    }
    
    così funziona anche se non ho capito perchè visto che il puntatore non lo tocco se non per cambiare quei due campi. 10000000000000000€ a chiunque sia in grado di spiegarmi il perchè!!
  • Re: Struct cambia valori senza che faccia nulla

    
    
    offerta rilancia(utente u){
       offerta *of;
       char buff[MAXLINE];
       do{
          if(of == NULL) printf("Il numero dell'offerta non è valido\n");
          memset(buff,'\0',MAXLINE);
          printf("Digitare il numero dell'offerta: ");
          fflush(stdout);
          fgets(buff,MAX,stdin);
       }while((of=cercanumero(atoi(buff)))==NULL);
            printofferta(*of);                                       //fino a qua tutto bene
       memset(buff,'\0',MAXLINE);
       printf("Quanto vuoi offrire: ");
       fflush(stdout);
       fgets(buff,MAXLINE,stdin);
       printofferta(*of);                                 //qua la struttura è cambiata
       of->uoff = atoi(buff);
       of->offerente = u;
       printofferta(*of);                                 //qu cambia ancora
       return *of;
    }
    
    In questa funzione dichiari un puntatore di tipo offerta, non è inizializzato, io consiglio sempre di inizializzarli a NULL. Così subito riscontri il problema nel do...while, perché non hai allocato.
  • Re: Struct cambia valori senza che faccia nulla

    
    offerta rilancia(utente u){
       offerta *of=NULL;
       char buff[MAXLINE];
    
       of = (offerta*)malloc(sizefo(offerta));
    
       do{
          if(of == NULL) printf("Il numero dell'offerta non è valido\n");
          memset(buff,'\0',MAXLINE);
          printf("Digitare il numero dell'offerta: ");
          fflush(stdout);
          fgets(buff,MAX,stdin);
       }while((of=cercanumero(atoi(buff)))==NULL);
            printofferta(*of);                                       //fino a qua tutto bene
       memset(buff,'\0',MAXLINE);
       printf("Quanto vuoi offrire: ");
       fflush(stdout);
       fgets(buff,MAXLINE,stdin);
       printofferta(*of);                                 //qua la struttura è cambiata
       of->uoff = atoi(buff);
       of->offerente = u;
       printofferta(*of);                                 //qu cambia ancora
       return *of;
    }
    
    Prova così vedi funziona?
Devi accedere o registrarti per scrivere nel forum
3 risposte