diff --git a/info2praktikum-neuronalesnetz/imageInput.c b/info2praktikum-neuronalesnetz/imageInput.c index 9a4e115..e22a486 100644 --- a/info2praktikum-neuronalesnetz/imageInput.c +++ b/info2praktikum-neuronalesnetz/imageInput.c @@ -12,25 +12,26 @@ static FILE* openImageFile(const char* path) { FILE* imageFile = NULL; imageFile = fopen(path, "rb"); + if (imageFile == NULL) { + // Fehler beim Öffnen + return NULL; + } + // Prüfe, ob die Datei mit dem richtigen String beginnt char *fileHeaderString = (char*)malloc(BUFFER_SIZE); - fread(fileHeaderString, 1, (BUFFER_SIZE - 1), imageFile); + fread(fileHeaderString, 1, strlen(FILE_HEADER_STRING) + 1, imageFile); if (strncmp(fileHeaderString, FILE_HEADER_STRING, 27)) { // Datei hat nicht das korrekte Format // Speicherplatz freigeben free(fileHeaderString); + fclose(imageFile); return NULL; } // Speicherplatz freigeben free(fileHeaderString); - if (imageFile == NULL) { - printf("Unbekannter Fehler, imageFile ist Null"); - return NULL; - } - return imageFile; } @@ -64,12 +65,14 @@ static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], Gra static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) { // SPeicher für Buffer allokieren - image->buffer = malloc(image->width * image->height * sizeof(GrayScalePixelType)); + image->buffer = malloc(image->width * image->height); + + size_t expectedItems = (size_t)image->width * image->height; // Anzahl der Pixel/Bytes // Pixelwerte aus Datei auslesen - int itemsRead = fread(image->buffer, 1, image->width * image->height * sizeof(GrayScalePixelType), imageFile); + int itemsRead = fread(image->buffer, sizeof(GrayScalePixelType), expectedItems, imageFile); - if (itemsRead != image->width * image->height) { + if (itemsRead != expectedItems) { free(image->buffer); return -1; } @@ -77,7 +80,7 @@ static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) { return 0; } -static unsigned char getLabelOfImage(FILE* imageFile, GrayScaleImage* image) { +static char getLabelOfImage(FILE* imageFile, GrayScaleImage* image) { // Array um Label zu speichern unsigned char *bytestream = malloc(1); @@ -121,6 +124,8 @@ GrayScaleImageSeries *readImages(const char *path) if (erfolg == -1) { printf("Unbekannter Fehler bei getInformationOfImages."); + fclose(imageFile); + return NULL; } // Speicher für die Labels vorbereiten, wird später Bild für Bild befüllt @@ -128,26 +133,54 @@ GrayScaleImageSeries *readImages(const char *path) // labels = unsigned char-Array mit der Größe wie AnzahlBilder if (series->labels == NULL) { - printf("Fehler bei malloc"); + printf("Fehler: Speicherzuweisung für labels fehlgeschlagen.\n"); + free(series); + fclose(imageFile); + return NULL; + } + + // Speicher für das Array von GrayScaleImage-Strukturen vorbereiten + series->images = malloc(series->count * sizeof(GrayScaleImage)); + if (series->images == NULL) { + printf("Fehler: Speicherzuweisung für images fehlgeschlagen.\n"); + free(series->labels); // Zuerst labels freigeben + free(series); + fclose(imageFile); return NULL; } for (int i = 0; i < series->count; i++) { // image initialisieren - GrayScaleImage *image = NULL; - image = (GrayScaleImage *)malloc(sizeof(GrayScaleImage)); + GrayScaleImage *image = &series->images[i]; + // image = (GrayScaleImage *)malloc(sizeof(GrayScaleImage)); image->width = dimensionsOfImages[0]; image->height = dimensionsOfImages[1]; + image->buffer = NULL; + // Graustufe-Pixel lesen und im image speichern if(getGrayScalePixelOfImage(imageFile, image) != 0) { - printf("Fehler bei getGrayScalePixelOfImage"); + printf("Fehler: Konnte Pixel des Bildes %d nicht lesen.\n", i + 1); + fclose(imageFile); + clearSeries(series); + return NULL; } - series->labels[i] = getLabelOfImage(imageFile, image); + // label lesen und in der series an entsprechender Stelle speichern + int labelResult = getLabelOfImage(imageFile, image); + if (labelResult == -1) { + printf("Fehler: Konnte Label des Bildes %d nicht lesen.\n", i); + fclose(imageFile); + clearSeries(series); + return NULL; + } + series->labels[i] = (unsigned char)labelResult; - if (series->labels[i] == -1) { - printf("Fehler bei getLabelOfImage"); + if (series->images == NULL) { + printf("Fehler bei malloc für images"); + free(series->labels); // Labels freigeben + free(series); // Serie freigeben + return NULL; } } @@ -159,6 +192,7 @@ GrayScaleImageSeries *readImages(const char *path) // series.labels[i] = (unsigned char)(i % 256); // Springe in der Datei an die Stelle nach dem i. Bild + fclose(imageFile); return series; }