Salve a tutti, ho i seguenti file di testo:
listino.txt:
codice:acqua fiuggi 7.0 acqua recoaro 6.0 pasta barilla 0.3 pasta dececco 0.5
venduti.txt:
codice:acqua recoaro acqua recoaro pasta barilla pasta barilla acqua recoaro pasta dececco
Devo fare un programma che, chiesto all'utente una tipologia di prodotto(Es. acqua o pasta)
stampi a video per ogni marca di quel prodotto(Es. per l'acqua le marche sono recoaro e fiuggi)
nome della marca, prezzo(un float) e il numero di campioni venduti.
Per esempio, se si sceglie acqua come tipologia l'output sarà:
codice:Marca: recoaro prezzo:6.0 esemplari venduti:3 Marca: fiuggi prezzo:7.0 esemplari venduti:0
Io ho fatto il programma e funzionerebbe bene a parte il fatto che proprio su una delle ultime istruzioni, una free() chiamata per deallocare un'area di memoria allocata tramite malloc(), mi parte un'eccezione.
Ecco il codice:
codice:#include <stdio.h> #include <string.h> #include <stdlib.h> #define DIM 11 //Item=Struttura contenente l'informazione completa su un prodotto cioè: tipologia, marca, prezzo, campioni venduti typedef struct{ char tipologia[DIM], marca[DIM]; float prezzo; int venduti; } item; //Questa funzione riceve i due file e una tipologia, alloca lo spazio necessario a contenere tutti gli item relativi alla tipologia(Che si distinguono per la marca) tramite malloc, in tale spazio salva tali item e restituisce l'indirizzo(final) a tale area di memoria. Inoltre salva la quantità di item messi in final tramite il parametro size. Qui è chiamata la malloc() ma non la free(). item* articoli(FILE *listino, FILE *venduti, char *tipologia, int *size){ item temp, *final; int i=0; *size=0; while(fscanf(listino, "%s %s %f\n", temp.tipologia, temp.marca, &(temp.prezzo))==3) if(!strcmp(temp.tipologia, tipologia)) (*size)++; final=(item*) malloc(*size*sizeof(item)); //VIENE INVOCATA LA MALLOC rewind(listino); while(fscanf(listino, "%s %s %f\n", final[i].tipologia, final[i].marca, &(final[i].prezzo))==3) if(!strcmp(final[i].tipologia, tipologia)) i++; for(i=0; i<*size; i++){ final[i].venduti=0; while(fscanf(venduti, "%s %s\n", temp.tipologia, temp.marca)==2) if(!strcmp(temp.tipologia, tipologia) && !strcmp(temp.marca, final[i].marca)) final[i].venduti++; rewind(venduti); } return final; //Viene restituito l'indirizzo che punta all'area di memoria allocata tramite malloc() } //Il main void main(){ FILE *listino, *venduti; char tipologia[DIM]; int size, i; item *goods; printf("Tipologia di prodotto desiderata: "); scanf("%s", tipologia); if((listino=fopen("listino.txt", "rt"))==NULL || ((venduti=fopen("venduti.txt", "rt"))==NULL)){ perror("Impossibile aprire un file desiderato"); exit(1); } goods=articoli(listino, venduti, tipologia, &size);//goods diventa il puntatore che punta all'area allocata con la malloc() nella funzione articoli() fclose(listino); fclose(venduti); printf("Statistiche relative alla tipologia di prodotto ""%s""\n", tipologia); for(i=0; i<size; i++) printf("Marca:%s prezzo:.2%f$ esemplari venduti:%d\n", goods[i].marca, goods[i].prezzo, goods[i].venduti); free(goods); //ISTRUZIONE CHE SOLLEVA L'ECCEZIONE. SI USA LA FREE PER LIBERARE LA MEMORIA ALLOCATA CON LA MALLOC. system("PAUSE"); }
Questo è il messaggio che compare quando parte l'eccezione:
codice:'Es4.exe': caricato 'C:\Users\Matteo\Documents\Visual Studio 2010\Projects\Es4\Debug\Es4.exe', Simboli caricati. 'Es4.exe': caricato 'C:\Windows\System32\ntdll.dll', Impossibile trovare o aprire il file PDB 'Es4.exe': caricato 'C:\Windows\System32\kernel32.dll', Impossibile trovare o aprire il file PDB 'Es4.exe': caricato 'C:\Windows\System32\KernelBase.dll', Impossibile trovare o aprire il file PDB 'Es4.exe': caricato 'C:\Windows\System32\msvcr100d.dll', Simboli caricati. HEAP[Es4.exe]: Heap block at 003E1C00 modified at 003E1C6C past requested size of 64 Windows ha generato un punto di interruzione in Es4.exe. Ciò può essere dovuto a un danneggiamento dell'heap che indica un bug in Es4.exe o in una qualunque delle DLL che ha caricato. È anche possibile che l'utente abbia premuto F12 mentre Es4.exe era attivo. Controllare la finestra di output per ulteriori informazioni diagnostiche. Il programma '[2572] Es4.exe: Nativo' è terminato con il codice 0 (0x0).
A cosa è dovuto questa eccezione e cosa posso fare per rimediare? Grazie in anticipo.
N.B.:Il codice postato è diviso su più file nel progetto originario, inoltre la scelta della struttura del programma non è mia ma ce l'ha imposta il professore, quindi vi prego di non proporre soluzioni che comportino un cambio radicale della struttura del programma.

Rispondi quotando