PDA

Visualizza la versione completa : [C++] Crash del programma inaspettato


Mauri94
06-06-2014, 12:12
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


#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


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


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 :dh:
Grazie a tutti!

P.s : Il problema si verifica nella function "Lista_Scorte".

oregon
06-06-2014, 12:25
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)

Mauri94
06-06-2014, 12:37
Grazie mille per l'aiuto!

oregon
06-06-2014, 12:39
Prego ... ovviamente dovrai modificare il ciclo di lettura/allocazione ...

Mauri94
06-06-2014, 12:44
Si, ho pensato di farlo cos:


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.

Loading