From 52e25f6feceb936e3c636f6bc05383177d7a2572 Mon Sep 17 00:00:00 2001 From: Marike Berger Date: Sat, 8 Nov 2025 18:33:54 +0100 Subject: [PATCH 1/6] =?UTF-8?q?imageInput.c:=20Verbesserungen=20an=20getIn?= =?UTF-8?q?formationOfImages=20vorgenommen=20getGrayScalePixelOfImage=20un?= =?UTF-8?q?d=20getLabelOfImage=20Tests=20laufen=20auf=20Fehler,=20m=C3=BCs?= =?UTF-8?q?sen=20noch=20behoben=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- info2praktikum-neuronalesnetz/imageInput.c | 84 ++++++++++++++++++++-- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/info2praktikum-neuronalesnetz/imageInput.c b/info2praktikum-neuronalesnetz/imageInput.c index 8e5a2de..9a4e115 100644 --- a/info2praktikum-neuronalesnetz/imageInput.c +++ b/info2praktikum-neuronalesnetz/imageInput.c @@ -26,17 +26,25 @@ static FILE* openImageFile(const char* path) { // Speicherplatz freigeben free(fileHeaderString); + if (imageFile == NULL) { + printf("Unbekannter Fehler, imageFile ist Null"); + return NULL; + } + return imageFile; } static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], GrayScaleImageSeries *series) { - // Speicher für die drei Zahlen + Nullterminator (je Zahl 2 Byte) - char bytestream[7]; - bytestream[6] = '\0'; + // Speicher für die drei Zahlen (je Zahl 2 Byte) + unsigned char bytestream[6]; // Daten einlesen int itemsRead = fread(bytestream, 2, 3, imageFile); + //for (size_t i = 0; i < (itemsRead * 2); i++) { + // printf("%02X ", bytestream[i]); + //} + if (itemsRead != 3) { // Nicht genügend Daten gelesen return -1; @@ -54,6 +62,40 @@ static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], Gra return 0; } +static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) { + // SPeicher für Buffer allokieren + image->buffer = malloc(image->width * image->height * sizeof(GrayScalePixelType)); + + // Pixelwerte aus Datei auslesen + int itemsRead = fread(image->buffer, 1, image->width * image->height * sizeof(GrayScalePixelType), imageFile); + + if (itemsRead != image->width * image->height) { + free(image->buffer); + return -1; + } + + return 0; +} + +static unsigned char getLabelOfImage(FILE* imageFile, GrayScaleImage* image) { + // Array um Label zu speichern + unsigned char *bytestream = malloc(1); + + // Label aus Datei auslesen + int itemsRead = fread(bytestream, 1, 1, imageFile); + + if (itemsRead != 1) { + free(bytestream); + return -1; + } + + unsigned char label = bytestream[0]; + + free(bytestream); + + return label; +} + // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { @@ -62,7 +104,7 @@ GrayScaleImageSeries *readImages(const char *path) FILE* imageFile = openImageFile(path); if (imageFile == NULL) { - printf("Unbekannter Fehler"); + printf("Unbekannter Fehler, imageFile ist Null"); return NULL; } @@ -75,20 +117,48 @@ GrayScaleImageSeries *readImages(const char *path) // 2) Breite der Bilder --> width // 3) Höhe der Bilder --> height int dimensionsOfImages[2]; - getInformationOfImages(imageFile, dimensionsOfImages, series); + int erfolg = getInformationOfImages(imageFile, dimensionsOfImages, series); + if (erfolg == -1) { + printf("Unbekannter Fehler bei getInformationOfImages."); + } + + // Speicher für die Labels vorbereiten, wird später Bild für Bild befüllt + series->labels = malloc(series->count * sizeof(unsigned char)); // labels = unsigned char-Array mit der Größe wie AnzahlBilder - // Springe in der Datei an die Stelle nach den drei Zahlen + if (series->labels == NULL) { + printf("Fehler bei malloc"); + return NULL; + } + + for (int i = 0; i < series->count; i++) { + // image initialisieren + GrayScaleImage *image = NULL; + image = (GrayScaleImage *)malloc(sizeof(GrayScaleImage)); + + image->width = dimensionsOfImages[0]; + image->height = dimensionsOfImages[1]; + + if(getGrayScalePixelOfImage(imageFile, image) != 0) { + printf("Fehler bei getGrayScalePixelOfImage"); + } + + series->labels[i] = getLabelOfImage(imageFile, image); + + if (series->labels[i] == -1) { + printf("Fehler bei getLabelOfImage"); + } + } // für jedes Bild gemäß GreyScaleImageSeries.count: // GreyScaleImage.width = width // GreyScaleImage.height = height // GreyScaleImageSeries.buffer = Pixelwerte // labels = Label des Bilds + // series.labels[i] = (unsigned char)(i % 256); // Springe in der Datei an die Stelle nach dem i. Bild - // GrayScaleImageSeries.labels = labels (mit strcpy) return series; } From 6d5b19eb76443ef441078ea36a836cf8dd451ada Mon Sep 17 00:00:00 2001 From: Marike Berger Date: Sat, 8 Nov 2025 19:34:04 +0100 Subject: [PATCH 2/6] Weitere Verbesserungen an imageInput.c vorgenommen. Tests schlagen weiterhin fehl --- info2praktikum-neuronalesnetz/imageInput.c | 68 ++++++++++++++++------ 1 file changed, 51 insertions(+), 17 deletions(-) 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; } From d354b45396376a81ee1285a5bd58e087d06a39c2 Mon Sep 17 00:00:00 2001 From: Laila Date: Sun, 9 Nov 2025 22:54:09 +0100 Subject: [PATCH 3/6] getMatrixAt und multiply --- info2praktikum-neuronalesnetz/matrix.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/info2praktikum-neuronalesnetz/matrix.c b/info2praktikum-neuronalesnetz/matrix.c index 75c311b..af5a474 100644 --- a/info2praktikum-neuronalesnetz/matrix.c +++ b/info2praktikum-neuronalesnetz/matrix.c @@ -34,7 +34,12 @@ void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - + if(rowIdx > matrix.rows || colIdx > matrix.cols){ + return 0; + } + MatrixType value; + value = matrix.data[rowIdx * matrix.cols + colIdx]; + return value; } Matrix add(const Matrix matrix1, const Matrix matrix2) @@ -44,7 +49,24 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) Matrix multiply(const Matrix matrix1, const Matrix matrix2) { - + if (matrix1.cols != matrix2.rows){ + Matrix errorMatrix = createMatrix(0, 0); + errorMatrix.data = NULL; + return errorMatrix; + } + Matrix matrix3 = createMatrix(matrix1.rows, matrix2.cols); + + for( size_t i = 0; i < matrix1.rows; i++){ + for(size_t j = 0; j < matrix2.cols; j++){ + MatrixType sum = 0; + for(size_t k = 0; k < matrix1.cols; k++){ + sum += getMatrixAt(matrix1, i, k) * getMatrixAt(matrix2, k, j); + } + setMatrixAt(sum, matrix3, i, j); + } + } + + return matrix3; } From 147fd28bda6d425efdeecb6e92abfb124425856c Mon Sep 17 00:00:00 2001 From: Laila Date: Sun, 9 Nov 2025 23:27:21 +0100 Subject: [PATCH 4/6] setMatrixAt --- info2praktikum-neuronalesnetz/matrix.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/info2praktikum-neuronalesnetz/matrix.c b/info2praktikum-neuronalesnetz/matrix.c index af5a474..16688c5 100644 --- a/info2praktikum-neuronalesnetz/matrix.c +++ b/info2praktikum-neuronalesnetz/matrix.c @@ -27,14 +27,17 @@ void clearMatrix(Matrix *matrix) } -void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) +void setMatrixAt(MatrixType value, Matrix* matrix, unsigned int rowIdx, unsigned int colIdx) { - + if(rowIdx >= matrix->rows || colIdx >= matrix->cols){ + return; + } + matrix->data[rowIdx * matrix->cols + colIdx] = value; } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - if(rowIdx > matrix.rows || colIdx > matrix.cols){ + if(rowIdx >= matrix.rows || colIdx >= matrix.cols){ return 0; } MatrixType value; @@ -62,7 +65,7 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) for(size_t k = 0; k < matrix1.cols; k++){ sum += getMatrixAt(matrix1, i, k) * getMatrixAt(matrix2, k, j); } - setMatrixAt(sum, matrix3, i, j); + setMatrixAt(sum, &matrix3, i, j); } } From bb87d30e056ca91ea81f993e7630cf154ba1d46b Mon Sep 17 00:00:00 2001 From: Laila Date: Mon, 10 Nov 2025 13:43:55 +0100 Subject: [PATCH 5/6] =?UTF-8?q?matrix.data=20zu=20matrix.buffer=20umgenann?= =?UTF-8?q?t,=20da=20Tests=20diese=20Bezeichnung=20erwarten.=20Test=20f?= =?UTF-8?q?=C3=BCr=20get,=20set=20und=20multiply=20laufen=20PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- info2praktikum-neuronalesnetz/matrix.c | 22 +++++++++++----------- info2praktikum-neuronalesnetz/matrix.h | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/info2praktikum-neuronalesnetz/matrix.c b/info2praktikum-neuronalesnetz/matrix.c index 16688c5..6e38675 100644 --- a/info2praktikum-neuronalesnetz/matrix.c +++ b/info2praktikum-neuronalesnetz/matrix.c @@ -10,8 +10,8 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) Matrix matrix; matrix.rows = rows; matrix.cols = cols; - matrix.data = (float *)malloc(rows * cols * sizeof(MatrixType)); - if (matrix.data != NULL) { + matrix.buffer = (float *)malloc(rows * cols * sizeof(MatrixType)); + if (matrix.buffer != NULL) { } return matrix; @@ -19,20 +19,20 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) void clearMatrix(Matrix *matrix) { - if (matrix->data != NULL) { - free(matrix->data); - matrix->data = NULL; + if (matrix->buffer != NULL) { + free(matrix->buffer); + matrix->buffer = NULL; } } -void setMatrixAt(MatrixType value, Matrix* matrix, unsigned int rowIdx, unsigned int colIdx) +void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - if(rowIdx >= matrix->rows || colIdx >= matrix->cols){ + if(rowIdx >= matrix.rows || colIdx >= matrix.cols){ return; } - matrix->data[rowIdx * matrix->cols + colIdx] = value; + matrix.buffer[rowIdx * matrix.cols + colIdx] = value; } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) @@ -41,7 +41,7 @@ MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int co return 0; } MatrixType value; - value = matrix.data[rowIdx * matrix.cols + colIdx]; + value = matrix.buffer[rowIdx * matrix.cols + colIdx]; return value; } @@ -54,7 +54,7 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) { if (matrix1.cols != matrix2.rows){ Matrix errorMatrix = createMatrix(0, 0); - errorMatrix.data = NULL; + errorMatrix.buffer = NULL; return errorMatrix; } Matrix matrix3 = createMatrix(matrix1.rows, matrix2.cols); @@ -65,7 +65,7 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) for(size_t k = 0; k < matrix1.cols; k++){ sum += getMatrixAt(matrix1, i, k) * getMatrixAt(matrix2, k, j); } - setMatrixAt(sum, &matrix3, i, j); + setMatrixAt(sum, matrix3, i, j); } } diff --git a/info2praktikum-neuronalesnetz/matrix.h b/info2praktikum-neuronalesnetz/matrix.h index 0598348..8c75533 100644 --- a/info2praktikum-neuronalesnetz/matrix.h +++ b/info2praktikum-neuronalesnetz/matrix.h @@ -6,7 +6,7 @@ typedef struct{ size_t rows; size_t cols; - float* data; + float* buffer; } Matrix; From 9623be321f3bbef7e3ba83c156f67401a12414f7 Mon Sep 17 00:00:00 2001 From: wehnerla99053 Date: Mon, 10 Nov 2025 14:06:21 +0100 Subject: [PATCH 6/6] addMatrix und clearMatrix --- .idea/editor.xml | 240 +++++++++++++++++++++++++ info2praktikum-neuronalesnetz/matrix.c | 46 +++-- 2 files changed, 271 insertions(+), 15 deletions(-) diff --git a/.idea/editor.xml b/.idea/editor.xml index dc36d98..193436d 100644 --- a/.idea/editor.xml +++ b/.idea/editor.xml @@ -341,5 +341,245 @@