{"id":8282,"date":"2023-03-06T14:08:16","date_gmt":"2023-03-06T12:08:16","guid":{"rendered":"https:\/\/blue.pri.ee\/ttu\/?page_id=8282"},"modified":"2024-02-13T13:29:49","modified_gmt":"2024-02-13T11:29:49","slug":"korduvkasutatava-koodi-teegi-loomine","status":"publish","type":"page","link":"https:\/\/blue.pri.ee\/ttu\/programmeerimine-ii\/koodinaited\/korduvkasutatava-koodi-teegi-loomine\/","title":{"rendered":"Korduvkasutatava koodi (teegi) loomine"},"content":{"rendered":"<p>J\u00e4rgnevas n\u00e4ites vaatame kuidas v\u00f5iks struktureerida enda koostatud teegifaile, mis suudavad ka infot salvestada enda sisse ilma, et seda teeks meie eest teadmist kasutav programm.<\/p>\n<p><strong>M\u00e4rkused:<\/strong><\/p>\n<ul>\n<li>J\u00e4rgnev on kirjeldatud ideena millest saad paralleeli v\u00f5tta ja hakata enda vajalikku teeki \u00fcles ehitama. Logimise teeki saad n\u00e4iteks Kodut\u00f6\u00f6 2 juures juba \u00e4ra kasutada.<\/li>\n<li>Teek, mille kokku kompileerid ja lisad oma programmile, suurendab su l\u00f5pptoote suurust &#8211; seda tuntakse ka kui staatiliselt kompileeritud teek (<em>statically compiled library<\/em>)<\/li>\n<li>Tehniliselt v\u00f5ttes ei ole selle n\u00e4ite l\u00f5puks valmis veel teek &#8211; seda aga ainult seet\u00f5ttu, et me j\u00e4tame teegiks kompileerimise ja pakendamise vahele &#8211; selle v\u00f5id aga ise julgelt teha, viite leiad kohe j\u00e4rgmise punkti alt. <strong>Koodis ei muutu midagi! <\/strong>Lihtsuse huvides viitan \u00fclej\u00e4\u00e4nud tekstis loodavale koodile j\u00e4kuvalt teegina.<\/li>\n<li>Kui soovid teegiks kompileerimise kohta lugeda, vaata siia: <strong><a href=\"http:\/\/www.yolinux.com\/TUTORIALS\/LibraryArchives-StaticAndDynamic.html\">http:\/\/www.yolinux.com\/TUTORIALS\/LibraryArchives-StaticAndDynamic.html<\/a>. <\/strong>Staatiline teek l\u00f5ppeb laiendiga <span class=\"lang:default highlight:0 decode:true crayon-inline\">.a<\/span>\u00a0.<\/li>\n<\/ul>\n<p><strong>Teegi p\u00e4isefail<\/strong><\/p>\n<p>Pane siia k\u00f5ik mida soovid \u00fclej\u00e4\u00e4nud maailmale n\u00e4idata ja mida neil vaja v\u00f5ib minna &#8211; nt v\u00e4ljakutsutavad funktsioonid, struktuuride kirjeldused jne. Nii nagu ikka.<\/p>\n<p>M\u00e4rkus: p\u00e4iseid v\u00f5ib olla ka mitu &#8211; k\u00f5ik neist ei pea olema &#8220;avalikud&#8221;, osa v\u00f5ivad kirjeldada ka sisemisi funktsioone mida kolmandad osapooled otse kasutama ei peaks.<\/p>\n<pre class=\"lang:c decode:true\">#ifndef WRITER_H\r\n#define WRITER_H\r\n\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdbool.h&gt;\r\n\r\nvoid SetValue(int init);\r\nint GetValue(void);\r\nvoid SetCoefficient(int coef);\r\nint WriteUpdate(void);\r\n\r\n#endif\r\n<\/pre>\n<p><strong>Teegi kood<\/strong><\/p>\n<p>Teegi enda jooksutatav kood peaks olema terviklik &#8211; st eelistatult ei ole sellel vaja otseseid seoseid sinu peaprogrammiga ning teegiga suhtlemine k\u00e4ib l\u00e4bi teegi poolt pakutavate funktsioonide.<\/p>\n<p>Aegajalt on m\u00f5istlik, et teegil on ka enda sisemised globaalsed muutujad &#8211; nende v\u00e4\u00e4rtused s\u00e4ilivad ning siis ei pea muretsema, et kasutaja programm nendel j\u00e4rge peab.<\/p>\n<p>Samas see pole ka reegel &#8211; sageli annavad teegid kasutajale siiski hallata oma seadistuse, tagastades n\u00e4iteks viida struktuurile, mille teek loob. Selle struktuuri sees saab olema k\u00f5ik vajalik seadistus ja informatsioon. Seda me antud n\u00e4ites ei kajasta aga n\u00e4iteks v\u00f5id m\u00f5elda mida tagastab fopen() (mis andmeid selle viida poolt hoitud struktuur sisaldab)<\/p>\n<pre class=\"lang:c decode:true\" title=\"writer.c\">#include \"writer.h\"\r\n\r\nint value;\r\nint coefficient = 1; \/\/ default is 1\r\nbool valueSet = false;\r\n\r\nvoid SetValue(int init)\r\n{\r\n\tvalue = init;\r\n\tvalueSet = true;\r\n}\r\n\r\nint GetValue(void)\r\n{\r\n\tif (valueSet)\r\n\t\treturn value;\r\n\telse\r\n\t\treturn 0;\r\n}\r\n\r\nvoid SetCoefficient(int coef)\r\n{\r\n\tcoefficient = coef;\r\n}\r\n\r\nint WriteUpdate(void)\r\n{\r\n\tif (!valueSet)\r\n\t{\r\n\t\tfprintf(stderr, \"Value not set!!\\n\");\r\n\t\treturn -1;\r\n\t}\r\n\tvalue *= coefficient;\r\n\tFILE *fp = fopen(\"out.txt\", \"a\");\r\n\tif (fp != NULL)\r\n\t{\r\n\t\tfprintf(fp, \"%d\\n\", value);\r\n\t\tfclose(fp);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfprintf(stderr, \"Opening output failed!\\n\");\r\n\t\treturn -2;\r\n\t}\r\n\treturn 0;\r\n}\r\n<\/pre>\n<p><strong>Teeki kasutav programm<\/strong><\/p>\n<p>Teegi lisamiseks koodi lisame selle p\u00e4isefaili vastavalt siis kas jutum\u00e4rkide vahel v\u00f5i noolsulgude vahel (olenevalt kuidas teek paigaldatud ja seostatud on). See aitab koodiredaktoril ja kompilaatoril arvestada teegi pakutava funktsionaalsusega.<\/p>\n<pre class=\"lang:c decode:true\" title=\"demo.c\">#include &lt;stdio.h&gt;\r\n#include \"writer.h\"\r\n\r\nint main(void)\r\n{\r\n\tint val;\r\n\tSetValue(5);\r\n\tWriteUpdate();\r\n\tWriteUpdate();\r\n\tSetCoefficient(-3);\r\n\tWriteUpdate();\r\n\tWriteUpdate();\r\n\tval = GetValue();\r\n\tprintf(\"The value is %d\\n\", val);\r\n\treturn 0;\r\n}\r\n<\/pre>\n<p>Kompileerida v\u00f5id k\u00e4surealt k\u00f5ik failid kokku kui nad on sellisel kujul nagu praegu.<\/p>\n<p>Kui teek on antud .a failina, siis vaata t\u00e4iendavat juhendit, mis oli pakutud varasemalt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J\u00e4rgnevas n\u00e4ites vaatame kuidas v\u00f5iks struktureerida enda koostatud teegifaile, mis suudavad ka infot salvestada enda sisse ilma, et seda teeks meie eest teadmist kasutav programm. M\u00e4rkused: J\u00e4rgnev on kirjeldatud ideena millest saad paralleeli v\u00f5tta ja hakata enda vajalikku teeki \u00fcles ehitama. Logimise teeki saad n\u00e4iteks Kodut\u00f6\u00f6 2 juures juba \u00e4ra kasutada. Teek, mille kokku kompileerid &hellip; <a href=\"https:\/\/blue.pri.ee\/ttu\/programmeerimine-ii\/koodinaited\/korduvkasutatava-koodi-teegi-loomine\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">Korduvkasutatava koodi (teegi) loomine<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":684,"menu_order":9,"comment_status":"closed","ping_status":"closed","template":"page-templates\/code-width-wide.php","meta":{"footnotes":""},"class_list":["post-8282","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/pages\/8282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/types\/page"}],"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=8282"}],"version-history":[{"count":0,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/pages\/8282\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/pages\/684"}],"wp:attachment":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/media?parent=8282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}