Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] preblema di stack

  1. #1
    Utente di HTML.it L'avatar di ggd94
    Registrato dal
    Aug 2014
    residenza
    Rome
    Messaggi
    15

    [C] preblema di stack

    Salve a tutti! mi stavo cimentando in un esercizio C ne quale devo leggere da file degli ingredienti con la loro quantità e tipo (litri,grammi,unità) e sommare il peso in grammi di tutti gli ingredienti,ma all'avvio del programma mi rileva un errore di stack non riesco a capire perchè Vi ringrazio in anticipo.
    questa è la main:
    codice:
    int main (){
        struct PesiSpecifici* pesi;
        int n_pesi=0;
        float  numero;
        pesi=(struct PesiSpecifici*)malloc(n_pesi*sizeof(struct PesiSpecifici));
        char* file="ex7-es9.txt";
        numero=PesoTotale(file,pesi,n_pesi);
        printf("il peso totale per il dolce è:%f",numero);
        free(pesi);
        return 0;
    }
    questo è il mio file.c
    codice:
    float PesoTotale(char nomefile[],struct PesiSpecifici pesi[],int n_pesi){
        FILE* file=fopen(nomefile,"r");
    if(file==NULL){
    printf("errore apertura file");
    exit(1);
    }
        char c1;
        float peso,peso1,totale=0;
        while(!feof(file)){
            n_pesi++;
            pesi=realloc(pesi,n_pesi*sizeof(struct PesiSpecifici));
            fscanf(file,"%s",&pesi[n_pesi-1].ingrediente);
            fscanf(file,"%c",&c1);
            fscanf(file,"%f",&peso);
            if(c1=='l'){
                peso1=peso*1000;
            }
            else if(c1=='u'){
                peso1=peso*60;
            }
            else{
                peso1=peso;
            }
            pesi[n_pesi-1].peso=peso;
            totale+=pesi[n_pesi-1].peso;
        }
        fclose(file);
        return totale;
    }
    e questo il file.h
    codice:
    Struct PesiSpecifici{
        char ingrediente[32];
        float peso;
    };
    
    float PesoTotale(char nomefile[],struct PesiSpecifici pesi[],int n_pesi);

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Scrivi esattamente che errore ottieni e magari specifica come è strutturato il tuo file. comunque quel codice è veramente mal organizzato e presenta alcuni problemi e alcune azioni inutili.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    C'è un errore già all'inizio:

    int n_pesi=0
    ;
    pesi=(struct PesiSpecifici*)malloc(n_pesi*sizeof(struct PesiSpecifici));

    Non stai allocando lo spazio...

    Il resto non l'ho guardato.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    C'è un errore già all'inizio:

    int n_pesi=0
    ;
    pesi=(struct PesiSpecifici*)malloc(n_pesi*sizeof(struct PesiSpecifici));

    Non stai allocando lo spazio...

    Il resto non l'ho guardato.
    C'è una realloc nella funzione per quello.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    C'è una realloc nella funzione per quello.
    ups, non ci avevo fatto caso (certo che fare una malloc a vuoto è abbastanza inutile )
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    ups, non ci avevo fatto caso (certo che fare una malloc a vuoto è abbastanza inutile )
    Va aggiunto che quel codice non tiene conto dei fatti che:
    • le modifiche a pesi (realloc potrebbe copiare i dati in un nuovo spazio di memoria) e n_pesi non si riflettono nel main
    • non è necessario memorizzare i dati
    • malloc e realloc potrebbero restiruire NULL (vabbè, questo è spesso ignorato)
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it L'avatar di ggd94
    Registrato dal
    Aug 2014
    residenza
    Rome
    Messaggi
    15
    grazie per avermi fatto notare alcune cose comunque per lo stack dovevo solamente mettere il free nel file.c e non nel main visto che non ho nessun puntatore nel main che punti a quelle zone di memoria

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Quote Originariamente inviata da ggd94 Visualizza il messaggio
    non ho nessun puntatore nel main che punti a quelle zone di memoria
    Questo non è completamente vero dato che il puntatore iniziale è nel main e lo passi alla funzione.

    A questo punto quel puntatore, la prima realloc e il suo passaggio è assolutamente inutile.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da ggd94 Visualizza il messaggio
    grazie per avermi fatto notare alcune cose comunque per lo stack dovevo solamente mettere il free nel file.c e non nel main visto che non ho nessun puntatore nel main che punti a quelle zone di memoria
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    • le modifiche a pesi (realloc potrebbe copiare i dati in un nuovo spazio di memoria) e n_pesi non si riflettono nel main
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Questo non è completamente vero dato che il puntatore iniziale è nel main e lo passi alla funzione.

    A questo punto quel puntatore, la prima realloc e il suo passaggio è assolutamente inutile.
    Ecco, appunto. Come dicevo quel codice è molto mal organizzato. Se devi presentarlo ad un docente è meglio che lo riscrivi sfruttando i suggerimenti ottenuti, altrimenti è meglio che lo riscrivi per capire come andrebbe strutturato correttamente.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.