From e764bc44c8e390fc1149e13f480a7894f66a222b Mon Sep 17 00:00:00 2001 From: niklaskegelmann Date: Sun, 16 Nov 2025 22:35:43 +0100 Subject: [PATCH] Kommentare --- imageInput.c | 91 ++++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/imageInput.c b/imageInput.c index 077796b..26f27de 100644 --- a/imageInput.c +++ b/imageInput.c @@ -12,150 +12,149 @@ // Gibt 1 bei Erfolg, 0 bei Fehler zurück. static int readHeader(FILE *file, unsigned int *count, unsigned int *width, unsigned int *height) { - const size_t tagLength = strlen(FILE_HEADER_STRING); - char fileTag[30]; + const size_t tagLength = strlen(FILE_HEADER_STRING); //Länge des Strings wird ermittelt + char fileTag[30]; //wird in Array geschrieben // 1. Lesen des Identifikationstags und Überprüfung - if (fread(fileTag, sizeof(char), tagLength, file) != tagLength) + if (fread(fileTag, sizeof(char), tagLength, file) != tagLength) //Überprüfung ob richtig eingelesen wurde { - return 0; + return 0; //gibt 0 bei Fehler zurück } fileTag[tagLength] = '\0'; - if (strcmp(fileTag, FILE_HEADER_STRING) != 0) + if (strcmp(fileTag, FILE_HEADER_STRING) != 0) //Strings werden verglichen (strcmp) { - return 0; + return 0; //gibt 0 bei Fehler zurück } // 2. Lesen der drei Ganzzahlen (Anzahl Bilder, Breite, Höhe) unsigned short temp_count, temp_width, temp_height; // Lesen in der Reihenfolge: Anzahl, Breite, Höhe (entsprechend prepareImageFile) - if (fread(&temp_count, sizeof(unsigned short), 1, file) != 1) return 0; + if (fread(&temp_count, sizeof(unsigned short), 1, file) != 1) return 0; //wenn nicht 1 Element eingelesen wurden Abbruch mit return 0 if (fread(&temp_width, sizeof(unsigned short), 1, file) != 1) return 0; if (fread(&temp_height, sizeof(unsigned short), 1, file) != 1) return 0; // Korrektur: Die Tests erwarten, dass die gelesenen Werte getauscht werden. - *count = (unsigned int)temp_count; + *count = (unsigned int)temp_count; // Zuweisung in die Ausgabepointer *width = (unsigned int)temp_height; // <-- Tauschen: Der Wert der Höhe (10) wird der Breite zugewiesen *height = (unsigned int)temp_width; // <-- Tauschen: Der Wert der Breite (8) wird der Höhe zugewiesen - return 1; + return 1; //gibt 1 bei Erfolg zurück } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; + GrayScaleImageSeries *series = NULL; //Zeiger auf Bildserie wird angelegt aber zeigt noch auf nichts - FILE *file = NULL; + FILE *file = NULL; //"sicherer Zustand" unsigned int count = 0; unsigned int width = 0; unsigned int height = 0; - file = fopen(path, "rb"); + file = fopen(path, "rb"); //wenn file nicht geöffnet werden kann, return NULL if (file == NULL) { return NULL; } - if (!readHeader(file, &count, &width, &height)) - { + if (!readHeader(file, &count, &width, &height)) //überprüfung ob header eingelesen werden kann + { // wenn nicht return NULL fclose(file); return NULL; } // Dynamic Memory Allocation - series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); + series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); //reserviert Speicher if (series == NULL) { - fclose(file); + fclose(file); //wenn kein Speicher -> NULL und Datei schließen return NULL; } - series->count = count; - series->images = NULL; + series->count = count; //Anzahl der Bilder wird gesetzt + series->images = NULL; //Pointer auf NULL series->labels = NULL; - size_t num_pixels = (size_t)width * height; + size_t num_pixels = (size_t)width * height; //berechnet die Anzahl der Pixel pro Bild (size_t weil pixelanzahl groß sein kann) - series->images = (GrayScaleImage *)malloc(count * sizeof(GrayScaleImage)); + series->images = (GrayScaleImage *)malloc(count * sizeof(GrayScaleImage)); //reserviert Speicher if (series->images == NULL) { - clearSeries(series); + clearSeries(series); //wenn kein Speicher -> Null und Datei schließen fclose(file); return NULL; } - series->labels = (unsigned char *)malloc(count * sizeof(unsigned char)); + series->labels = (unsigned char *)malloc(count * sizeof(unsigned char)); //reserviert Speicher für count Labels if (series->labels == NULL) { - clearSeries(series); + clearSeries(series); //bei fehler: alles ferigeben und abbrechen fclose(file); return NULL; } // Read images and labels - for (unsigned int i = 0; i < count; i++) + for (unsigned int i = 0; i < count; i++) //durchläuft jedes bild { - series->images[i].width = width; + series->images[i].width = width; //höhe und breite setzen series->images[i].height = height; - series->images[i].buffer = (GrayScalePixelType *)malloc(num_pixels * sizeof(GrayScalePixelType)); + series->images[i].buffer = (GrayScalePixelType *)malloc(num_pixels * sizeof(GrayScalePixelType)); //reserviert Speicher für Bild if (series->images[i].buffer == NULL) { - clearSeries(series); + clearSeries(series); //wenn kein speicher: alles freigeben fclose(file); return NULL; } - if (fread(series->images[i].buffer, sizeof(GrayScalePixelType), num_pixels, file) != num_pixels) + if (fread(series->images[i].buffer, sizeof(GrayScalePixelType), num_pixels, file) != num_pixels) //Pixel einlesen (jedes element hat sizeof(...) { - clearSeries(series); + clearSeries(series); //wenn nicht genau diese anzahl eingelesen werden konnte -> Abbruch fclose(file); return NULL; } - if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) + if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) //Label einlesen (ein einziges Byte wird eingelesen) { - clearSeries(series); + clearSeries(series); //wenn nicht genau 1 byte eingelesen wurde -> Fehler fclose(file); return NULL; } } - fclose(file); + fclose(file); //Datei wird geschlossen, weil alles im speicher ist - return series; + return series; //Bildserie wird zurückgegeben } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt -void clearSeries(GrayScaleImageSeries *series) +void clearSeries(GrayScaleImageSeries *series) //Funktion gibt ale komponenten einer bildersie aus dem Heap frei { - if (series != NULL) + if (series != NULL) //ist pointer überhaupt gültig? { - if (series->images != NULL) + if (series->images != NULL) //Prüft ob pointer zu den bildern gesetzt wurde { - for (unsigned int i = 0; i < series->count; i++) + for (unsigned int i = 0; i < series->count; i++) //Schleife über alle Bilder und einzelnd freigegeben { - if (series->images[i].buffer != NULL) + if (series->images[i].buffer != NULL) //Prüft ob bild puffer existiert { - free(series->images[i].buffer); - series->images[i].buffer = NULL; - } - } + free(series->images[i].buffer); //gibt den Pixelbuffer des i-ten Bildes frei + series->images[i].buffer = NULL; //setzt pointer auf NULL + } //bix hier wurden nur pixelbuffer weggeräumt, aber nicht das array image selbst - free(series->images); + free(series->images); //gesamte image block wird freigegeben series->images = NULL; } - if (series->labels != NULL) + if (series->labels != NULL) //prüfen ob es ein kabel array gibt { - free(series->labels); + free(series->labels); //sonst speicher für alle labels freigeben und pointer auf NULL setzen series->labels = NULL; } - free(series); + free(series); //serie wird freigegeben } } \ No newline at end of file