Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115

    [C++] Crash del programma inaspettato

    Ciao a tutti, ho risolto questo esercizio che mi era stato assegnato. La compilazione non da errori, ma ogni volta che il programma viene eseguito, va in crash e si chiude.. Non riesco davvero a capire di cosa si tratti, ci sono su da un po di tempo ma non ho mai capito il perchè. Ecco il materiale che vorrei farvi esaminare: (ah, uso il compilatore Orwell Dev C++ 5.6.2 su Windows 8)

    main.cpp
    codice:
    #include <iostream>#include <fstream>
    using namespace std;
    
    
    struct Nodo
    {
        string ID;
        int Qty;
        struct Nodo * Next;
    };
    
    
    void Lista_Scorte(ifstream & Acquisti, ifstream & Prodotti, struct Nodo * Num_pezzi, struct Nodo * Num_venduti);
    int Totale_Venduto(struct Nodo * Num_pezzi);
    
    
    int main ()
    {
        ifstream Acquisti, Prodotti;
        int Totale;
        struct Nodo * Num_pezzi = NULL;
        struct Nodo * Num_venduti = NULL;
        Lista_Scorte(Acquisti, Prodotti, Num_pezzi, Num_venduti);
        while (Num_pezzi != NULL)
            cout <<Num_pezzi->ID <<" " <<Num_pezzi->Qty <<endl;
        Totale = Totale_Venduto(Num_pezzi);
        cout <<"Il totale dei pezzi venduti e': " <<Totale <<endl;
        return 0;
    }
    
    
    void Lista_Scorte(ifstream & Acquisti, ifstream & Prodotti, struct Nodo * Num_pezzi, struct Nodo * Num_venduti)
    {
        string HaveRead;
        int Pieces;
        struct Nodo * TNum_pezzi = NULL;
        struct Nodo * TNum_venduti = NULL;
        TNum_pezzi = Num_pezzi;
        TNum_venduti = Num_venduti;
        Acquisti.open("Acquisti.txt");
        Prodotti.open("Prodotti.txt");
        if (!Acquisti && !Prodotti) return;
        while (!Acquisti.eof())
        {
            getline(Acquisti, HaveRead, ' ');
            TNum_venduti->ID = HaveRead;
            Acquisti >> Pieces;
            TNum_venduti->Qty = Pieces;
            TNum_venduti->Next = new Nodo();
        }
        while (!Prodotti.eof())
        {
            getline(Prodotti, HaveRead, ' ');
            TNum_pezzi->ID = HaveRead;
            Prodotti >> Pieces;
            TNum_pezzi->Qty = Pieces;
            TNum_pezzi->Next = new Nodo();
        }
        Acquisti.close();
        Prodotti.close();
        TNum_pezzi = Num_pezzi;
        TNum_venduti = Num_venduti;
        while (TNum_venduti != NULL)
        {
            if (TNum_venduti->ID == TNum_pezzi->ID)
                TNum_pezzi->Qty = TNum_pezzi->Qty - TNum_venduti->Qty;
            TNum_venduti = TNum_venduti->Next;
            TNum_pezzi = TNum_pezzi->Next;
        }
        delete TNum_pezzi;
        delete TNum_venduti;
        return;
    }
    
    
    int Totale_Venduto(struct Nodo * Num_pezzi)
    {
        int Sum = 0;
        if (Num_pezzi != NULL)
            return Sum = Sum + Num_pezzi->Qty + Totale_Venduto(Num_pezzi->Next);
        else
            return Sum;
    }
    Faccio uso di due file, da cui leggo per costruire le due liste "Num_pezzi" e "Num_venduti":

    Prodotti.txt
    codice:
    ID_1 20
    ID_2 0
    ID_3 30
    ID_4 0
    ID_5 20
    ID_6 0
    ID_7 40
    ID_8 0
    Acquisti.txt
    codice:
    ID_1 5
    ID_3 10
    ID_5 8
    ID_7 20
    Vorrei potervi dire di più, ma non ho davvero idea di cosa si possa trattare.. vi prego aiutatemi, ci sto perdendo la testa su da troppo
    Grazie a tutti!

    P.s : Il problema si verifica nella function "Lista_Scorte".
    Ultima modifica di Mauri94; 06-06-2014 a 11:16

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Bastano 2 minuti di debugging per scoprire che l'errore avviene nella riga

    TNum_venduti->ID = HaveRead;

    a causa del fatto che il puntatore TNum_venduti è NULL (mai allocato)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Grazie mille per l'aiuto!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Prego ... ovviamente dovrai modificare il ciclo di lettura/allocazione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Si, ho pensato di farlo così:
    codice:
    	while (!Acquisti.eof())
    	{
    		getline(Acquisti, HaveRead, ' ');
    		TNum_venduti->ID = HaveRead;
    		Acquisti >> Pieces;
    		TNum_venduti->Qty = Pieces;
    		TNum_venduti->Next = new Nodo();
    		TNum_venduti = TNum_venduti->Next;
    	}
    Tenendo presente che TNum_venduti è stato allocato prima del ciclo.. stessa cosa per TNum_pezzi.

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.