From e974c7898b1c372beba5e8210decb670953f9d30 Mon Sep 17 00:00:00 2001 From: manusmac Date: Tue, 2 Dec 2025 14:34:36 +0100 Subject: [PATCH] =?UTF-8?q?kleine=20=C3=84nderung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imageInput.c | 92 +++++++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/imageInput.c b/imageInput.c index c0a5ec0..bb4eb25 100644 --- a/imageInput.c +++ b/imageInput.c @@ -4,21 +4,22 @@ #include "imageInput.h" #define BUFFER_SIZE 100 -#define FILE_HEADER_STRING "mnist_model.info2" - -// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei - +#define FILE_HEADER_STRING "__info2_image_file_format__" +// Hilfsfunktion: File Header überprüfen static int checkFileHeader(FILE* f) { - char buffer[BUFFER_SIZE]; + char buffer[BUFFER_SIZE]; size_t len = strlen(FILE_HEADER_STRING); + if (fread(buffer, 1, len, f) != len) { return -1; // Fehler beim Lesen } + buffer[len] = '\0'; return strcmp(buffer, FILE_HEADER_STRING) == 0 ? 0 : -1; } +// Hilfsfunktion: Metadaten lesen (Anzahl, Breite, Höhe) static int readImageMeta(FILE* f, unsigned short* count, unsigned short* width, unsigned short* height) { if (fread(count, sizeof(unsigned short), 1, f) != 1) return -1; if (fread(width, sizeof(unsigned short), 1, f) != 1) return -1; @@ -26,6 +27,7 @@ static int readImageMeta(FILE* f, unsigned short* count, unsigned short* width, return 0; } +// Hilfsfunktion: Ein einzelnes Bild einlesen (NUR Pixel, OHNE Label) static GrayScaleImage readSingleImage(FILE* f, unsigned short width, unsigned short height) { GrayScaleImage img; @@ -43,45 +45,20 @@ static GrayScaleImage readSingleImage(FILE* f, unsigned short width, unsigned sh img.height = 0; return img; } -} - - -static GrayScaleImageSeries readImageSeries(FILE* f, unsigned short count, unsigned short width, unsigned short height) { - GrayScaleImageSeries series; - - // Anzahl der Bilder speichern - series.count = count; - - // Speicher für Bilder und Labels reservieren - series.images = malloc(count * sizeof(GrayScaleImage)); - series.labels = malloc(count * sizeof(unsigned char)); - - if (series.images == NULL || series.labels == NULL) { - // Fehlerfall: kein Speicher - series.count = 0; - series.images = NULL; - series.labels = NULL; - return series; + // Pixeldaten einlesen + if (fread(img.buffer, sizeof(GrayScalePixelType), pixelCount, f) != pixelCount) { + // Fehler beim Lesen: Speicher freigeben + free(img.buffer); + img.buffer = NULL; + img.width = 0; + img.height = 0; } - // Alle Bilder und Labels einlesen - for (unsigned short i = 0; i < count; i++) { - series.images[i] = readSingleImage(f, width, height); - - // Label separat lesen - if (fread(&series.labels[i], sizeof(unsigned char), 1, f) != 1) { - series.labels[i] = 0; // Fehlerfall: Default-Label - } - } - - return series; + return img; } - -// Test -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen - +// Hauptfunktion: Bildserie aus Datei lesen GrayScaleImageSeries *readImages(const char *path) { FILE *f = fopen(path, "rb"); @@ -123,8 +100,18 @@ GrayScaleImageSeries *readImages(const char *path) // 4. Bilder + Labels einlesen for (unsigned short i = 0; i < count; i++) { + // Bild einlesen series->images[i] = readSingleImage(f, width, height); + + // Prüfen ob Bild erfolgreich gelesen wurde + if (series->images[i].buffer == NULL) { + // Fehler beim Bild-Lesen → Serie freigeben + clearSeries(series); + fclose(f); + return NULL; + } + // Label einlesen if (fread(&series->labels[i], sizeof(unsigned char), 1, f) != 1) { // Fehler beim Label-Lesen → Serie freigeben clearSeries(series); @@ -137,8 +124,31 @@ GrayScaleImageSeries *readImages(const char *path) return series; } - -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt +// Funktion: Bildserie vollständig aus dem Speicher freigeben void clearSeries(GrayScaleImageSeries *series) { + if (series == NULL) { + return; + } + + // Alle einzelnen Bilder freigeben + if (series->images != NULL) { + for (unsigned int i = 0; i < series->count; i++) { + if (series->images[i].buffer != NULL) { + free(series->images[i].buffer); + series->images[i].buffer = NULL; + } + } + free(series->images); + series->images = NULL; + } + + // Labels-Array freigeben + if (series->labels != NULL) { + free(series->labels); + series->labels = NULL; + } + + // Die Serie selbst freigeben + free(series); } \ No newline at end of file