Weitere Verbesserungen an imageInput.c vorgenommen. Tests schlagen weiterhin fehl

This commit is contained in:
Marike Berger 2025-11-08 19:34:04 +01:00
parent 52e25f6fec
commit 6d5b19eb76

View File

@ -12,25 +12,26 @@ static FILE* openImageFile(const char* path) {
FILE* imageFile = NULL; FILE* imageFile = NULL;
imageFile = fopen(path, "rb"); imageFile = fopen(path, "rb");
if (imageFile == NULL) {
// Fehler beim Öffnen
return NULL;
}
// Prüfe, ob die Datei mit dem richtigen String beginnt // Prüfe, ob die Datei mit dem richtigen String beginnt
char *fileHeaderString = (char*)malloc(BUFFER_SIZE); 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)) { if (strncmp(fileHeaderString, FILE_HEADER_STRING, 27)) {
// Datei hat nicht das korrekte Format // Datei hat nicht das korrekte Format
// Speicherplatz freigeben // Speicherplatz freigeben
free(fileHeaderString); free(fileHeaderString);
fclose(imageFile);
return NULL; return NULL;
} }
// Speicherplatz freigeben // Speicherplatz freigeben
free(fileHeaderString); free(fileHeaderString);
if (imageFile == NULL) {
printf("Unbekannter Fehler, imageFile ist Null");
return NULL;
}
return imageFile; return imageFile;
} }
@ -64,12 +65,14 @@ static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], Gra
static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) { static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) {
// SPeicher für Buffer allokieren // 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 // 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); free(image->buffer);
return -1; return -1;
} }
@ -77,7 +80,7 @@ static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) {
return 0; return 0;
} }
static unsigned char getLabelOfImage(FILE* imageFile, GrayScaleImage* image) { static char getLabelOfImage(FILE* imageFile, GrayScaleImage* image) {
// Array um Label zu speichern // Array um Label zu speichern
unsigned char *bytestream = malloc(1); unsigned char *bytestream = malloc(1);
@ -121,6 +124,8 @@ GrayScaleImageSeries *readImages(const char *path)
if (erfolg == -1) { if (erfolg == -1) {
printf("Unbekannter Fehler bei getInformationOfImages."); printf("Unbekannter Fehler bei getInformationOfImages.");
fclose(imageFile);
return NULL;
} }
// Speicher für die Labels vorbereiten, wird später Bild für Bild befüllt // 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 // labels = unsigned char-Array mit der Größe wie AnzahlBilder
if (series->labels == NULL) { 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; return NULL;
} }
for (int i = 0; i < series->count; i++) { for (int i = 0; i < series->count; i++) {
// image initialisieren // image initialisieren
GrayScaleImage *image = NULL; GrayScaleImage *image = &series->images[i];
image = (GrayScaleImage *)malloc(sizeof(GrayScaleImage)); // image = (GrayScaleImage *)malloc(sizeof(GrayScaleImage));
image->width = dimensionsOfImages[0]; image->width = dimensionsOfImages[0];
image->height = dimensionsOfImages[1]; image->height = dimensionsOfImages[1];
image->buffer = NULL;
// Graustufe-Pixel lesen und im image speichern
if(getGrayScalePixelOfImage(imageFile, image) != 0) { 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) { if (series->images == NULL) {
printf("Fehler bei getLabelOfImage"); 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); // series.labels[i] = (unsigned char)(i % 256);
// Springe in der Datei an die Stelle nach dem i. Bild // Springe in der Datei an die Stelle nach dem i. Bild
fclose(imageFile);
return series; return series;
} }