Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] - creazione prodotto supermercato

    Un prodotto di un supermercato può essere catalogato come "fresco", "alimentare", "detersivo" o "altro". Se il prodotto è fresco, abbiamo bisogno di una data di scadenza.
    Inoltre, un prodotto è definito da un codice, da un prezzo di acquisto e un prezzo di vendita, con il prezzo di vendita sempre maggiore di quello d'acquisto.
    Dato che bisogna gestire vari prodotti, ogni prodotto è pensato per far parte di una lista; contiene, quindi, un riferimento alla quantità di prodotti di quel tipo presenti e un riferimento al prodotto successivo.

    Ecco come ho pensato di implementare il tutto. Creo un nuovo tipo struttura Prodotto_t e la funzione per creare un nuovo prodotto. Inoltre, creo un'enumerazione esterna di tipi di prodotti, che mi serviranno nel resto del programma. Consigli, suggerimenti? Grazie mille a tutti!!

    codice:
    enum tipi {FRESCO = 1, ALIMENTARE, DETERSIVO, ALTRO};
    
    typedef struct prodotto
    {
    	char *nome;
    	long codice;
    	int tipo;
    	int scadenza;
    	double prezzoacq;
    	double prezzoven;
    	int quantita;
    	struct prodotto *next;
    } Prodotto_t;
    
    /*
    ** Crea un nuovo prodotto partendo dalle sue caratteristiche.
    ** Restituisce NULL se non è possibile allocare nuova memoria o se il prezzo di 
    ** vendita è inferiore a quello di acquisto; restituisce un puntatore a Prodotto_t
    ** se procede tutto bene.
    */
    Prodotto_t *creaprodotto(char *nome, long codice, int tipo, double prezzoacq, 
    		double prezzoven)
    {
    	Prodotto_t *newp = malloc (sizeof(Prodotto_t));
    	if (newp == NULL)
    	{
    		fprintf(stderr, "creaprodotto: Impossibile allocare nuova memoria\n");
    		return NULL;
    	}
    	
    	if(prezzoacq >= prezzoven)
    	{
    		fprintf(stderr, "creaprodotto: Prezzo vendita deve essere maggiore di"
    				"prezzo acquisto\n");
    		return NULL;
    	}
    	
    	strcpy(newp->nome, nome);
    	newp->codice = codice;
    	newp->tipo = tipo;
    	newp->prezzoacq = prezzoacq;
    	newp->prezzoven = prezzoven;
    	newp->quantita = 0; //quantita qui non interessa, verrò definita al momento dell'inserimento del prodotto con la funzione addprodotto
    	if (tipo = FRESCO)
    		newp->scadenza = 0;
    	else
    		newp->scadenza = -1; //se non si tratta di un prodotto fresco, non c'è bisogno di una data di scadenza
    	
    	return newp;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Cosa dirti ... in genere non si esamina tutto un programma ma si fornisce un aiuto specifico su problemi specifici ...

    In ogni caso, vedo già errori come

    if (tipo = FRESCO)

    da correggere ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Cosa dirti ... in genere non si esamina tutto un programma ma si fornisce un aiuto specifico su problemi specifici ...
    Yez, vero, in generale. In questo caso volevo semplicemente dei consigli su come impostare al meglio questa parte di programma. In particolare, pensi che la funzione di creazione di un nuovo prodotto sia giusta? Perchè sembra essere proprio quella ad andare in segmentation fault al momento del lancio del programma.

    In ogni caso, vedo già errori come
    if (tipo = FRESCO)
    da correggere ...
    Non avevo riletto il programma, grazie mille per la segnalazione

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da tigerjack89
    ... segmentation fault al momento del lancio del programma.
    Ma scusa, allora invece di aprire un thread con un titolo generico, se sai che c'è un errore di segmentation fault (e presupponi anche di sapere dove sia) perché non apri un thread *specifico*, indicando l'errore?

    Comunque, come al solito perché avvenuto in altri tuoi post, utilizzi un puntatore e precisamente newp->nome in

    strcpy(newp->nome, nome);

    senza avere allocato prima lo spazio ...

    Non so come dirtelo più ... così hai - puntualmente - un seg fault.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Ma scusa, allora invece di aprire un thread con un titolo generico, se sai che c'è un errore di segmentation fault (e presupponi anche di sapere dove sia) perché non apri un thread *specifico*, indicando l'errore?

    Comunque, come al solito perché avvenuto in altri tuoi post, utilizzi un puntatore e precisamente newp->nome in

    strcpy(newp->nome, nome);

    senza avere allocato prima lo spazio ...

    Non so come dirtelo più ... così hai - puntualmente - un seg fault.
    Solo perchè oltre allo specifico errore, vorrei avere consigli sul modo migliore per implementare un programma del genere
    Quindi, ritornando al problema, devo allocare semplicemente lo spazio per newp->nome?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da tigerjack89
    Solo perchè oltre allo specifico errore, vorrei avere consigli sul modo migliore per implementare un programma del genere
    In realtà non c'è un "modo migliore" codificato strettamente per il tipo di programma (quale "tipo"?) che stai scrivendo.

    Ci sono solo delle "buone regole" di programmazione che si seguono sempre, a prescindere dal "tipo" di programma.

    Ad esempio, ti faccio notare che tu allochi una struttura con la malloc e *dopo* effettui un controllo (sul prezzo) per cui puoi anche uscire dalla funzione *senza aver liberato la memoria allocata*, causando un "memory leak" che, con il tempo, potrebbe bloccare il funzionamento dell'intero sistema.
    In questi casi, devi fare attenzione a liberare la memoria precedentemente allocata oppure ad allocarla *dopo* aver fatto quel controllo. Infatti, se fai il controllo del prezzo prima di tutto il resto, non incorri in questo problema.

    Quindi, ritornando al problema, devo allocare semplicemente lo spazio per newp->nome?
    Beh, se vuoi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    In realtà non c'è un "modo migliore" codificato strettamente per il tipo di programma (quale "tipo"?) che stai scrivendo.

    Ci sono solo delle "buone regole" di programmazione che si seguono sempre, a prescindere dal "tipo" di programma.

    Ad esempio, ti faccio notare che tu allochi una struttura con la malloc e *dopo* effettui un controllo (sul prezzo) per cui puoi anche uscire dalla funzione *senza aver liberato la memoria allocata*, causando un "memory leak" che, con il tempo, potrebbe bloccare il funzionamento dell'intero sistema.
    In questi casi, devi fare attenzione a liberare la memoria precedentemente allocata oppure ad allocarla *dopo* aver fatto quel controllo. Infatti, se fai il controllo del prezzo prima di tutto il resto, non incorri in questo problema.
    Grazie, era proprio quello che intendevo. Avere consigli generici su un po' tutto il programma e capire passo passo le cose che potevano essere migliorate. Ho ancora problemi di segmentation fault in un'altra parte del programma, ma di questo parlerò a breve in un altro 3d.
    Ancora grazie per l'aiuto

  8. #8
    Prima un'altra domanda: visto che ogni prodotto è caratterizzato da una determinata quantità, ma che questa quantità non è conosciuta al momento della creazione del prodotto stesso, mi conviene definirla e impostarla a zero e successivamente modificarla, oppure lasciarla indefinita e definirla poi al momento opportuno??

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ti conviene impostarla a -1 per sapere che quella quantità non è mai stata impostata/modificata.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    Ti conviene impostarla a -1 per sapere che quella quantità non è mai stata impostata/modificata.
    Proprio quello che avevo pensato Grazie mille.

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