From c772e34cfd19b93dd9619133703607a250281850 Mon Sep 17 00:00:00 2001 From: "AD005\\z004z3ez" Date: Tue, 18 Nov 2025 16:39:46 +0100 Subject: [PATCH] =?UTF-8?q?gro=C3=9Fe=20Funktion=20in=20einzelne=20Teilfun?= =?UTF-8?q?ktionen=20separiert=20->=20=C3=9Cbersichtlichkeit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imageInput.c | 160 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 111 insertions(+), 49 deletions(-) diff --git a/imageInput.c b/imageInput.c index 908de69..5055210 100644 --- a/imageInput.c +++ b/imageInput.c @@ -43,52 +43,40 @@ static int checkHeader(const GrayScalePixelType *buffer){ } -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen -GrayScaleImageSeries *readImages(const char *path) + +static FILE *openImageFile(const char *path) { - GrayScaleImageSeries *series = NULL; - - FILE *fp = fopen(path, "rb"); //Datei im Binärmodus öffnen - if(!fp) - return NULL; //Fehler: Datei konnte nicht geöffnet werden - - //Buffer zum Einlesen des Headers - GrayScalePixelType header[HEADER_LEN]; + return fopen(path, "rb"); - //Prüfen, ob genau die HEADER_LEN Bytes eingelesen werden - if(fread(header, sizeof(GrayScalePixelType), HEADER_LEN, fp) != HEADER_LEN){ - fclose(fp); - return NULL; - } +} - //Prüfen, ob es sich um den korrekten Header handelt mit Hilfsfunktion - if(!checkHeader(header)){ - fclose(fp); - return NULL; - } - - //Anzahl der Bilder, Breite und Höhe einlesen - unsigned int numImages, width, height; - if(fread(&numImages, sizeof(unsigned int), 1, fp) != 1 || fread(&width, sizeof(unsigned int), 1, fp) != 1 || fread(&height, sizeof(unsigned int), 1, fp)!= 1) +static int ReadCheckHeader(FILE *fp, GrayScalePixelType *header) +{ + if(fread(header, sizeof(GrayScalePixelType), HEADER_LEN, fp) != HEADER_LEN) { - fclose(fp); - return NULL; + return 0; } + return 1; +} - if (!checkDimensions(width, height)) +static int readMetaData(FILE *fp, unsigned int *numImages, unsigned int *width, unsigned int *height) +{ + if(fread(numImages, sizeof(unsigned int), 1, fp) != 1 || fread(width, sizeof(unsigned int), 1, fp) != 1 || fread(height, sizeof(unsigned int), 1, fp)!= 1) { - fclose(fp); - return NULL; + return 0; } - //Speicher für die gesamte Bildserie reservieren (aber nur für die Struktur) - series = malloc(sizeof(GrayScaleImageSeries)); - if(!series) { - free(series); - fclose(fp); - return NULL; //Fehler bei Speicherreservierung - } + return 1; +} +static GrayScaleImageSeries *allocateSeriesStruct(void) +{ + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + return series; +} + +static int AllocateCheckImageAndLabels(GrayScaleImageSeries *series, unsigned int numImages) +{ series->count = numImages; //Speicher für die Pointer an sich belegen series->images = malloc(numImages * sizeof(GrayScaleImage)); //Speicher für alle Bild-Strukturen, nicht aber für die Pixel selbst (denn image ist nochmal ein Array selbst) @@ -100,13 +88,15 @@ GrayScaleImageSeries *readImages(const char *path) free(series->images); //wenn trotzdem was reingeschrieben wurde, dann freigeben free(series->labels); free(series); - - fclose(fp); - return NULL; + return 0; } - //Speicher für die Pixeldaten selbst reserviern und Prüfen, ob er reserviert werden konnte + return 1; +} + +static int AllocateCheckPixelData(GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height) +{ for(unsigned int i = 0; i < numImages; i++){ series -> images[i].buffer = malloc(width * height); //Speicher für Pixeldaten selbst @@ -122,14 +112,16 @@ GrayScaleImageSeries *readImages(const char *path) free(series->labels); free(series); - fclose(fp); - return NULL; - - + return 0; } } - for(int i = 0; i < numImages; i++) + return 1; +} + +static int ReadImagesAndLabels(FILE *fp, GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height) +{ + for(int i = 0; i < numImages; i++) { //Breite und Höhe werden gesetzt (GrayScaleImage) series -> images[i].width = width; @@ -140,23 +132,93 @@ GrayScaleImageSeries *readImages(const char *path) if(fread(series -> images[i].buffer, 1, width * height, fp) != (width * height)) { clearSeries(series); - fclose(fp); - return NULL; + return 0; } //Jedes Bild hat ein Label, was direkt danach eingelesen wird und auf Größe geprüft wird if(fread(&series -> labels[i], 1, 1, fp) != 1){ clearSeries(series); - fclose(fp); - return NULL; + return 0; } } + return 1; +} + + + + + + + +// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen +GrayScaleImageSeries *readImages(const char *path) +{ + GrayScaleImageSeries *series = NULL; + + //Datei im Binärmodus öffnen + FILE *fp = openImageFile(path); + if(!fp) + return NULL; + + //Buffer zum Einlesen des Headers + GrayScalePixelType header[HEADER_LEN]; + //Prüfen, ob genau die HEADER_LEN Bytes eingelesen werden + if(!ReadCheckHeader(fp, header)){ + fclose(fp); + return NULL; + } + + //Prüfen, ob es sich um den korrekten Header handelt mit Hilfsfunktion + if(!checkHeader(header)){ + fclose(fp); + return NULL; + } + + //Anzahl der Bilder, Breite und Höhe einlesen + unsigned int numImages, width, height; //muss man das als Zeiger initialisieren????????? + if(!readMetaData(fp, &numImages, &width, &height)){ + fclose(fp); + return NULL; + } + + + //Prüfen, ob gültige Länge oder Breite + if(!checkDimensions(width, height)){ + fclose(fp); + return NULL; + } + + //Speicher für die gesamte Bildserie reservieren (aber nur für die Struktur) + series = allocateSeriesStruct(); + if(!series) { + fclose(fp); + return NULL; //Fehler bei Speicherreservierung + } + + if(!AllocateCheckImageAndLabels(series, numImages)){ + fclose(fp); + return NULL; + } + + //Speicher für die Pixeldaten selbst reserviern und Prüfen, ob er reserviert werden konnte + if(!AllocateCheckPixelData(series, numImages, width, height)){ + + fclose(fp); + return NULL; + + } + + if(!ReadImagesAndLabels(fp, series, numImages, width, height)){ + fclose(fp); + return NULL; + } + return series; }