#include #include #define N_PIXEL 3072 //1024 pixel * 3 (R, G, B) //Siccome il char è un byte che rappresenta il valore tra 0 e 255. Per evitare confusioni definisco il tipo "byte" come in Java typedef unsigned char byte; // Singola istanza del dataset. typedef struct { byte categoria; byte immagine[N_PIXEL]; } Istanza; //Questo tipo fornisce il vettore delle istanze e il size (dimensione) del vettore typedef struct { int size; Istanza *istanze; } Dataset; Dataset* get_dataset(char *); //Questo metodo legge il file in questione e restituisce un puntatore a Dataset se il file esiste, altrimenti NULL //Ritorna un puntatore perchè in questo caso posso gestire il ritorno NULL. Dataset* get_dataset(char *path) { Dataset *set = (Dataset *) malloc(sizeof(Dataset)); FILE *file; Istanza istanza; Istanza *istanze = (Istanza *)malloc(sizeof(Istanza)); file = fopen(path, "rb"); if(file == NULL) return NULL; int numero_righe = 0; //Fino a quando questo fread restituisce 1 significa che il file contiene ancora roba while(fread(&istanze[numero_righe].categoria, sizeof(byte), 1, file) == 1) { if(fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL) { numero_righe ++; istanze = (Istanza *)realloc(istanze, sizeof(Istanza) * (numero_righe + 1)); //printf("Caricata nel sistema riga %d\n", numero_righe); } } //Dataset set; (*set).size = numero_righe; (*set).istanze = istanze; fclose(file); return set; } /* void main() { char *path = "cifar-10-batches/data_batch_1.bin"; //Carico il dataset e controllo che non sia nullo Dataset *dataset = get_dataset(path); if(dataset == NULL) { printf("Oggetto dataset nullo\n"); return; } //Lo copio in una seconda variabile per non dover mettere sempre * davanti al nome e libero la memoria occupata dal puntatore Dataset set = *dataset; free(dataset); //Stampa di debug for(int i = 0; i < set.size; i++) { printf("n: %d. Categoria: %d\n", i, (int)set.istanze[i].categoria); } } */