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.