From 96b3d72848b0326d690d72d6095dcfd17eb6a894 Mon Sep 17 00:00:00 2001 From: Pia Keil Date: Fri, 21 Nov 2025 04:54:54 +0100 Subject: [PATCH 1/4] Implement header check helper function --- imageInput.c | 72 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/imageInput.c b/imageInput.c index bb30de1..8875ad4 100644 --- a/imageInput.c +++ b/imageInput.c @@ -1,4 +1,4 @@ -#include +##include #include #include #include "imageInput.h" @@ -6,17 +6,67 @@ #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; - - return series; +/* + * Hilfsfunktionen + */ + + +static FILE *openImageFile(const char *path) // Checks if the given filename pointer is valid (not NULL). +{ +if (path == NULL) + { + return NULL; + } + + return fopen(path, "rb"); //opening document in binear } -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt -void clearSeries(GrayScaleImageSeries *series) +static int readAndCheckHeader(FILE *file) // gets the length of the header text { -} \ No newline at end of file + size_t headerLength = strlen(FILE_HEADER_STRING); + char buffer[BUFFER_SIZE]; + + if (headerLength + 1 > BUFFER_SIZE) //checks if buffer is big enough for header size + { + return 0; + } + + if (fread(buffer, 1, headerLength, file) != headerLength) // Checks if reading the expected number of header bytes from the file succeeded + + return 0; + + + buffer[headerLength] = '\0'; // add string terminator so the header becomes a valid C-string + + if (strcmp(buffer, FILE_HEADER_STRING) != 0) // checks if the expected header matches the header read from the file + + { + return 0; + } + + return 1; /* Header ok */ +} + + + + +static int readImageMetaData(FILE *file, // reads the metadata (count, width, height) from the file and stores them in the provided pointers + unsigned short *count, + unsigned short *width, + unsigned short *height) +{ + + + + + + + /* + Hauptfunktion + */ + + + + + \ No newline at end of file From 0f1802559e4327e8f3fb543899ccece64c423cb5 Mon Sep 17 00:00:00 2001 From: Pia Keil Date: Sun, 23 Nov 2025 09:14:58 +0100 Subject: [PATCH 2/4] imageInput: Zwischenstand --- imageInput.c | 93 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/imageInput.c b/imageInput.c index 8875ad4..6705850 100644 --- a/imageInput.c +++ b/imageInput.c @@ -1,4 +1,4 @@ -##include +#include #include #include #include "imageInput.h" @@ -6,20 +6,22 @@ #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" - /* - * Hilfsfunktionen + * Diese Hilfsfunktionen kümmern sich um: + * - Das Öffnen der Datei und Überprüfen des Dateinamens + * - Das Überprüfen des Headers, um sicherzustellen, dass es sich um die richtige Datei handelt + * - Das Einlesen der Metadaten (Anzahl der Bilder, Bildbreite und -höhe) + * -> Die Hilfsfunktionen garantieren, dass die Datei gültig ist, bevor mit dem Einlesen der Bilddaten fortgefahren wird. */ - - + static FILE *openImageFile(const char *path) // Checks if the given filename pointer is valid (not NULL). { -if (path == NULL) + if (path == NULL) { return NULL; } - return fopen(path, "rb"); //opening document in binear + return fopen(path, "rb"); // opening document in binary mode } static int readAndCheckHeader(FILE *file) // gets the length of the header text @@ -27,20 +29,19 @@ static int readAndCheckHeader(FILE *file) // gets the length of the header text size_t headerLength = strlen(FILE_HEADER_STRING); char buffer[BUFFER_SIZE]; - if (headerLength + 1 > BUFFER_SIZE) //checks if buffer is big enough for header size + if (headerLength + 1 > BUFFER_SIZE) // checks if buffer is big enough for header size { return 0; } if (fread(buffer, 1, headerLength, file) != headerLength) // Checks if reading the expected number of header bytes from the file succeeded - + { return 0; - + } buffer[headerLength] = '\0'; // add string terminator so the header becomes a valid C-string if (strcmp(buffer, FILE_HEADER_STRING) != 0) // checks if the expected header matches the header read from the file - { return 0; } @@ -48,25 +49,81 @@ static int readAndCheckHeader(FILE *file) // gets the length of the header text return 1; /* Header ok */ } - - - static int readImageMetaData(FILE *file, // reads the metadata (count, width, height) from the file and stores them in the provided pointers unsigned short *count, unsigned short *width, unsigned short *height) { + if (fread(count, sizeof(unsigned short), 1, file) != 1) // read the number of images from the file + { + return 0; + } + if (fread(width, sizeof(unsigned short), 1, file) != 1) // reads the image width + { + return 0; + } + if (fread(height, sizeof(unsigned short), 1, file) != 1) // reads the image height + { + return 0; + } + if (*count == 0 || *width == 0 || *height == 0) // check for invalid metadata (count, width or height cannot be zero) + { + return 0; + } + return 1; +} +GrayScaleImageSeries *readImages(const char *path) +{ + // 1. Open the file + FILE *file = openImageFile(path); + if (file == NULL) { + return NULL; + } + // 2. Check the header + if (!readAndCheckHeader(file)) { + return NULL; + } + // 3. Read image metadata + unsigned short count, width, height; + if (!readImageMetaData(file, &count, &width, &height)) { + return NULL; + } - /* - Hauptfunktion - */ + // 4. Allocate memory for image series + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); // Allocate memory for the image series, images, and labels. Return NULL if allocation fails. + if (series == NULL) { + return NULL; + } + series->count = count; + series->images = calloc(count, sizeof(GrayScaleImage)); + series->labels = malloc(count * sizeof(unsigned char)); + if (series->images == NULL || series->labels == NULL) { + free(series); + return NULL; + } + // 5. Read the images and labels + for (unsigned int i = 0; i < count; i++) + { + GrayScaleImage *image = &series->images[i]; + unsigned char *label = &series->labels[i]; + if (fread(image->buffer, sizeof(GrayScalePixelType), width * height, file) != width * height) // Check if the correct number of pixel values (width * height) were read for the image + { + return 0; + } - \ No newline at end of file + if (fread(label, sizeof(unsigned char), 1, file) != 1) // Check if the label for the image was successfully read (1 byte) + { + return 0; + } + } + + return series; +} From eca1c1e4cbc76bd0859bafb239eb0d097e50ecba Mon Sep 17 00:00:00 2001 From: Pia Keil Date: Sun, 23 Nov 2025 16:42:32 +0100 Subject: [PATCH 3/4] =?UTF-8?q?Finish=20imageInput=20implementation=20(hea?= =?UTF-8?q?der=20check,=20metadata,=20image=20buffers)=20=E2=80=94=20all?= =?UTF-8?q?=20tests=20passing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imageInput.c | 129 +++++++++++++++--- runImageInputTests | Bin 0 -> 60416 bytes runImageInputTests.dSYM/Contents/Info.plist | 20 +++ .../Resources/DWARF/runImageInputTests | Bin 0 -> 35504 bytes .../aarch64/runImageInputTests.yml | 5 + 5 files changed, 132 insertions(+), 22 deletions(-) create mode 100755 runImageInputTests create mode 100644 runImageInputTests.dSYM/Contents/Info.plist create mode 100644 runImageInputTests.dSYM/Contents/Resources/DWARF/runImageInputTests create mode 100644 runImageInputTests.dSYM/Contents/Resources/Relocations/aarch64/runImageInputTests.yml diff --git a/imageInput.c b/imageInput.c index 6705850..f987e39 100644 --- a/imageInput.c +++ b/imageInput.c @@ -6,6 +6,7 @@ #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" + /* * Diese Hilfsfunktionen kümmern sich um: * - Das Öffnen der Datei und Überprüfen des Dateinamens @@ -13,7 +14,8 @@ * - Das Einlesen der Metadaten (Anzahl der Bilder, Bildbreite und -höhe) * -> Die Hilfsfunktionen garantieren, dass die Datei gültig ist, bevor mit dem Einlesen der Bilddaten fortgefahren wird. */ - + + static FILE *openImageFile(const char *path) // Checks if the given filename pointer is valid (not NULL). { if (path == NULL) @@ -21,7 +23,7 @@ static FILE *openImageFile(const char *path) // Checks if the given filename poi return NULL; } - return fopen(path, "rb"); // opening document in binary mode + return fopen(path, "rb"); //opening document in binear } static int readAndCheckHeader(FILE *file) // gets the length of the header text @@ -29,7 +31,7 @@ static int readAndCheckHeader(FILE *file) // gets the length of the header text size_t headerLength = strlen(FILE_HEADER_STRING); char buffer[BUFFER_SIZE]; - if (headerLength + 1 > BUFFER_SIZE) // checks if buffer is big enough for header size + if (headerLength + 1 > BUFFER_SIZE) //checks if buffer is big enough for header size { return 0; } @@ -49,6 +51,7 @@ static int readAndCheckHeader(FILE *file) // gets the length of the header text return 1; /* Header ok */ } + static int readImageMetaData(FILE *file, // reads the metadata (count, width, height) from the file and stores them in the provided pointers unsigned short *count, unsigned short *width, @@ -62,12 +65,12 @@ static int readImageMetaData(FILE *file, // reads the metadata (count, width, he { return 0; } - if (fread(height, sizeof(unsigned short), 1, file) != 1) // reads the image height + if (fread(height, sizeof(unsigned short), 1, file) != 1) //reads the image height { return 0; } - if (*count == 0 || *width == 0 || *height == 0) // check for invalid metadata (count, width or height cannot be zero) + if (*count == 0 || *width == 0 || *height == 0) // check for invalid metadata (count, width or height cannot be zero) { return 0; } @@ -75,36 +78,55 @@ static int readImageMetaData(FILE *file, // reads the metadata (count, width, he return 1; } + +/* + Hauptfunktion +*/ GrayScaleImageSeries *readImages(const char *path) { // 1. Open the file FILE *file = openImageFile(path); - if (file == NULL) { + if (file == NULL) + { return NULL; } // 2. Check the header - if (!readAndCheckHeader(file)) { + if (!readAndCheckHeader(file)) + { + fclose(file); return NULL; } // 3. Read image metadata - unsigned short count, width, height; - if (!readImageMetaData(file, &count, &width, &height)) { + unsigned short count = 0; + unsigned short width = 0; + unsigned short height = 0; + + if (!readImageMetaData(file, &count, &width, &height)) + { + fclose(file); return NULL; } // 4. Allocate memory for image series - GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); // Allocate memory for the image series, images, and labels. Return NULL if allocation fails. - - if (series == NULL) { + GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); // Allocate memory for the image series, images, and labels. Return NULL if allocation fails. + if (series == NULL) + { + fclose(file); return NULL; } - series->count = count; - series->images = calloc(count, sizeof(GrayScaleImage)); - series->labels = malloc(count * sizeof(unsigned char)); - if (series->images == NULL || series->labels == NULL) { + + series->count = count; + series->images = (GrayScaleImage *)calloc(count, sizeof(GrayScaleImage)); + series->labels = (unsigned char *)malloc(count * sizeof(unsigned char)); + + if (series->images == NULL || series->labels == NULL) + { + free(series->images); + free(series->labels); free(series); + fclose(file); return NULL; } @@ -112,18 +134,81 @@ GrayScaleImageSeries *readImages(const char *path) for (unsigned int i = 0; i < count; i++) { GrayScaleImage *image = &series->images[i]; - unsigned char *label = &series->labels[i]; - if (fread(image->buffer, sizeof(GrayScalePixelType), width * height, file) != width * height) // Check if the correct number of pixel values (width * height) were read for the image + image->width = (unsigned int)width; + image->height = (unsigned int)height; + + size_t numPixels = (size_t)width * (size_t)height; + + image->buffer = (GrayScalePixelType *)malloc(numPixels * sizeof(GrayScalePixelType)); + if (image->buffer == NULL) { - return 0; + 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(label, sizeof(unsigned char), 1, file) != 1) // Check if the label for the image was successfully read (1 byte) + if (fread(image->buffer, sizeof(GrayScalePixelType), numPixels, file) != numPixels) // Check if the correct number of pixel values (width * height) were read for the image { - return 0; + 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->labels[i], sizeof(unsigned char), 1, file) != 1) // Check if the label for the image was successfully read (1 byte) + { + 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) +{ + if (series == NULL) + { + return; + } + + if (series->images != NULL) + { + for (unsigned int i = 0; i < series->count; i++) + { + free(series->images[i].buffer); + series->images[i].buffer = NULL; + } + free(series->images); + series->images = NULL; + } + + if (series->labels != NULL) + { + free(series->labels); + series->labels = NULL; + } + + free(series); +} diff --git a/runImageInputTests b/runImageInputTests new file mode 100755 index 0000000000000000000000000000000000000000..11637df829fbdc31bc42bca003ab1dbe14205d65 GIT binary patch literal 60416 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 literal 0 HcmV?d00001 diff --git a/runImageInputTests.dSYM/Contents/Info.plist b/runImageInputTests.dSYM/Contents/Info.plist new file mode 100644 index 0000000..cfe5e59 --- /dev/null +++ b/runImageInputTests.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.runImageInputTests + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/runImageInputTests.dSYM/Contents/Resources/DWARF/runImageInputTests b/runImageInputTests.dSYM/Contents/Resources/DWARF/runImageInputTests new file mode 100644 index 0000000000000000000000000000000000000000..fc02664d0eed8fc8e09bbcbd4cc6371a1824e2aa GIT binary patch literal 35504 zcmeHwX<$@E*7mJ?yE@%jNQVIFuqK2+KnMX55D^J$(piN7LD42l2O`->ClC|`!y>ML zD=I33jQfI$gC?N3jLV3M&Wt(^j*c?QjE*AUKI-?JTDos1L4DtMzJH=m-#S&NPMtcn zom<^idG*_W{}5{!%)q~BzzuAPB1-=2gNGL=ntyoEr6uDY-hE){OI=PfY${Uy^& zOCl3R{?(Cjn&Jp(P@Lc26liJEsh#B=1~bXaIy1~ebqoD-7^_2J1pNMBQ*(JR6xC5b z?>s4QUx>pn?DAYn9@;|u^ZP4;O^wxci$Zi{ecw{@4xYehcG)BX^6Kk?;R<)uZ`XXO z-?_GowxH4?{P6pm>y}s7Rr;&zs_KRONd0;&kn%Q!vqaR_7A=C*u7?4?e_D1)wts3- z;cVHutEC)cG7`J^XCaP2x}wV=|DyVEEl(`Zt{3Ik|C|Vr9R07e-6Hkduv+SuqBG!W zmuHI>!N_{rQuqDxdQvXGzdRW3ZMvSF<+*H8cD*`w8>(k*ZGD|)m+hb_!*K1B`gv>_ ze@Y(JGY9bd^K%RHrccY2t%(>WCmU^K^*quINg`F*L6TzL@S-5-GcSAA3>Aw96cMU4 zsHhbA+R8{cO5S2+^sT>8o*JH=)hawLDC6f~8}9ca=zak0nS6yDCp4Nygjc`Rl8y zf*s}6R7rU|9g@EWb@-`&S|0TmOzn*w<@H@6KJ>Yi{ zou=r8iXNxvY29VIPth&NNc?9hI%lAymnwP-1X21Giax059g6;BgiL>2(Oa>>K>Yg^ zJvmp>M-;s;Ptr+X>IR>#1_cxU$%<}JbdjQ)6b-jc@V6-XLPf7p^ks^^RMFQf`c_46 zSM*LrKceWpivGQ#Usp8kRgiw}v!#CjRCJ=Ezf^QzMLW?T#Gk3?L`9EQbc&)UDf%=; z&r)=bqUR}ko}!m3dXb{nD7snEmnnL^qPHu0tD^5w^rMP?RM9Uh`bkB$4iQOmdR|PsAFLnBTw3cYtaK}KIevzWT9xCZA zirzFx(vK**0sBwLX1t{6Z8IhPfudLDOWJ_0B>#x&e|;3)lrGc9DY|lkq>B}O00V{O z*C_h%SV^x_^v>~;-l6Ey!IFMO(S6U5^v8;JOp$an_N7Rlj0{PiqUcSNB|TfwJ2EBR zpy-Nk6V=ucH5;=!1%WQ_)-TzEAc4hoTqE zlJs$%U(FW=<{hff;@&bnLD4x$k{+Syo|2xZ=*O_ZK=ShyU5rgiqR&BhiKS*h#J2yDSEo1KTvd(qQ6x1Kj+KxT-bP^{4XfFzoPdjdbpyW zQuIVc>;1PJMekPWbBShhlZ5Jbo}dk5c%m$CxuSQ(O8P=Y*ThNsQbli7>6;Y2P0=?g z+NJ0x6rF=HM&%t=vZS-0GOf0{&L6BOs|l%U%U4_05}5`?biqm)#LO$xVnNJo3Mb^- z!bOeKm!c-&#KQWf4l%{`uzpPdJCCxSR9H=*Hc)31lUr96PAv>9iloa5!->-Z5!sfN z)l^rC8kaPdRojxFhdonGs57AWf0`| zqQ-o5V<91;0x(bnhZ+=Js0B_L8#z75;#G>UK^IC;O@CoAVWV_aj+8B`VYjz^zMEQK zS5ebk8K6F|syZ!DRfZW;%$?18GMZkeXF?hWic?4~sV~MZt!!pF6ckYa6Jk!)RteD-jf)x~NK&e?n%OD~sxA4Qr_mHesSFE<^FZ z{)@DL5AQqNa2dN0%^3TxTO2*evjY$q0RPr7&II6)8hA-FZU){3EH=Q5;r*Ry#Qe91 z_fMYv+*vQpPndl6pl^qMcM9dcyT@(I{`QA2?`m1dfN_=AcAGARYugnKLGj8&+u>_eQ(^!Mh_Wrj5It`3UrMuH`e^c`1T( zeSD#hpX=i@eSC5&@7D?e#L@#S<5AowAD`03462t|;v1U&ot zc#4n5`MB4)2i!iM{X|!^@8#Pfh>ev(2 z^r5zBP%|Tu_sfB{ZLm#2ms%&F2gFj_`>468qN;88a!T^HhuaqE5VKYo(gX1@XebXE zHa6TfqMwK^EpwFe7uj3^;vIUbQGH1!F)W?xlXj{03RRJ z#?#QIq)S{oPs-=LNS6fCC2mb8Isv+jUc*OGH)yqJQ<9CcU z-Xq#INmMz}DTf}UqJsID07U=vfb<^YX`oK>ap;1n0M?A79)%<~MnAfbwG5+@#gH)# zYcmWPO%?W#HHdc)c=z(|Yj`SR($UFPO?uHBqpJ}?P#s3mOwnrHf(pbrt$$Dj*6{uX zq5(M?R#u{W8&5}zi?T$Euj4(|z<6RRf~M5t`-gix^jj3E-ax7b*oo0yfHqviPX&2~ zn75!l8gdVECAM)7%HivTWiWUXg?)s%judk@rU06C&{t?)#>hs#cI4|%`CyFLb;8UE zA`K?teZZD1rb-&D13>i?ZM>G+G@*dI(bxq%X^*fyO%~8^h*d{{HqpDFfMLbb{Ak6v z4vD_vb{2?cNn9gHReiUN?&-&8zIa?hLRK@xj<|S)+d=5rQ*RfWob=ifj z#G_a~y{IjMmdsx28~mR8l-WTk+V#dtyCk=e-Jq(4iRrK3>qq z^PyCm^~6e_^|aMWPu?9NTGjJZzrr#DAp=_Zprd>+N<3<{K|#0m9Ju1qe|sL|?%mvT zCU?UN0cUa>c@aZ|p_ALJhau8!y#nT8U>**aA_GQ;R!6BZ;!%uy_nCUapfN?GLrxQG zXsSM+tZqg7(7WMhtQC)bYhWOlkfsL|TEKhk<#Bn!ESNB1nUOSeT34g!IO|gsor%2T zQ1oyywI>{<>8v-h#_cW=jREUX(Q&Ru?k;p%mm(u`THjc0P8wf^(;DB#<1q(dwy<8g z0G4-JyBw{e7m`2HX8i$?=}zl0M4kf8uy|nN!C-jq0`xhjwby~6^~?oFc|Xj@jy5qZ z(KJfF&RUG+$FXd9qOJbu?6l6e^Hec!!DH%0fi?tK4AyIF55qhTf6nQ19cl%4G48c^?@g#I14%OOGXOZ0_`Kb66=vwm~>*SR}J!FKD!X(C>j$Gt&|v013)_0AsikyDe6V$i7sO~ z-^wPF2soc+zA!R6RL)jdHx(x|el)x$8cswaFzNC9K3R ztg!hnZp`vd_%BD6!`pXh|K+6>Hva`Ik2 z2_bh1T)UiDFFr;I;8CvFt0=+F@{n}ntkz8!Q}sY3!Xd{hWShN)sM(9l zK-cRxH2FwRMc9AiF>q-i4BkhYa5M5+X%j65gRYBc@&ReZJhhc3-33SaB8)##2Xu#v zXspuU4b_JyOUEpT3g+|pLn)Gh_wwXf>#Ux^o++^Y}2q8({dEG?R(3xq)A5V z;^-djSomm;5EB6Seh)s;JDzB!`zXHXRNM9Y~JUfqM(Zu%ViVrVUZ^Hf#jZvjC6S)~340u4XcLgqp8I%}mLt)V$xWCiwoS)!Z4OCd3~gHAl<2$Z0)dS7?;e zdN~U7*y}=j(nD#Fosr~x@{_Q2Uw_-rveoG2r3kU?t2! z%7n<2c;^==3!7~rXMJSki_$5sM(P^I$-X`2= z+6bfx6WQO@9@0QY#-yTN~~C)Pk;3+|J|l-b3&8|BLL_ z1~gZq)A|qEOMVHn*7nxW8We90tD)lm^sV9Kb~yi#NzM8H_YGo=e1rIr-XO$20A4(_ zA73CkdQWUe;(Y_7xf@hMcf+eWK2z~3-Adcp*aS@VS$}DyjjTIGbF9Utj<6@X9ac|# z!nQ-vGzr-D$>&+t3R+3wiegs6D;M_Rc`_P__UJHy9dlYQHDa;DDupQ9OoAbsr*>ev zT1BmW%Y}D)I_5y^E&X^t=Fv4ATbgoz2H!Z)ehTNuW%_YSzp8UOi@^^Ot%qDfR>+gU zo^Th&z~qdL!-1`Q@KN&a2V-Ngji1uWC;Ip)w8>~aB&_l(Ht1-3`X{Y2C07W0rXw;Nc38KB0K`} zvF{p}57!6%l7_Jx{SrH&w12HSZX7!08%t@Q&bl9>h)KPcp<$sVWDILZQ0}5;$!-em zXtPPYyFnCoQXUZX?18Q&TwnTTBf5>3i??iA(aOP2Pg+~3Qrrn^>d^?#QyNxm4$$UI zhZoZm@86K8ix*MqgYgKG5yc(>eQhkiafa>07bpBAR0S{g#DUHNBC}m@In01_B+QN~ z=TUvBSw>;f6&vRXuLghjSg>?*4PB>QiBpQLH2+Z;KEo-;3->4*ox-aP(f$| zE^gtS8gHxc)(s2a>&4<*S@LlYH?&z>;(hvwMSd@qIpMYO(d)1dtKj;sf^4mPQMm+P z@~lCtVuh7o=>LFkTJXAn9TjQgRCqml%a-?*-xI^?*bQ+#bYeytRJ4zUFU-ilM=z#s zEAph$cUB>Z#K@zF6<^{-DOR~NyboI~_+>#KM2>+O$o2Pwe5dtQt70o-wGw?N?klZP7jK_)$3%R=+{kzeU!+an`?u*1v()znwmg%20V)Fa4YJPtbXlj-&0Rd zU&%K{J^!PgclDF;`m9Wj`c1q3t-AiryZ$Y^{*Ai+?YjQWyZ-IIK4YWLKIk(x`fQCp z^PtZv=racT?0`NavG63R*FiK8*;Ajz(Ps#@jFj;Q)bl^;IVMZSSE}a*_0(r~_Ng;G zU#sV!lO=ztdTvtBJ?fbZ#9Q z=(8F642C|tvE?)=?=AI=oha!V^}J6#-&4;qr_1yv_1vYNht<d`euQPvU?$4sPG&h>QD#(>!(qCjT&6q9G^1UN)97_hz(Di4eTFrx8P!mc*FDWl6YkCZ6P=q>LoPgElZ?ESgFXG01Bq ze?lfVj3~!=QFyX3Mrt}%Yueiwr!@7(8{>thQCu?jF{Vl88JfATF*D4ZBbl99LUKQ& z1k9`Y8*|@} zT~E;n8a<5$acfI#G|rtEtUlE^KQ=}N2O1Z}#l9f&r5UXx-yFmp{0jt}-{T|Q?B305 z#>Efr2U%vk5kJI70go#_1LyG!Gr?oL@uP=Q%%$G=lLgOZ8S!IAL9BIUR{Sa1lyuej__1eFVB_TYaSasMloLPx z4hn28jz3jozqT}f!aj<*ZgKo+LeBLK@e`k?m>ZkoPyZtYZdx8cNig5i5`Tu^*|s5m z@@16tn@xt9&CP@<9;+;Vs?fgNh@U2yaN>o}08@9O5=k|K&yAoHmw-&9WP=NfG*dDO z7VL>4B$Az1BXYVm*Lf43Gx%)hc06Y~(#;(1;`bsPE+mnfUkUv^QhMa}B;)tOxi?&V z5)L!NL-EFEI8bFDSLLJUMvic_1mj z9284+Tl%O{n3Wqz1tN8z+tLT0k_xXT{xr9xk3NO@ql}~?F>g$CTl(NsI5pKsDt?9X zp6<5vF{^NDe6?c-IhMo73Lpgcv%*? z6}2U70ZX29BaF-{nA_6lOOxkrr>IIq=_97e^F&ktQTmi=Z*$}LQV3WJqxUg4j+xIE zvvP>-I~>QVOb@BMjCJd0Zk%`uB8$4;Uucuyep~VDFm3;ZRwMq{VP4pOf&}s#-YoaJxyakl?e4RT>}=0 zP(RZ%V6h1GH@yR@ClX((nKIx!5gKS_3|JyUX=c`d8W9>~jvr7fLh0t@0d*oY*vuJF zUrc$2o5hA)-KK$TFb_EM@my-YM9ZJE6yZiIzb7dy21u5X99)h_c5Rf~GWH>W%BHy3 z`lta-4^sSwC}Ti#JB4s6Z@@CDF1rk&XoY!)dA^f5pF#Kn z^G=$AoUbCh(%f%e$X(_|4oB*$e^QnqZcCqN?l~333WZ{f)YS|Ziy17#ZRrEf;bfO-)~OrVLCP`8ZRtbS;T+?P z)JxfSlswvP=`+URrJH>73GvBFKvrj2UmfO!dG9O-ULpQ=v1Rw_NxZRvyI zsn;ydUdOGw+wx~JWO@U6_7b{iX%wvDBx{e}%p+m7(< zEF*0P%TD_(o04`1o0fJb%SpS7ZDwhAv#XgwuBnoDn5EsrSlYeJOuLU+Y4^$6d{8D79So;iZT{b1J^#w*k#dhmw%7vI0ztL?>WYQ?&#W8289M(%BtK)&>g2;Ynn$bm$L?IMG>+a4k54>;_>dLzetJeOcjM|k;5 z6gd^?nA$!28B5ixK>W*$4P@jH7*X*qQQ|9%Jx8j{XU{btJA#f^5!H;a5#=F2m(?C% z?0e#Q4NqdCI?ZQ4(!^^-CDaI>*BSd%%K4PkP;x#Ma=hK|5HOp zQ4m@p>vP5e)(%(!)f;}4u|*cmO&~HbcPzGO(gQK*7-Q9fi0Qu))kl=~IAg8WO3Cc` zg0VG%h#5eg3h6F%&c{U*=#x?&6P@Nu#@bA>AL)*kZZl;?M2BtH1of3Yy05rUk-e(x zrG70;@fBlVktvG5robbz|K~v5*Vbc1kUI^-d?P9N+%U|y$}k(VAn!Zf0vRajKe`15 z!4}_ZTcp4iKWbZezrg`H2gydoJm2D=k0xTjW6X5WIzUza4`Y@f`jW#wP`Kb8hZ_!i zP1s>ivqd+A9d_(gpqV9ii*VS*yFat}hIC#3HRhcwx8@(F1mqL?3gr=Ld{t!6xc6RA_k2;{B}6pBUi^4YS3s zX5kv0WQ*UzWR=J+!)@`0ZE{A~;=eY+ax!i4o0J@Str{sROZu3bhlfp*6^gbt+h40j z+2Y?a!M-xqG z>|8}`q;ckRsOi5_dYBEogVK z$?AnT%$xOELJK4`Xrc-8=2C~6plR}N)Z%D<2nul+bg`I|n;mjap7a=X_1adGZE|21 zc!6etO;R4s36QZ_%NP$CR|^@K1;=1YyvDItjPK3GYfN^XW4|2i8EZ{;y+h4%DeFvj zgC@M|O}0f4VsM-xT4I~S+t1o~(AIL3!||JUt_pYR>`**j^21|eiiqAJ#Jpt_Gc_E) z`7WE7X`y&?^W^ZXF};TYL)DVOA6pfc zpDRYe1CG&bqj_Z{i9c4F{>#&&YAJYUay^nL7chaWv z2xqdL%Vj-J%HCkIH?-_G?6Tj~naJ~bOA{pfFLv2)>l9kn|Egr?Z>4vs+DlFLm6rXL zUG~>pt+tCH`x{ME(xSrEYFmnezEcHlE~Z6A3&=-7-;09K&&Feg`GKp|b_`Y+!>Lx= zEUdOnykekB565b23L>T;1w9&3DOhd$I8{INVzuonh?qjP+Iq0st`<>fcyG}*F~%-4 z+09OB2^jxor!=u}8MZ1y_*A!Of`-+tPHHe3R$jJEC}#{S-U*qk_HvV5q#eGCLT(*Q zA_>ELru2xeFxk_()TiyGKBI{mRQ6e?G~LD&nC|yl1us;1POH$v%U)0_%#v>`SDNfb zt-_6V6>ic*EJWXIl4!#_`#2m8R(qAn{-yQ#m(%7ree8S-b%lM%ar#8*BOIrHYkkN+ z_*CeF)+7JmGpB036fgT+H(uY3CeG`rmh@~g*)fqHR&;GP*>OP_-jYv*I#-+Q^eELR zr$^b;nWPCa&lypwXDx#)5Ze z)H^VzkvVT0CD-1B7#FNY>&i}-URUsnvC}2imCVw8g70RN?a_RD?0kD9pLc$P;M;1l z{hDvToo~P5J4^PFTTFHke4ATtrNH~5g*SR`BSI+=yNw9i=ru;3okGIve`B(*DU)kE z1&GfWxu8@e-EOiUbkYwpDeIiKD5-Xb$-22|D@5UrgQlH)leY!h?NHzx#nNxrx}P=!J*XdqT`P8PzHBL z9=yEs2#%N-A;mCaGYt~=(W>M~iE%PsN9HC{G2IebOpH_`J`SqpCK53oT6qQwO%oCs zRY07borley2&%keOL>#F- zG{VfPro%c`A1`VhqbT!m85wRnFM)D;L@guv)LHt=A)sy{TR8NE2 z)iAOf8fpS56*aheKV?~#iaN`{CXF=|{^R^}M|H)^O+O&8DQ)-^PX zn|*?r6~@T?>hi|2#uX!{1(pSBa2s9YNZh1ViyL|Jaou}KeSJ-E6v200G^%5`?2AXlr4sLV{76zKmH!8$^cK+;Hv$E&=XXloi86_G1I`LV9 zr1F|2QWE{e1zhGQyCPH&9OY#sRWMXF)Cc{zB+6e|)`-6vLw}(`kf`<8F$htQP7&Q& z>0gQtjoThaicgGKeG?aM!qP!;5tb&z{aKpG71#BJ7;#-!_{J^GgGhNXmn~wNyu8a6 zgIm9Bl>O2#5pBEH%yxgH?Yc(W?Tpnl0r};?Fx113zn&xhz(jShu8gitjG)mN5j5^( z3)A?!9ufSYBltnr79z3nN9zrVQFMQ&ZzEH(TM7snWopLbsR45)Ir?cse|g4!Vn$0xl=QQFYeSakrz!)@2F~Ivbu*- z=hb(9Y8s1NxM+Ffr%o!wg`YZ%I)=izbsew!)LeAirw&gG&}E;RBAr5nx|C9MotK&_EM? zty2n3KV78Qx^-k0O6XbvN;!cBlym|WDCq<`-=B(-2CDUj5OLDR`hmIgXU2|F?msNi` z-GS_Hk*Y=9;wo~{@~9>@dEF~{5|UZoK`U+m){d-!Rh}+)t_?0Sh*2%S9VO9hD5Z&% z&UaYyQ=;t*L~SJ5c1v6lAoV{uXz6G0)g!v*2Cf;!#8TPfD92K?Euko}2J zZ2$*YGU%38dZ<_-SU9Kp#^1_nID5A8A`&~rhc867B}G`w=K0F5A|mt^%W(Ir;i-y0 zREEZAuBr5w2mB(|sKy8qmvc)d`~gUeEn6|6!J}2TrG-007m2bz2JIIn+p>z5#6`Gt z-L!}np0{>dI$grvbxxWgem--EOIpTOvg}6ZkvCmQox@&l!KPdi)$E39aibhpk}JOt zwUk#Rqcg&*#7me^NSI$HNE)49rr2L)^li(6Wm@DF&NG_pDh&D%4kQJXk1fU6Z#AYD zL26u?VjJvq0koQYTz~C4d7qER{+PBRS#ewK(}6&0gHiEz*^us;AVjS9?L_( zZeS1aEbuDu8t@Geh5gtp;0%C%h`toK1=t5X2fPaW33vUCd0R2q;KHy>Cao`2u zb>JXCC#8-7KLGTDelIWtmH`s18xN#16~I{0XV+;8~{uJ<^T=ArNHgLUf@mO2oQ_EanT3J1f~O} zKs~SuxEi<@G$Ta@HX%+@FLp%V?6(Y=RbjO05{q$8TbtG41X6S z3Fr$92TlPd0+WF}AONfct_L0h-UbcE8-PoJD}XD3jR4s#WBHVG#s}}JSh(nq zE4&+@x&5xIpZw>P$)CLPeiD2C^4HqVxwbCv^nQQ6fq!5A%>6H4Gx6bnf3#=!7n81e zY;M_n&kx;uU3~qj-yC{ljN_X#uD#d&wnrv@_lMa>8a^p8z8}BfimEHpGnQUChY#IS*muJ` zC-Ppk@QwZR;>wC1M0qI_c*%(1)j!*efBy!et&U+%FG&uw?U^v&Pb$7g(VOZ@qx-?_4X?~`VnbKa_( zR?a%SXZLscpT$tECa^P6SoZs`y-+0k^&9Zg7uN^+(qx6@qUwO)p4PRZAmUEh?_;)vNn)3J~kA2?n z?BBF* zseifiiEmnF|g zwARqPPksZfVYI%}T0;H}`2e&o&{|J^8Lji=JJEVX>pl5Pw62klKx-cPOXT;F??G!M ztu?f+(b`IW0j(S4Uy`4xeJb*=Xx$^fgM19~S7_ZKKZn*r@=?g&BL9rmVOk$(U8OaQ z)>!gY$q%D7o7PBLd&svW--rC#*8p07X)U64hSovyf5>MeUyyty@-u0jCV!XKD_YxW zEh0aa{8m~+$%i68i2NqAX%K`IWhp$072jm z;C_I9oZb#R4ZH{(0FqFr{y;h~9H74oIRVH9a)2UWEe>t zPXR9g^iJ^x@D6YY_!#&a;HYCPK!2yPH;@Ws03(61!0Es=AP<-Y(6QKsz#^aycoLxY zCA-o)#!0|v;8b8TK<^fGM)Pcd{`Px4unf2mp!bQ(f$M?WfqQ_502B6h10Em==ntd= z!-10lI^dNJ0xN*kz$L&{z;(b@;C6ue$wL7Byz)ulIpAgBPr$pt zhrlu5TY#Z|xqx_}7l0o`7=wV5fYHFIz+_-1px;XtAY1{Q2P_3z0D3=J4_pac3)~E_ zUbsXg(Se@?m}7Lv%G4o;jKf0D2kAIxKM_J)ltah4@aqyO#b9hD^+%J@41~w;=z$;3 zQzT<_CeX0hZR9ps>~-=c9Bd5w0JR%pF2XPa+eD%mqo4A?V;Mo8>;sG@#L{ey3uBl1tdkwXkf7FbvI!VBGPGKSP|_6`m_`(%-vfdA7S+My3(TZ= z?C*{TV|3sU+3C+fka|w`R7m*2knpsS@ajVybuZv(d}e0T3sObrI1`&(qxy) z4@tW=6nZcuw>l(kXDAe}<#OTeaz=;KP=^dMxW#A{#^ZTvTZ=6hqe4uNXpHBnw%iy> zpDZ7rAkqbqLxja{rN&2Q%EcJ{3J%oQPzNTaEe?z<`fEXAWFafWaYmd@sgIm(}t?L|MoLsxrU)ZDmA z8XyY7p^rG_WwIsIBkY%`@+MWsVuPpz6DM)R zBZXK@Mos}9Q6!p)r4XDmsf|t6gJilGostH%2cLL6NR(xKK@=K_CI$yPOPL5UwEKak zpt}aRILU`RUq}V$4}F5;4A~U-5XBh%01+%SNkakJKf~i{kwL7WkaCV>xq;L%+1 Date: Tue, 25 Nov 2025 21:08:44 +0100 Subject: [PATCH 4/4] imageInput: Kommntare verbessert --- imageInput.c | 68 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/imageInput.c b/imageInput.c index f987e39..310de8e 100644 --- a/imageInput.c +++ b/imageInput.c @@ -7,43 +7,46 @@ #define FILE_HEADER_STRING "__info2_image_file_format__" -/* - * Diese Hilfsfunktionen kümmern sich um: - * - Das Öffnen der Datei und Überprüfen des Dateinamens - * - Das Überprüfen des Headers, um sicherzustellen, dass es sich um die richtige Datei handelt - * - Das Einlesen der Metadaten (Anzahl der Bilder, Bildbreite und -höhe) - * -> Die Hilfsfunktionen garantieren, dass die Datei gültig ist, bevor mit dem Einlesen der Bilddaten fortgefahren wird. + +//HilfsFunktionen: + + +/* Opens the file in binary mode. + * path: file path to open (must not be NULL). + * returns FILE* or NULL on failure. */ - - -static FILE *openImageFile(const char *path) // Checks if the given filename pointer is valid (not NULL). +static FILE *openImageFile(const char *path) { if (path == NULL) { return NULL; } - return fopen(path, "rb"); //opening document in binear + return fopen(path, "rb"); } -static int readAndCheckHeader(FILE *file) // gets the length of the header text +/* Reads and checks the file header. + * file: opened file to read the header from. + * returns 1 if header is valid, otherwise 0. + */ +static int readAndCheckHeader(FILE *file) { size_t headerLength = strlen(FILE_HEADER_STRING); char buffer[BUFFER_SIZE]; - if (headerLength + 1 > BUFFER_SIZE) //checks if buffer is big enough for header size + if (headerLength + 1 > BUFFER_SIZE) { return 0; } - if (fread(buffer, 1, headerLength, file) != headerLength) // Checks if reading the expected number of header bytes from the file succeeded + if (fread(buffer, 1, headerLength, file) != headerLength) { return 0; } - buffer[headerLength] = '\0'; // add string terminator so the header becomes a valid C-string + buffer[headerLength] = '\0'; - if (strcmp(buffer, FILE_HEADER_STRING) != 0) // checks if the expected header matches the header read from the file + if (strcmp(buffer, FILE_HEADER_STRING) != 0) { return 0; } @@ -52,25 +55,29 @@ static int readAndCheckHeader(FILE *file) // gets the length of the header text } -static int readImageMetaData(FILE *file, // reads the metadata (count, width, height) from the file and stores them in the provided pointers +/* Reads metadata: image count, width, and height. + * file: file to read from; count/width/height are outputs. + * returns 1 on success or 0 on invalid/zero metadata. + */ +static int readImageMetaData(FILE *file, unsigned short *count, unsigned short *width, unsigned short *height) { - if (fread(count, sizeof(unsigned short), 1, file) != 1) // read the number of images from the file + if (fread(count, sizeof(unsigned short), 1, file) != 1) { return 0; } - if (fread(width, sizeof(unsigned short), 1, file) != 1) // reads the image width + if (fread(width, sizeof(unsigned short), 1, file) != 1) { return 0; } - if (fread(height, sizeof(unsigned short), 1, file) != 1) //reads the image height + if (fread(height, sizeof(unsigned short), 1, file) != 1) { return 0; } - if (*count == 0 || *width == 0 || *height == 0) // check for invalid metadata (count, width or height cannot be zero) + if (*count == 0 || *width == 0 || *height == 0) { return 0; } @@ -79,9 +86,13 @@ static int readImageMetaData(FILE *file, // reads the metadata (count, width, he } -/* - Hauptfunktion -*/ +//Hauptfunktion: + + +/* Loads all images + labels from a .info2 file. + * path: file path to load. + * returns a new GrayScaleImageSeries or NULL on error. + */ GrayScaleImageSeries *readImages(const char *path) { // 1. Open the file @@ -110,7 +121,7 @@ GrayScaleImageSeries *readImages(const char *path) } // 4. Allocate memory for image series - GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); // Allocate memory for the image series, images, and labels. Return NULL if allocation fails. + GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); if (series == NULL) { fclose(file); @@ -154,7 +165,7 @@ GrayScaleImageSeries *readImages(const char *path) return NULL; } - if (fread(image->buffer, sizeof(GrayScalePixelType), numPixels, file) != numPixels) // Check if the correct number of pixel values (width * height) were read for the image + if (fread(image->buffer, sizeof(GrayScalePixelType), numPixels, file) != numPixels) { for (unsigned int j = 0; j <= i; j++) { @@ -167,7 +178,7 @@ GrayScaleImageSeries *readImages(const char *path) return NULL; } - if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) // Check if the label for the image was successfully read (1 byte) + if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) { for (unsigned int j = 0; j <= i; j++) { @@ -185,7 +196,10 @@ GrayScaleImageSeries *readImages(const char *path) return series; } -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt +/* Frees the entire image series. + * series: image series to free (NULL-safe). + * returns nothing (void). + */ void clearSeries(GrayScaleImageSeries *series) { if (series == NULL)