From abe51f21d65b8bb7f9307cea3ed249ceae055d62 Mon Sep 17 00:00:00 2001 From: jw Date: Sat, 22 Nov 2025 16:09:38 +0100 Subject: [PATCH] fertiges Programm --- imageInput.c | 91 ++++++++++++++++++++++++++++++++++++++++---- neuralNetworkTests.c | 40 ++++++++++++++++++- 2 files changed, 122 insertions(+), 9 deletions(-) diff --git a/imageInput.c b/imageInput.c index bb30de1..000d1a7 100644 --- a/imageInput.c +++ b/imageInput.c @@ -1,3 +1,4 @@ + #include #include #include @@ -6,17 +7,93 @@ #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" -// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei - -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; - + if (path == NULL) return NULL; + + FILE *file = fopen(path, "rb"); + if (!file) return NULL; + + // Header prüfen + size_t tagLen = strlen(FILE_HEADER_STRING); + if (tagLen >= BUFFER_SIZE) { fclose(file); return NULL; } + + char tagBuf[BUFFER_SIZE]; + if (fread(tagBuf, 1, tagLen, file) != tagLen || memcmp(tagBuf, FILE_HEADER_STRING, tagLen) != 0) { + fclose(file); + return NULL; + } + + + + // Anzahl, Breite, Höhe lesen + unsigned short numberOfImages = 0, width = 0, height = 0; + if (fread(&numberOfImages, sizeof(numberOfImages), 1, file) != 1 || + fread(&width, sizeof(width), 1, file) != 1 || + fread(&height, sizeof(height), 1, file) != 1) { + fclose(file); + return NULL; + } + + if (numberOfImages == 0 || width == 0 || height == 0) { + fclose(file); + return NULL; + } + + // Serie allokieren + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + if (!series) { fclose(file); return NULL; } + + series->count = numberOfImages; + series->images = calloc(series->count, sizeof(GrayScaleImage)); + series->labels = calloc(series->count, sizeof(unsigned char)); + if (!series->images || !series->labels) { + free(series->images); + free(series->labels); + free(series); + fclose(file); + return NULL; + } + + size_t pixelsPerImage = (size_t)width * height; + for (unsigned int i = 0; i < series->count; i++) { + series->images[i].width = width; + series->images[i].height = height; + series->images[i].buffer = malloc(pixelsPerImage * sizeof(GrayScalePixelType)); + if (!series->images[i].buffer) { + for (unsigned int j = 0; j < i; j++) free(series->images[j].buffer); + free(series->images); + free(series->labels); + free(series); + fclose(file); + return NULL; + } + + if (fread(series->images[i].buffer, sizeof(GrayScalePixelType), pixelsPerImage, file) != pixelsPerImage || + fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) { + for (unsigned int j = 0; j <= i; j++) free(series->images[j].buffer); + free(series->images); + free(series->labels); + free(series); + fclose(file); + return NULL; + } + } + + fclose(file); return series; } -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { -} \ No newline at end of file + if (!series) return; + if (series->images) { + for (unsigned int i = 0; i < series->count; i++) { + free(series->images[i].buffer); + } + free(series->images); + } + free(series->labels); + free(series); +} + diff --git a/neuralNetworkTests.c b/neuralNetworkTests.c index 21ab370..46d175c 100644 --- a/neuralNetworkTests.c +++ b/neuralNetworkTests.c @@ -7,8 +7,44 @@ static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn) -{ - // TODO +{ + + + FILE *file = fopen(path, "wb"); + if (!file) return; + + const char *header = "__info2_neural_network_file_format__"; + fwrite(header, sizeof(char), strlen(header), file); + + if (nn.numberOfLayers > 0) { + // Erste Schicht: inputDim und outputDim + unsigned int inputDim = nn.layers[0].weights.cols; + unsigned int outputDim = nn.layers[0].weights.rows; + fwrite(&inputDim, sizeof(unsigned int), 1, file); + fwrite(&outputDim, sizeof(unsigned int), 1, file); + + // Erste Schicht schreiben + fwrite(nn.layers[0].weights.buffer, sizeof(MatrixType), inputDim * outputDim, file); + fwrite(nn.layers[0].biases.buffer, sizeof(MatrixType), outputDim, file); + + // Weitere Schichten: nur outputDim + Matrizen + for (unsigned int i = 1; i < nn.numberOfLayers; i++) { + outputDim = nn.layers[i].weights.rows; + fwrite(&outputDim, sizeof(unsigned int), 1, file); + fwrite(nn.layers[i].weights.buffer, sizeof(MatrixType), + nn.layers[i].weights.rows * nn.layers[i].weights.cols, file); + fwrite(nn.layers[i].biases.buffer, sizeof(MatrixType), + nn.layers[i].biases.rows, file); + } + } + + // Endmarker + unsigned int zero = 0; + fwrite(&zero, sizeof(unsigned int), 1, file); + + fclose(file); + + } void test_loadModelReturnsCorrectNumberOfLayers(void)