{"id":8303,"date":"2023-03-10T16:39:50","date_gmt":"2023-03-10T14:39:50","guid":{"rendered":"https:\/\/blue.pri.ee\/ttu\/?p=8303"},"modified":"2026-01-29T11:25:47","modified_gmt":"2026-01-29T09:25:47","slug":"pr2et8-dunaamiline-malu-2","status":"publish","type":"post","link":"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/","title":{"rendered":"PR2ET8: D\u00fcnaamiline m\u00e4lu 2"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Praktikumi_materjal\" >Praktikumi materjal<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Praktikumi_ulesanded\" >Praktikumi \u00fclesanded<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Ulesanne_W08-1_Faili_lugemine_kasutades_dunaamilist_malu\" >\u00dclesanne [W08-1]: Faili lugemine kasutades d\u00fcnaamilist m\u00e4lu<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Andmefail\" >Andmefail<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Nouded\" >N\u00f5uded<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Andmestruktuur_ulesandele\" >Andmestruktuur \u00fclesandele<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Soovituslik_loetelu_funktsioonidest\" >Soovituslik loetelu funktsioonidest<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Funktsioon_andmete_lugemiseks\" >Funktsioon andmete lugemiseks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Testimine\" >Testimine<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Lisaulesanne_1_W08-2_Optimaalne_maluhoive\" >Lisa\u00fclesanne 1 [W08-2]: Optimaalne m\u00e4luh\u00f5ive<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Nouded-2\" >N\u00f5uded<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Lisaulesanne_2_W08-3_umbris-struktuur\" >Lisa\u00fclesanne 2 [W08-3]: \u00fcmbris-struktuur<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Nouded-3\" >N\u00f5uded<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Parast_seda_tundi_peaksid\" >P\u00e4rast seda tundi peaksid<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/#Taiendav_materjal\" >T\u00e4iendav materjal<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Praktikumi_materjal\"><\/span>Praktikumi materjal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Slaidid: <a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/slaidid-et\/2025\/08_dynaamiline_malu_2.pdf\"><strong>D\u00fcnaamiline m\u00e4lujaotus 2<\/strong><\/a><\/li>\n<li>T\u00e4iendav n\u00e4ide: <strong><a href=\"https:\/\/blue.pri.ee\/ttu\/programmeerimine-ii\/koodinaited\/struct_wrapper_dynamic\/\">\u00fcmbris-struktuur (<em>wrapper struct<\/em>) d\u00fcnaamilisele massiivile<\/a><\/strong><\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Praktikumi_ulesanded\"><\/span>Praktikumi \u00fclesanded<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Selles tunnis on \u00fcks \u00fclesanne, mida laiendab kaks lisa\u00fclesannet<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_W08-1_Faili_lugemine_kasutades_dunaamilist_malu\"><\/span>\u00dclesanne [W08-1]: Faili lugemine kasutades d\u00fcnaamilist m\u00e4lu<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selle \u00fclesande eesm\u00e4rgiks on tutvuda, kuidas lugeda teadmata pikkusega faile sedasi, et me kasutame t\u00e4pselt nii palju m\u00e4lu, kui failis olevate andmete hoiustamiseks vaja on.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Andmefail\"><\/span>Andmefail<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Andmefaili struktuur on j\u00e4rgnev:\u00a0<span class=\"lang:c highlight:0 decode:true crayon-inline\">&lt;indeks&gt; &lt;perenimi&gt; &lt;eesnimi&gt; &lt;\u00f5ppekava kood&gt; &lt;punktide arv&gt;<\/span><\/p>\n<ul>\n<li>Indeks (t\u00e4isarv)<\/li>\n<li>Ees- ja perenimi &#8211; erineva pikkusega s\u00f5ned<\/li>\n<li>\u00d5ppekava kood &#8211; 4-t\u00e4hem\u00e4rgi pikkune s\u00f5ne<\/li>\n<li>Punktide arv &#8211; k\u00fcmnendmurd vahemikus 10,0 kuni 30,0 t\u00e4psusega 0,1.<\/li>\n<\/ul>\n<p>V\u00f5id kasutada andmefailide loomiseks oma eelmise n\u00e4dala praktikumi\u00fclesande lahendust. Testimiseks on antud siiski kindlad failid, et saaksid oma v\u00e4ljundit v\u00f5rrelda.<\/p>\n<p>Andmefailid, mille v\u00e4ljundi n\u00e4ited on ka <strong><a href=\"#Testimine\">testimine<\/a> <\/strong>osas: <strong><a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/andmefailid\/8_scholarship_data.zip\">https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/andmefailid\/8_scholarship_data.zip<\/a><\/strong><\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded\"><\/span>N\u00f5uded<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Loe teadmata pikkusega andmefaili sisu m\u00e4llu\n<ul>\n<li>Lugemiseks kasuta <span class=\"lang:c highlight:0 decode:true crayon-inline \">realloc()<\/span>\u00a0 funktsiooni, laiendades m\u00e4luala suurust jooksvalt lugemise k\u00e4igus.<\/li>\n<li>Andmed salvesta d\u00fcnaamiliselt loodud struktuurimassiivi<\/li>\n<li>Lugemise l\u00f5puks peab k\u00fcsitud m\u00e4lumaht olema t\u00e4pselt nii suur, kui on vaja failis olevate andmete hoiustamiseks.<\/li>\n<li>Faili tohib vaid \u00fchel korral lugeda (korduv lugemine keelatud! Ka lihtsalt reavahetuste arvu lugemine ei ole lubatud!)<\/li>\n<li>Arvesta, et faili pikkus v\u00f5ib muutuda! St faili pikkus selgub lugemise k\u00e4igus!<\/li>\n<\/ul>\n<\/li>\n<li>K\u00f5ik muutuva pikkusega s\u00f5ned tuleb m\u00e4lus hoida t\u00e4pse pikkusega.\n<ul>\n<li>Lugemise ajal kasuta staatilist puhvrit, struktuuris hoidmiseks kasuta d\u00fcnaamilist m\u00e4lu!<\/li>\n<\/ul>\n<\/li>\n<li>Failis on stipendiumile kandideerivate tudengite loetelu. Stipendiumi saavad:\n<ul>\n<li>Igast j\u00e4rgnevast erialast kuni 7 k\u00f5ige k\u00f5rgema punktisummaga tudengit: IACB, EARB ja MVEB.<\/li>\n<\/ul>\n<\/li>\n<li>Kuva stipendiumi saajate nimekiri ning n\u00e4ita mitu tudengit igalt erialalt stipendiumi sai.<\/li>\n<li>Veendu, et programm ei tekita m\u00e4lulekkeid!<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Andmestruktuur_ulesandele\"><\/span>Andmestruktuur \u00fclesandele<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Selles \u00fclesandes l\u00e4heme \u00fcle d\u00fcnaamilisele m\u00e4lule struktuuri liikmete hulgas, mille pikkus on muutuv (s\u00f5ned ja teised massiivid) &#8211; see s\u00e4\u00e4stab m\u00e4lu ja suurendab paindlikkust. Struktuur v\u00f5tab j\u00e4rgneva kuju:<\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">typedef struct\r\n{\r\n    int index;\r\n    char *fName;\r\n    char *lName;\r\n    char curriculum[LEN_CURRICULUM + 1];\r\n    float points;\r\n} Person;<\/pre>\n<p><strong>M\u00e4rkused:<\/strong><\/p>\n<ul>\n<li>Soovi korral v\u00f5id nimetusi endale sobilikumaks muuta<\/li>\n<li><span class=\"lang:c highlight:0 decode:true crayon-inline \">fName<\/span>\u00a0 ja <span class=\"lang:c highlight:0 decode:true crayon-inline \">lName<\/span>\u00a0 on n\u00fc\u00fcd viidad, mis vajavad d\u00fcnaamilist m\u00e4lu, enne kui nendesse midagi salvestada saab &#8211; seda kuna nime pikkus on muutuv inimeselt inimesele.<\/li>\n<li>\u00d5ppekava koodi massiiv on staatiline, sest see on alati t\u00e4pselt sama pikk &#8211; d\u00fcnaamiline m\u00e4lu siin oleks raiskav.<\/li>\n<li>\u00dcksikud t\u00e4isarvud, murdarvud jne j\u00e4\u00e4vad samuti staatiliseks &#8211; j\u00e4llegi, d\u00fcnaamiline m\u00e4lu siin teeks programmi p\u00f5hjendamatult aeglasemaks ja keerukamaks.<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Soovituslik_loetelu_funktsioonidest\"><\/span>Soovituslik loetelu funktsioonidest<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>NB! Funktsioonide tegelik kuju s\u00f5ltub, kuidas otsustad \u00fclesannet lahendada ja struktureerida.<\/p>\n<p><strong>Minimaalselt<\/strong> on sul vaja kolme funktsiooni:<\/p>\n<ul>\n<li>Andmete lugemise funktsioon failist (<strong>vali v\u00e4lja j\u00e4rgmisest peat\u00fckist<\/strong>).<\/li>\n<li>Vastuste v\u00e4ljastamise funktsiooni.\n<pre class=\"toolbar:2 lang:c decode:true\">void PrintScholarships(Person *pStudents, int n); \/\/ Good for base task\r\nvoid PrintScholarships(StudentWrapper stdWrapper); \/\/ Good for advanced task 2<\/pre>\n<\/li>\n<li>Andmete vabastamise funktsiooni\n<pre class=\"toolbar:2 lang:c decode:true\">void FreeStudentData(Person *pStudents, int n); \/\/ Good for base task\r\nvoid FreeStudentData(Person **ppStudents, int n); \/\/ Good for base task with defensive programming\r\nvoid FreeStudentData(StudentWrapper stdWrapper); \/\/ Good for advanced task 2<\/pre>\n<\/li>\n<\/ul>\n<p><strong>Soovituslikud<\/strong> funktsioonid enda elu lihtsamaks tegemiseks<\/p>\n<ul>\n<li>qsordi v\u00f5rdlusfunktsioon\n<pre class=\"toolbar:2 lang:c decode:true\">int ComparStudentByPoints(const void *a, const void *b);<\/pre>\n<\/li>\n<li>\u00dche tudengi andmete printimise funktsioon (kasulik kui prindid tudengi andmeid, kes stipendiumi saab.\n<pre class=\"toolbar:2 lang:c decode:true\">void PrintStudent(Student *s);<\/pre>\n<\/li>\n<li>Kaitsva programmeerimisstiili jaoks kulub \u00e4ra ka slaididel n\u00e4idatud vabastamisfunktsioon\n<pre class=\"toolbar:2 lang:c decode:true\">void FreeMemory(void **p);<\/pre>\n<\/li>\n<\/ul>\n<p>Lugemise kontrollimiseks v\u00f5ib olla m\u00f5istlik luua ka funktsioon, mis tr\u00fckib k\u00f5igi tudengite andmed v\u00e4lja, mis failist k\u00e4tte saadi. See aga pole \u00fclesande osa.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Funktsioon_andmete_lugemiseks\"><\/span>Funktsioon andmete lugemiseks<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Sel korral v\u00f5tab andmete lugemise funktsioon veidi teistsuguse kuju.\u00a0 Funktsioonist on meil vaja saada k\u00e4tte 2 uut v\u00e4\u00e4rtust &#8211; d\u00fcnaamilise massiivi asukoht ja failist loetud ridade arv. Selleks pakun v\u00e4lja kolm erinevat funktsiooni kuju, mille hulgast saad valida endale meelep\u00e4rase!<\/p>\n<p><strong>Variant 1<\/strong> on k\u00f5ige sarnasem varasemalt tuttavale faili lugemise funktsiooni kujule. Funktsiooni tagastuseks on ridade arv ning m\u00e4luviida saame k\u00e4tte kasutades topeltviita.<\/p>\n<p><strong>Variant 2<\/strong> vahetab andmete liikumise \u00fcmber &#8211; ridade arv tuleb n\u00fc\u00fcd kasutades viita ning tagastusena anname m\u00e4luaadressi d\u00fcnaamilisele massiivile. Sedasi saab v\u00e4ltida topeltviida kasutamist, kui see liiga keerukaks osutub.<\/p>\n<p><strong>Variant 3<\/strong> liigutab kogu andmevahetuse viitadele. See lubab meil funktsioonist tagastada funktsiooni t\u00f6\u00f6 oleku &#8211; st kas lugemine t\u00f6\u00f6tas edukalt v\u00f5i eba\u00f5nnestus. See on ka k\u00f5ige l\u00e4hedasem suurele osale C keelsetele funktsioonidele &#8211; suur osa neist tagastab nulli, kui t\u00f6\u00f6 oli edukas, ning mittenullise v\u00e4\u00e4rtuse, kui juhtus viga.<\/p>\n<p>NB! Kasutades lisa\u00fclesandes 2 tutvustatud \u00fcmbrisstruktuuri ideed saab parameetrite loetelu veelgi puhtamaks!<\/p>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"1\" data-scroll-offset=\"0\" data-anchor-in-url=\"yes\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\">Variant 1<\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\">Variant 2<\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\">Variant 3<\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"Variant 1\">\n<pre class=\"lang:c decode:true\">\/**\r\n * Description:   Reads data from a file. During reading, a dynamic\r\n *                struct array will be created and expanded using realloc()\r\n * Parameters:    ppStudentData - Stores the location of the allocated array\r\n *                fileName - name of the input file to read\r\n * Return:        Number of lines read from the file\r\n *\/\r\nint ReadData(Person **ppStudentData, char *fileName)\r\n{\r\n    \/\/ Current line counter\r\n    int count = 0;\r\n\r\n    \/\/ Main pointer for the allocated array\r\n    Person *pData = NULL;\r\n\r\n    \/\/ Declare temporary buffers for reading (all variables you intend to read!)\r\n\r\n\r\n    \/\/ Read a record at a time in a loop into buffer(s)\r\n    while ()\r\n    {\r\n        \/\/ Rellocate memory to fit the latest line, using a temporary variable\r\n        Person *pTemp = realloc(pData, \/* Calculate number of bytes required *\/);\r\n\r\n        \/\/ Check allocation was successful\r\n        if (pTemp == NULL)\r\n        {\r\n            \/* Write error behavior here *\/\r\n        }\r\n\r\n        \/\/ Allocation success, make sure both pointers point at memory\r\n        pData = pTemp;\r\n\r\n        \/\/ 1. Allocate all dynamic buffers (strings in this task)\r\n        \/\/ 2. Copy the data from buffers to struct array\r\n\r\n\r\n        \/\/ Increment number of records successfully read\r\n        count++;\r\n    }\r\n\r\n\r\n    \/\/ Store the allocated array trough the double pointer\r\n    *ppStudentData = pData;\r\n\r\n    \/\/ Return the number of lines read\r\n    return count;\r\n}\r\n<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"Variant 2\">\n<pre class=\"lang:c decode:true \">\/**\r\n * Description:   Reads data from a file. During this, a dynamic\r\n *                struct array will be created and expanded using realloc()\r\n * Parameters:    pLineCount - pointer to store the read line count\r\n *                fileName - name of the input file to read\r\n * Return:        Pointer to the allocated data array\r\n *\/\r\nPerson * ReadData(int *pLineCount, char *fileName)\r\n{\r\n    \/\/ Current line counter\r\n    int count = 0;\r\n\r\n    \/\/ Main pointer for the allocated array\r\n    Person *pData = NULL;\r\n\r\n    \/\/ Declare temporary buffers for reading (all variables you intend to read!)\r\n\r\n\r\n    \/\/ Read a record at a time in a loop into buffer(s)\r\n    while ()\r\n    {\r\n        \/\/ Rellocate memory to fit the latest line, using a temporary variable\r\n        Person *pTemp = realloc(pData, \/* Calculate number of bytes required *\/);\r\n\r\n        \/\/ Check allocation was successful\r\n        if (pTemp == NULL)\r\n        {\r\n            \/* Write error behavior here *\/\r\n        }\r\n\r\n        \/\/ Allocation success, make sure both pointers point at memory\r\n        pData = pTemp;\r\n\r\n        \/\/ 1. Allocate all dynamic buffers (strings in this task)\r\n        \/\/ 2. Copy the data from buffers to struct array\r\n\r\n\r\n        \/\/ Increment number of records successfully read\r\n        count++;\r\n    }\r\n\r\n\r\n    \/\/ Store the number of lines trough the pointer\r\n    *pLineCount = count;\r\n\r\n    \/\/ Return the pointer to the data\r\n    return pData;\r\n}\r\n<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"Variant 3\">\n<pre class=\"lang:c decode:true\">\/**\r\n * Description:   Read data from a file. During this, a dynamic\r\n *                struct array will be created and expanded using realloc()\r\n * Parameters:    ppStudentData - Stores the location of the allocated array\r\n *                pLineCount - pointer to store the read line count\r\n *                fileName - name of the input file to read\r\n * Return:        0 if data is read successfully\r\n *                1 if error is encountered\r\n *\/\r\nint ReadData(Person **ppStudentData, int *pLineCount, char *fileName)\r\n{\r\n    \/\/ Current line counter\r\n    int count = 0;\r\n\r\n    \/\/ Main pointer for the allocated array\r\n    Person *pData = NULL;\r\n\r\n    \/\/ Declare temporary buffers for reading (all variables you intend to read!)\r\n\r\n\r\n    \/\/ Read a record at a time in a loop into buffer(s)\r\n    \/\/ Note: if you encounter an error, return a NON-ZERO value!\r\n    while ()\r\n    {\r\n        \/\/ Rellocate memory to fit the latest line, using a temporary variable\r\n        Person *pTemp = realloc(pData, \/* Calculate number of bytes required *\/);\r\n\r\n        \/\/ Check allocation was successful\r\n        if (pTemp == NULL)\r\n        {\r\n            \/* Write error behavior here *\/\r\n        }\r\n\r\n        \/\/ Allocation success, make sure both pointers point at memory\r\n        pData = pTemp;\r\n\r\n        \/\/ 1. Allocate all dynamic buffers (strings in this task)\r\n        \/\/ 2. Copy the data from buffers to struct array\r\n\r\n\r\n        \/\/ Increment number of records successfully read\r\n        count++;\r\n    }\r\n\r\n    \/\/ Store the allocated array trough the double pointer\r\n    *ppStudentData = pData;\r\n\r\n    \/\/ Store the number of lines trough the pointer\r\n    *pLineCount= count;\r\n\r\n    \/\/ Everything OK\r\n    return 0;\r\n}\r\n<\/pre>\n<\/div><\/div><\/div>\n<h5><span class=\"ez-toc-section\" id=\"Testimine\"><\/span>Testimine<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Esimeses n\u00e4ites kasutame pikemat andmefaili, kus k\u00f5ik loetelud said t\u00e4is.<\/p>\n<pre class=\"theme:cisco-router toolbar:2 nums:false wrap:true lang:c highlight:0 decode:true\">risto@risto-lt3-tux:~\/Nextcloud\/work\/ttu\/teaching\/_generic\/prog2\/lab\/wk8_scholarships$ valgrind .\/scholarships v1.txt\r\n==14380== Memcheck, a memory error detector\r\n==14380== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.\r\n==14380== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info\r\n==14380== Command: .\/scholarships v1.txt\r\n==14380==\r\nInd   fName        lName        Code   Points\r\n 13   Laivi        Kaasik       IACB    30.0\r\n 75   Julia        Saal         MVEB    30.0\r\n  3   Kerttu       Allik        MVEB    29.8\r\n 25   Ingrid       Kukk         MVEB    29.8\r\n  5   Valdo        Heinsoo      IACB    29.7\r\n 77   Jaan         Saar         IACB    29.7\r\n  9   Kristi       Hunt         IACB    29.5\r\n 20   Doris        Vares        IACB    29.5\r\n 76   Annika       Saar         EARB    29.5\r\n 36   Veljo        Lepp         MVEB    29.4\r\n 10   Hendrik      Ivanov       IACB    29.1\r\n 38   Monika       Leppik       MVEB    29.1\r\n 22   Anna         Kruuse       MVEB    29.0\r\n 51   Mare         Paas         IACB    28.2\r\n 80   Rainer       Sepp         EARB    27.8\r\n 59   Kristiina    Petrov       MVEB    27.6\r\n 45   Tatjana      Orav         EARB    26.7\r\n 74   Anneli       Saal         EARB    26.3\r\n 69   Tiina        Raud         EARB    25.1\r\n  8   Anna         Herkel       EARB    23.0\r\n 65   Denis        Purga        EARB    21.7\r\n\r\n\r\nEARB: 7 \/ 7 scholarsips assigned\r\nIACB: 7 \/ 7 scholarsips assigned\r\nMVEB: 7 \/ 7 scholarsips assigned\r\n==14380==\r\n==14380== HEAP SUMMARY:\r\n==14380==     in use at exit: 0 bytes in 0 blocks\r\n==14380==   total heap usage: 175 allocs, 175 frees, 20,396 bytes allocated\r\n==14380==\r\n==14380== All heap blocks were freed -- no leaks are possible\r\n==14380==\r\n==14380== For lists of detected and suppressed errors, rerun with: -s\r\n==14380== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)<\/pre>\n<p>Teises n\u00e4ites on andmefail l\u00fchem.<\/p>\n<pre class=\"theme:cisco-router toolbar:2 nums:false wrap:true lang:c highlight:0 decode:true\">risto@risto-lt3-tux:~\/Nextcloud\/work\/ttu\/teaching\/_generic\/prog2\/lab\/wk8_scholarships$ valgrind .\/scholarships v2.txt\r\n==14397== Memcheck, a memory error detector\r\n==14397== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.\r\n==14397== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info\r\n==14397== Command: .\/scholarships v2.txt\r\n==14397==\r\nInd   fName        lName        Code   Points\r\n  5   Laivi        Kaasik       IACB    30.0\r\n  0   Kerttu       Allik        MVEB    29.8\r\n  3   Hendrik      Ivanov       IACB    29.1\r\n  6   Kristi       Kalda        IACB    27.0\r\n  9   Jevgeni      Kuusk        MVEB    25.0\r\n  2   Anna         Herkel       EARB    23.0\r\n 11   Tiina        Laas         IACB    22.4\r\n  4   Milvi        Jakobson     IACB    19.5\r\n  7   Mati         Kruuse       IACB    17.3\r\n 10   Liis         Kuusk        MVEB    17.2\r\n  1   Sirje        Helme        EARB    12.9\r\n  8   Mihkel       Kruuse       MVEB    10.6\r\n\r\n\r\nEARB: 2 \/ 7 scholarsips assigned\r\nIACB: 6 \/ 7 scholarsips assigned\r\nMVEB: 4 \/ 7 scholarsips assigned\r\n==14397==\r\n==14397== HEAP SUMMARY:\r\n==14397==     in use at exit: 0 bytes in 0 blocks\r\n==14397==   total heap usage: 29 allocs, 29 frees, 6,947 bytes allocated\r\n==14397==\r\n==14397== All heap blocks were freed -- no leaks are possible\r\n==14397==\r\n==14397== For lists of detected and suppressed errors, rerun with: -s\r\n==14397== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)\r\n<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Lisaulesanne_1_W08-2_Optimaalne_maluhoive\"><\/span>Lisa\u00fclesanne 1 [W08-2]: Optimaalne m\u00e4luh\u00f5ive<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selles \u00fclesandes muudame oma d\u00fcnaamilise m\u00e4lu h\u00f5ivamise m\u00f5istlikumaks kasutades optimaalsemat m\u00e4lu laiendamise strateegiat.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded-2\"><\/span>N\u00f5uded<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Muuda oma faili lugemist sedasi, et lugemiseks kasutaksid (n * 2) strateegiat\n<ul>\n<li>St iga kord kui k\u00fcsitud m\u00e4lumaht saab otsa, laiendatakse m\u00e4luala 2x v\u00f5rreldes olemasolevaga<\/li>\n<\/ul>\n<\/li>\n<li>Alustamiseks vali n, mis on suurem kui 1 (vali siiski v\u00e4hemalt 3x v\u00e4iksem kui pikima faili pikkus)<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"Lisaulesanne_2_W08-3_umbris-struktuur\"><\/span>Lisa\u00fclesanne 2 [W08-3]: \u00fcmbris-struktuur<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selles \u00fclesandes muudame oma koodi veelgi loetavamaks ja seotumaks, pannes oma andmestruktuuri ja selle omadused \u00fchte \u00fcmbritsevasse struktuuri.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded-3\"><\/span>N\u00f5uded<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Pane oma struktuurimassiiv teise struktuuri ehk \u00fcmbrise sisse (<em>wrapper struct<\/em>),<\/li>\n<li>\u00dcmbrises peaks olema 3 muutujat &#8211; viide struktuurile, struktuuri suurus ja struktuuri kasutatud liikmete arv.<\/li>\n<li>Muuda oma funktsioonide parameetreid nii, et n\u00fc\u00fcd need kasutaksid uut vastloodud \u00fcmbrisstruktuuri.<\/li>\n<li>NB! M\u00f5tle l\u00e4bi, mis funktsiooni on m\u00f5istlik viit \u00fcmbrisele anda, millisesse pole seda m\u00f5tet teha!<\/li>\n<\/ul>\n<p>Vihje: Kuna n\u00fc\u00fcd on iga v\u00e4lja poole p\u00f6\u00f6rdumisel vaja \u00fcmbrisstrukuturist valida v\u00e4lja \u00f5ige liige, siis v\u00f5ib loetavuse huvides olla see m\u00f5istlik &#8220;lahti pakkida&#8221; eraldi muutujasse vastava funktsiooni v\u00f5i ts\u00fckli sees. N\u00e4iteks<\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">void PrintData(StudentWrapper stdWrap)\r\n{\r\n    int len = stdWrap.used;\r\n\r\n    for (int i = 0; i &lt; len; i++)\r\n    {\r\n        student *s = &amp;stdWrap.studentDB[i];\r\n\r\n    }\r\n}<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Parast_seda_tundi_peaksid\"><\/span>P\u00e4rast seda tundi peaksid<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>teadma erinevaid v\u00f5imalusi, kuidas struktureerida ja lugeda faile, mille pikkus v\u00f5ib erineda<\/li>\n<li>oskama d\u00fcnaamiliselt oma massiivide suurust muuta<\/li>\n<li>oskama lugeda faile d\u00fcnaamilist m\u00e4lu kasutades jooksvalt ja t\u00e4pselt<\/li>\n<li>teadma k\u00f5iki v\u00f5imalike realloci tagastuste v\u00f5imalus<\/li>\n<li>teadma kahte laiendamise strateegiat (n + 1) ja (n * 2) ning oskama neid kahte v\u00f5rrelda<\/li>\n<li>oskama struktuuri liikmetele m\u00e4lu k\u00fcsida<\/li>\n<li>teadma ja oskama rakendada ohutu programmeerimise tehnikat m\u00e4lu vabastamisel.<\/li>\n<li>teadma k\u00f5iki samme, mida strdup() funktsioon taustal teeb<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Taiendav_materjal\"><\/span>T\u00e4iendav materjal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>cppreference: Realloc documentation<br \/>\n<strong><a href=\"https:\/\/en.cppreference.com\/w\/c\/memory\/realloc\">https:\/\/en.cppreference.com\/w\/c\/memory\/realloc<\/a><\/strong><\/li>\n<li>Beej&#8217;s guide: Changing allocated size<br \/>\n<a href=\"https:\/\/beej.us\/guide\/bgc\/html\/split\/manual-memory-allocation.html#changing-allocated-size-with-realloc\"><strong>https:\/\/beej.us\/guide\/bgc\/html\/split\/manual-memory-allocation.html#changing-allocated-size-with-realloc<\/strong><\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Praktikumi materjal Slaidid: D\u00fcnaamiline m\u00e4lujaotus 2 T\u00e4iendav n\u00e4ide: \u00fcmbris-struktuur (wrapper struct) d\u00fcnaamilisele massiivile Praktikumi \u00fclesanded Selles tunnis on \u00fcks \u00fclesanne, mida laiendab kaks lisa\u00fclesannet \u00dclesanne [W08-1]: Faili lugemine kasutades d\u00fcnaamilist m\u00e4lu Selle \u00fclesande eesm\u00e4rgiks on tutvuda, kuidas lugeda teadmata pikkusega faile sedasi, et me kasutame t\u00e4pselt nii palju m\u00e4lu, kui failis olevate andmete hoiustamiseks vaja &hellip; <a href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et8-dunaamiline-malu-2\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">PR2ET8: D\u00fcnaamiline m\u00e4lu 2<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97,176],"tags":[],"class_list":["post-8303","post","type-post","status-publish","format-standard","hentry","category-laborid","category-pr2-et"],"_links":{"self":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/8303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/comments?post=8303"}],"version-history":[{"count":22,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/8303\/revisions"}],"predecessor-version":[{"id":9972,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/8303\/revisions\/9972"}],"wp:attachment":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/media?parent=8303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/categories?post=8303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/tags?post=8303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}