{"id":282,"date":"2015-02-06T22:24:18","date_gmt":"2015-02-06T20:24:18","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=282"},"modified":"2015-02-06T22:24:18","modified_gmt":"2015-02-06T20:24:18","slug":"gomulu-sistemler-22-gomulu-c-donguler","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=282","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 11 : D\u00f6ng\u00fcler"},"content":{"rendered":"<p>Selamlar efendim. Bug\u00fcnk\u00fc yaz\u0131m\u0131z\u0131n na\u00e7izane konusu, C dilindeki d\u00f6ng\u00fc yap\u0131lar\u0131 olacak. Kontrols\u00fcz d\u00f6n\u00fc\u015fler mide buland\u0131r\u0131r malumunuz. \u0130\u015fbu d\u00f6ng\u00fcleri nas\u0131l yapar, nas\u0131l ederiz de d\u00f6nme dolap misali zevk verir hale getiririz bunu dilin d\u00f6nd\u00fc\u011f\u00fcnce anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Nas\u0131l anlataca\u011f\u0131m? \u00d6rnekler ile efendim.<\/p>\n<p>Bir ka\u00e7 basit kural ile, olay\u0131n \u00f6z\u00fcn\u00fc aktarmaya \u00e7al\u0131\u015faca\u011f\u0131m. Meselenin asl\u0131 ortaya kondu mu, \u00e7\u00f6z\u00fcm bulmak kolay olur demi\u015fler \ud83d\ude42<\/p>\n<p><strong>D\u00f6ng\u00fclerin Sabit Limitler \u0130le S\u0131n\u0131rland\u0131r\u0131lmas\u0131<\/strong><\/p>\n<p>Efendim malumunuz, a\u011fz\u0131m\u0131zdan \u00e7\u0131kan iki kelimeden biri &#8220;s\u0131n\u0131rl\u0131&#8221; s\u00f6zc\u00fc\u011f\u00fc. G\u00f6m\u00fcl\u00fc sistemler \u015f\u00f6yle s\u0131n\u0131rl\u0131, b\u00f6yle s\u0131n\u0131rl\u0131 deyip duruyoruz. Madem her-\u015fey b\u00f6yle s\u0131n\u0131rl\u0131, sonlu s\u00fcrede bitmesini istedi\u011fimiz i\u015fler i\u00e7in de bir s\u0131n\u0131r koymam\u0131z \u015fart \ud83d\ude42<\/p>\n<p>Bir kere d\u00f6ng\u00fc dedi\u011fimiz nanenin, statik olarak \u00f6ng\u00f6r\u00fclebilir, sabit bir \u00fcst limitinin olmas\u0131nda say\u0131s\u0131z faydalar var. Bunu sadece ben demiyorum, kodunuzu hangi statik kod analiz program\u0131na verseniz, ayn\u0131s\u0131n\u0131 size o da s\u00f6yleyecek. Yaln\u0131zca onun benim kadar nezaketle s\u00f6ylemeyece\u011fini bildirmek isterim.<\/p>\n<p>Peki her d\u00f6ng\u00fc ille s\u0131n\u0131rs\u0131z m\u0131 olacak? Bir s\u0131n\u0131r konulanlar evet. Ama task tan\u0131mlamalar\u0131nda vs yap\u0131lan baz\u0131 d\u00f6ng\u00fclerin \u00f6zellikle (s\u00f6zde) sonsuz olmas\u0131 gerekir. O zaman da ben bunu bilin\u00e7li yapt\u0131m, ne yapt\u0131\u011f\u0131m\u0131n da fark\u0131nday\u0131m diye bu d\u00f6ng\u00fcn\u00fcn tepesine ecnebice;<\/p>\n<pre class=\"lang:c decode:true \">\/*@non-terminating@*\/<\/pre>\n<p>ya da kendi dilimizde;<\/p>\n<pre class=\"lang:default decode:true \">\/*@sonsuz d\u00f6ng\u00fc*\/<\/pre>\n<p>gibisinden bir\u015feyler yazmakta fayda var.<\/p>\n<p>Muhteremler, tamam peki s\u0131n\u0131rl\u0131 d\u00f6ng\u00fc olacaksa s\u0131n\u0131r olur zaten dedi\u011finizi duyuyorum. \u00d6nemli nokta bu s\u0131n\u0131r\u0131n, deterministik ve sabit bir s\u0131n\u0131r olmas\u0131. Hemen mevzuyu yine \u00f6rnekle a\u00e7\u0131klayay\u0131m.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">uint32_t index=0;\nuint32_t indexLimit=0;\nfor(index=0; index&lt;indexLimit; index++)\n{\nif(someCondition)\n{\nindexLimit +=2;\n}\n}<\/pre>\n<p>Mesela bu yukar\u0131daki d\u00f6ng\u00fc ne zaman biter? Mant\u0131ken bitmez asl\u0131nda ama, pratikte indexLimit de\u011feri ta\u015f\u0131p s\u0131f\u0131rlan\u0131p index de\u011ferine tur bindirince bir yerlerde belki biter. Bu durum olduk\u00e7a \u00e7irkin bir durumdur ve genelde yok yere hem uygulaman\u0131n kompleksitesini do\u011frusal olmayan yani tahmin edilmesi g\u00fc\u00e7 noktalara getirebilir, hem de gereksiz yere \u00e7ok\u00e7a g\u00fc\u00e7 t\u00fcketimine sebep olur. Mazallah daha fena hadiselere de sebep olabilir ama onlar\u0131 s\u00f6ylemeye dilim varm\u0131yor.<\/p>\n<p>Peki ne yapar\u0131z? Bir \u00f6nceki yaz\u0131dan kopyay\u0131 \u00e7ekiyoruz.<\/p>\n<p><em>\u0130yi \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (36)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(someCondition)\n{\nFoo() ;\n}\n}<\/pre>\n<p>Yine imdad\u0131m\u0131za define yeti\u015fti. Bizim day\u0131n\u0131n kulaklar\u0131 \u00e7\u0131nlas\u0131n. Art\u0131k d\u00f6ng\u00fcn\u00fcn, \u00e7i\u00e7ek gibi bir limiti var. Hem ne oldu\u011fu hem ne olaca\u011f\u0131 gayet anla\u015f\u0131l\u0131r. Kodu makine i\u00e7in de\u011fil insan i\u00e7in yazd\u0131\u011f\u0131m\u0131z\u0131 hat\u0131rlayacak olursak, konsepti anlatan kodlar yazman\u0131n ehemmiyetini idrak etmemiz ka\u00e7\u0131n\u0131lmaz olur.<\/p>\n<p><strong>Eri\u015filebilir D\u00f6ng\u00fc S\u0131n\u0131r\u0131<\/strong><\/p>\n<p>\u015eimdi diyelim s\u0131n\u0131r, \u00f6ng\u00f6r\u00fclebilir bir s\u0131n\u0131r. Ama arada may\u0131nl\u0131 b\u00f6lge var ula\u015fmak m\u00fcmk\u00fcn de\u011fil. B\u00f6yle s\u0131n\u0131r, ancak hasret ve h\u00fcz\u00fcn do\u011furur. D\u00f6ng\u00fcy\u00fc kontrol eden sayac\u0131n, d\u00f6ng\u00fc s\u0131n\u0131r\u0131na varabilmesi gerekir. Bazen farketmeden, eri\u015filemez d\u00f6ng\u00fc s\u0131n\u0131rlar\u0131 koyuyoruz. Bundan \u00e7ekinmek ve tiksinmek laz\u0131m.<\/p>\n<p>Misal \u00fczerinden gidelim yine ki mevzu havada kalmas\u0131n, ayakta kalmas\u0131n, yerine otursun. Diyelim d\u00f6ng\u00fcy\u00fc kontrol eden saya\u00e7 uint8_t cinsinden ve d\u00f6ng\u00fcn\u00fcn s\u0131n\u0131r\u0131 da 2000. Bu durumda akl\u0131 ba\u015f\u0131nda herkes bir durur ve der ki, aga bu nedir? Niye b\u00f6yle der? \u00c7\u00fcnk\u00fc uint8_t tipinde birisi asla ve asla 2000 de\u011ferine ula\u015famaz. \u0130stemsiz olarak yarat\u0131lm\u0131\u015f bir sonsuz d\u00f6ng\u00fcye ho\u015fgeldin diyebilirsiniz. Hatta ho\u015f geldin fasl\u0131ndan sonra \u00e7ay kahve de ikram edebilirsiniz \u00e7\u00fcnk\u00fc d\u00f6ng\u00fcden asla \u00e7\u0131k\u0131lmayaca\u011f\u0131ndan her \u015fey i\u00e7in yeterince zaman olacakt\u0131r. Tabi bu durumda d\u00f6ng\u00fcn\u00fcn d\u0131\u015f\u0131n\u0131 yani \u00f6zg\u00fcrl\u00fc\u011f\u00fc unutmak gerek. Neyse, demek ki neymi\u015f; eri\u015filemeyecek d\u00f6ng\u00fc s\u0131n\u0131r\u0131 k\u00f6t\u00fcym\u00fc\u015f.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint8_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(someCondition)\n{\nFoo() ;\n}\n}<\/pre>\n<p>\u00c7ok s\u00f6ze gerek yok. Peki iyisi nas\u0131l olur bunun? 1000&#8217;e kadar sayacaksan\u0131z ona g\u00f6re bir saya\u00e7 tipi se\u00e7mekte fayda var. uint16_t olabilir mesela ama 2 byte s\u0131k\u0131nt\u0131n\u0131z yoksa \u015fayet, ben gelecekteki de\u011fi\u015fikliklere de pay b\u0131rakmak i\u00e7in uint32_t tan\u0131mlard\u0131m.<\/p>\n<p><em>\u0130yi \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(someCondition)\n{\nFoo() ;\n}\n}<\/pre>\n<p>\u0130yi \u00f6rnekte, saya\u00e7 tipini uint32_t tan\u0131mlayarak, uzaklar\u0131 yak\u0131n ettik \ud83d\ude00 Art\u0131k d\u00f6ng\u00fcm\u00fcz ula\u015f\u0131labilir bir s\u0131n\u0131ra sahip!<\/p>\n<p><strong>D\u00f6ng\u00fcn\u00fcn Namusu<\/strong><\/p>\n<p>Biraz a\u011f\u0131r olmu\u015f olabilir ba\u015fl\u0131k ama, d\u00f6ng\u00fcn\u00fcn kodda da bir s\u0131n\u0131r\u0131 olmal\u0131.<\/p>\n<div class=\"su-box su-box-style-default\" id=\"\" style=\"border-color:#000000;border-radius:3px;\"><div class=\"su-box-title\" style=\"background-color:#333333;color:#FFFFFF;border-top-left-radius:1px;border-top-right-radius:1px\">\u00d6nemli Nokta<\/div><div class=\"su-box-content su-u-clearfix su-u-trim\" style=\"border-bottom-left-radius:1px;border-bottom-right-radius:1px\">S\u00fcsl\u00fc parantezler d\u00f6ng\u00fcn\u00fcn s\u0131n\u0131r\u0131d\u0131r. S\u0131n\u0131r namustur demi\u015fler. Bu nedenle hatalar\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in d\u00f6ng\u00fcleri de l\u00fctfen s\u0131n\u0131rs\u0131z, parantezsiz kullanmay\u0131n\u0131z. Tekrar s\u00f6yl\u00fcyorum, zaten hata \u00e7\u0131karabilecek tonla \u015fey varken, bir tane daha eklememizin hi\u00e7 gere\u011fi yok. \u00a0<\/div><\/div>\n<p>Hemen h\u0131zl\u0131ca bu hususta da k\u00f6t\u00fc \u00f6rne\u011fi ve iyi \u00f6rne\u011fi h\u0131zl\u0131ca verelim ve bekleme yapmaks\u0131z\u0131n devam edelim.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\nCheckConditions() ;\nFoo() ;<\/pre>\n<p><em>\u0130yi \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\n}<\/pre>\n<p>Demek ki neymi\u015f, s\u00fcsl\u00fc parantez yine canm\u0131\u015f cananm\u0131\u015f \ud83d\ude42<\/p>\n<p><strong>\u015eeytani S\u00f6zc\u00fck: goto<\/strong><\/p>\n<p>Arkada\u015flar bu goto belas\u0131n\u0131, d\u0131\u015f mihraklar ba\u015f\u0131m\u0131za sarm\u0131\u015ft\u0131r. S\u0131rf kodlar\u0131m\u0131z hatal\u0131 olsun, anla\u015f\u0131lmas\u0131n, geli\u015femeyelim diye \u00f6n\u00fcm\u00fcze konmu\u015f \u015feytani bir s\u00f6zc\u00fckt\u00fcr bu. Kullan\u0131lmamas\u0131n\u0131n sevpo kazand\u0131rd\u0131\u011f\u0131, say\u0131s\u0131z makale ile sabitlenmi\u015ftir. Tek s\u00f6yleyece\u011fim: yapmay\u0131n, etmeyin.<\/p>\n<p>Hi\u00e7 elim gitmiyor goto olan bir kodu yazmaya ama k\u00f6t\u00fc \u00f6rnek olarak yine yazaca\u011f\u0131m.<\/p>\n<p>K\u00f6t\u00fc \u00d6rnek:<\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\nelse\n{\ngoto OTHER_OPTION;\n}\n}\n\nOTHER_OPTION: Goo() ;<\/pre>\n<p>\u0130yi \u00d6rnek:<\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\nelse\n{\nbreak;\n}\n}<\/pre>\n<p>goto belas\u0131n\u0131 kullanmadan da, emin olun ki yapmay\u0131 istedi\u011finiz \u015feyi yapmak m\u00fcmk\u00fcn. Dolay\u0131s\u0131yla \u00e7irkinle\u015fmemek ad\u0131na, goto kullanmayal\u0131m.<\/p>\n<p><strong>Rastgele De\u011fi\u015fken Tan\u0131mlama<\/strong><\/p>\n<p>\u015eimdi bu ba\u015fl\u0131k &#8220;rastgele de\u011fi\u015fken tan\u0131mlamak&#8221; diye anla\u015f\u0131lmas\u0131n, ba\u015fl\u0131k direk yapmaman\u0131z gereken bir \u015feyi a\u00e7\u0131k\u00e7a anlatmak i\u00e7in b\u00f6yle konulmu\u015ftur. \u00d6nerimiz basit; &#8220;rastgele de\u011fi\u015fken tan\u0131mlama dostum&#8221;. Ne demek istiyoruz burada, esasen d\u00f6ng\u00fcn\u00fcn i\u00e7inde de\u011fi\u015fken tan\u0131malamas\u0131n\u0131z iyi olur demek istiyoruz.<\/p>\n<p>G\u00f6m\u00fcl\u00fc C derleyicilerinin hepsi C99 de\u011fildir. Baz\u0131s\u0131 yaln\u0131zca ANSI C&#8217;ye izin verir. Dolay\u0131s\u0131yla yazd\u0131\u011f\u0131n\u0131z kod her yerde derlensin istiyorsan\u0131z, d\u00f6ng\u00fc i\u00e7inde de\u011fi\u015fken tan\u0131mlama l\u00fcks\u00fcnden vazge\u00e7iniz.<\/p>\n<p>K\u00f6t\u00fc \u00d6rnek:<\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nfor(uint32_t index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\n}<\/pre>\n<p>\u0130yi \u00d6rnek:<\/p>\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\n}<\/pre>\n<p><strong>Yak\u0131\u015f\u0131kl\u0131 While<\/strong><\/p>\n<p>Hep for \u00fczerinden gittik. Bunlar asl\u0131nda while i\u00e7in de ge\u00e7erli. Ama while i\u00e7in de yak\u0131\u015f\u0131kl\u0131 \u00a0g\u00f6r\u00fclen bir \u015fablonu sizlerle payla\u015fmak isterim. Ama \u00f6nce artizlik belirtisi olarak yaz\u0131lan k\u00f6t\u00fc bir \u00f6rne\u011fi sizlerle payla\u015faca\u011f\u0131m.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">while(!0)\n{\n BidiBidi();\n}<\/pre>\n<p>Burada yazar, &#8220;true&#8221; yani dogru ifadesini yakalamak i\u00e7in !0 yapm\u0131\u015f. !0 ifadesi her zaman yanl\u0131\u015f\u0131n de\u011fili, yani do\u011fru olaca\u011f\u0131ndan, while burada sonsuz d\u00f6ng\u00fc olmu\u015f olur. Ancaaaaak, d\u00f6ng\u00fcn\u00fcn her bir d\u00f6n\u00fc\u015f\u00fcn\u00fcn ba\u015f\u0131nda, s\u0131f\u0131r de\u011feri 1 kere NOT i\u015flemine tabi tutulur. Bu da her d\u00f6ng\u00fcde 1 CYCLE yani 1 saat darbesi kadar i\u015f g\u00fcc\u00fcn\u00fc \u00e7\u00f6pe atmakt\u0131r. Yani bu sonsuz s\u00fcreli bir israft\u0131r. B\u00f6yle bir \u00a0hatan\u0131n tarifi olmaz dostlar, yapmay\u0131n.<\/p>\n<p><em>\u0130yi \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:default decode:true\">#define FOREVER (1)\n\n\/*@non-terminating@*\/\nwhile(FOREVER)\n{\n Bidibidi();\n}<\/pre>\n<p>\u0130yi \u00f6rnek \u00e7i\u00e7ek \u00e7i\u00e7ek. S\u00f6ylenecek s\u00f6z yok \ud83d\ude42<\/p>\n<p>Eveeet, bir program\u0131n daha sonuna geldik. Umar\u0131m s\u0131k\u0131lmadan okumu\u015fsunuzdur.<\/p>\n<p>Unutmadan; yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.<\/p>\n<p>\u015eimdi devam&#8230;<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=275\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-o-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=286\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-right\" style=\"font-size:13px;color:#FFFFFF\"><\/i> Sonraki Sayfa<\/span><\/a>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Selamlar efendim. Bug\u00fcnk\u00fc yaz\u0131m\u0131z\u0131n na\u00e7izane konusu, C dilindeki d\u00f6ng\u00fc yap\u0131lar\u0131 olacak. Kontrols\u00fcz d\u00f6n\u00fc\u015fler mide buland\u0131r\u0131r malumunuz. \u0130\u015fbu d\u00f6ng\u00fcleri nas\u0131l yapar, nas\u0131l ederiz de d\u00f6nme dolap misali zevk verir hale getiririz bunu dilin d\u00f6nd\u00fc\u011f\u00fcnce anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Nas\u0131l anlataca\u011f\u0131m? \u00d6rnekler ile efendim. Bir ka\u00e7 basit kural ile, olay\u0131n \u00f6z\u00fcn\u00fc aktarmaya \u00e7al\u0131\u015faca\u011f\u0131m. Meselenin asl\u0131 ortaya kondu mu, \u00e7\u00f6z\u00fcm <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=282\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_tr_post_content":"Selamlar efendim. Bug\u00fcnk\u00fc yaz\u0131m\u0131z\u0131n na\u00e7izane konusu, C dilindeki d\u00f6ng\u00fc yap\u0131lar\u0131 olacak. Kontrols\u00fcz d\u00f6n\u00fc\u015fler mide buland\u0131r\u0131r malumunuz. \u0130\u015fbu d\u00f6ng\u00fcleri nas\u0131l yapar, nas\u0131l ederiz de d\u00f6nme dolap misali zevk verir hale getiririz bunu dilin d\u00f6nd\u00fc\u011f\u00fcnce anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Nas\u0131l anlataca\u011f\u0131m? \u00d6rnekler ile efendim.\n\nBir ka\u00e7 basit kural ile, olay\u0131n \u00f6z\u00fcn\u00fc aktarmaya \u00e7al\u0131\u015faca\u011f\u0131m. Meselenin asl\u0131 ortaya kondu mu, \u00e7\u00f6z\u00fcm bulmak kolay olur demi\u015fler :)\n\n<strong>D\u00f6ng\u00fclerin Sabit Limitler \u0130le S\u0131n\u0131rland\u0131r\u0131lmas\u0131<\/strong>\n\nEfendim malumunuz, a\u011fz\u0131m\u0131zdan \u00e7\u0131kan iki kelimeden biri \"s\u0131n\u0131rl\u0131\" s\u00f6zc\u00fc\u011f\u00fc. G\u00f6m\u00fcl\u00fc sistemler \u015f\u00f6yle s\u0131n\u0131rl\u0131, b\u00f6yle s\u0131n\u0131rl\u0131 deyip duruyoruz. Madem her-\u015fey b\u00f6yle s\u0131n\u0131rl\u0131, sonlu s\u00fcrede bitmesini istedi\u011fimiz i\u015fler i\u00e7in de bir s\u0131n\u0131r koymam\u0131z \u015fart :)\n\nBir kere d\u00f6ng\u00fc dedi\u011fimiz nanenin, statik olarak \u00f6ng\u00f6r\u00fclebilir, sabit bir \u00fcst limitinin olmas\u0131nda say\u0131s\u0131z faydalar var. Bunu sadece ben demiyorum, kodunuzu hangi statik kod analiz program\u0131na verseniz, ayn\u0131s\u0131n\u0131 size o da s\u00f6yleyecek. Yaln\u0131zca onun benim kadar nezaketle s\u00f6ylemeyece\u011fini bildirmek isterim.\n\nPeki her d\u00f6ng\u00fc ille s\u0131n\u0131rs\u0131z m\u0131 olacak? Bir s\u0131n\u0131r konulanlar evet. Ama task tan\u0131mlamalar\u0131nda vs yap\u0131lan baz\u0131 d\u00f6ng\u00fclerin \u00f6zellikle (s\u00f6zde) sonsuz olmas\u0131 gerekir. O zaman da ben bunu bilin\u00e7li yapt\u0131m, ne yapt\u0131\u011f\u0131m\u0131n da fark\u0131nday\u0131m diye bu d\u00f6ng\u00fcn\u00fcn tepesine ecnebice;\n\n<pre class=\"lang:c decode:true \">\/*@non-terminating@*\/<\/pre>\n\nya da kendi dilimizde;\n\n<pre class=\"lang:default decode:true \">\/*@sonsuz d\u00f6ng\u00fc*\/<\/pre>\n\ngibisinden bir\u015feyler yazmakta fayda var.\n\nMuhteremler, tamam peki s\u0131n\u0131rl\u0131 d\u00f6ng\u00fc olacaksa s\u0131n\u0131r olur zaten dedi\u011finizi duyuyorum. \u00d6nemli nokta bu s\u0131n\u0131r\u0131n, deterministik ve sabit bir s\u0131n\u0131r olmas\u0131. Hemen mevzuyu yine \u00f6rnekle a\u00e7\u0131klayay\u0131m.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">uint32_t index=0;\nuint32_t indexLimit=0;\nfor(index=0; index&lt;indexLimit; index++)\n{\nif(someCondition)\n{\nindexLimit +=2;\n}\n}<\/pre>\n\nMesela bu yukar\u0131daki d\u00f6ng\u00fc ne zaman biter? Mant\u0131ken bitmez asl\u0131nda ama, pratikte indexLimit de\u011feri ta\u015f\u0131p s\u0131f\u0131rlan\u0131p index de\u011ferine tur bindirince bir yerlerde belki biter. Bu durum olduk\u00e7a \u00e7irkin bir durumdur ve genelde yok yere hem uygulaman\u0131n kompleksitesini do\u011frusal olmayan yani tahmin edilmesi g\u00fc\u00e7 noktalara getirebilir, hem de gereksiz yere \u00e7ok\u00e7a g\u00fc\u00e7 t\u00fcketimine sebep olur. Mazallah daha fena hadiselere de sebep olabilir ama onlar\u0131 s\u00f6ylemeye dilim varm\u0131yor.\n\nPeki ne yapar\u0131z? Bir \u00f6nceki yaz\u0131dan kopyay\u0131 \u00e7ekiyoruz.\n\n<em>\u0130yi \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (36)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(someCondition)\n{\nFoo() ;\n}\n}<\/pre>\n\nYine imdad\u0131m\u0131za define yeti\u015fti. Bizim day\u0131n\u0131n kulaklar\u0131 \u00e7\u0131nlas\u0131n. Art\u0131k d\u00f6ng\u00fcn\u00fcn, \u00e7i\u00e7ek gibi bir limiti var. Hem ne oldu\u011fu hem ne olaca\u011f\u0131 gayet anla\u015f\u0131l\u0131r. Kodu makine i\u00e7in de\u011fil insan i\u00e7in yazd\u0131\u011f\u0131m\u0131z\u0131 hat\u0131rlayacak olursak, konsepti anlatan kodlar yazman\u0131n ehemmiyetini idrak etmemiz ka\u00e7\u0131n\u0131lmaz olur.\n\n<strong>Eri\u015filebilir D\u00f6ng\u00fc S\u0131n\u0131r\u0131<\/strong>\n\n\u015eimdi diyelim s\u0131n\u0131r, \u00f6ng\u00f6r\u00fclebilir bir s\u0131n\u0131r. Ama arada may\u0131nl\u0131 b\u00f6lge var ula\u015fmak m\u00fcmk\u00fcn de\u011fil. B\u00f6yle s\u0131n\u0131r, ancak hasret ve h\u00fcz\u00fcn do\u011furur. D\u00f6ng\u00fcy\u00fc kontrol eden sayac\u0131n, d\u00f6ng\u00fc s\u0131n\u0131r\u0131na varabilmesi gerekir. Bazen farketmeden, eri\u015filemez d\u00f6ng\u00fc s\u0131n\u0131rlar\u0131 koyuyoruz. Bundan \u00e7ekinmek ve tiksinmek laz\u0131m.\n\nMisal \u00fczerinden gidelim yine ki mevzu havada kalmas\u0131n, ayakta kalmas\u0131n, yerine otursun. Diyelim d\u00f6ng\u00fcy\u00fc kontrol eden saya\u00e7 uint8_t cinsinden ve d\u00f6ng\u00fcn\u00fcn s\u0131n\u0131r\u0131 da 2000. Bu durumda akl\u0131 ba\u015f\u0131nda herkes bir durur ve der ki, aga bu nedir? Niye b\u00f6yle der? \u00c7\u00fcnk\u00fc uint8_t tipinde birisi asla ve asla 2000 de\u011ferine ula\u015famaz. \u0130stemsiz olarak yarat\u0131lm\u0131\u015f bir sonsuz d\u00f6ng\u00fcye ho\u015fgeldin diyebilirsiniz. Hatta ho\u015f geldin fasl\u0131ndan sonra \u00e7ay kahve de ikram edebilirsiniz \u00e7\u00fcnk\u00fc d\u00f6ng\u00fcden asla \u00e7\u0131k\u0131lmayaca\u011f\u0131ndan her \u015fey i\u00e7in yeterince zaman olacakt\u0131r. Tabi bu durumda d\u00f6ng\u00fcn\u00fcn d\u0131\u015f\u0131n\u0131 yani \u00f6zg\u00fcrl\u00fc\u011f\u00fc unutmak gerek. Neyse, demek ki neymi\u015f; eri\u015filemeyecek d\u00f6ng\u00fc s\u0131n\u0131r\u0131 k\u00f6t\u00fcym\u00fc\u015f.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint8_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(someCondition)\n{\nFoo() ;\n}\n}<\/pre>\n\n\u00c7ok s\u00f6ze gerek yok. Peki iyisi nas\u0131l olur bunun? 1000'e kadar sayacaksan\u0131z ona g\u00f6re bir saya\u00e7 tipi se\u00e7mekte fayda var. uint16_t olabilir mesela ama 2 byte s\u0131k\u0131nt\u0131n\u0131z yoksa \u015fayet, ben gelecekteki de\u011fi\u015fikliklere de pay b\u0131rakmak i\u00e7in uint32_t tan\u0131mlard\u0131m.\n\n<em>\u0130yi \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(someCondition)\n{\nFoo() ;\n}\n}<\/pre>\n\n\u0130yi \u00f6rnekte, saya\u00e7 tipini uint32_t tan\u0131mlayarak, uzaklar\u0131 yak\u0131n ettik :D Art\u0131k d\u00f6ng\u00fcm\u00fcz ula\u015f\u0131labilir bir s\u0131n\u0131ra sahip!\n\n<strong>D\u00f6ng\u00fcn\u00fcn Namusu<\/strong>\n\nBiraz a\u011f\u0131r olmu\u015f olabilir ba\u015fl\u0131k ama, d\u00f6ng\u00fcn\u00fcn kodda da bir s\u0131n\u0131r\u0131 olmal\u0131.\n\n[su_box title=\"\u00d6nemli Nokta\"]S\u00fcsl\u00fc parantezler d\u00f6ng\u00fcn\u00fcn s\u0131n\u0131r\u0131d\u0131r. S\u0131n\u0131r namustur demi\u015fler. Bu nedenle hatalar\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in d\u00f6ng\u00fcleri de l\u00fctfen s\u0131n\u0131rs\u0131z, parantezsiz kullanmay\u0131n\u0131z. Tekrar s\u00f6yl\u00fcyorum, zaten hata \u00e7\u0131karabilecek tonla \u015fey varken, bir tane daha eklememizin hi\u00e7 gere\u011fi yok. \u00a0[\/su_box]\n\nHemen h\u0131zl\u0131ca bu hususta da k\u00f6t\u00fc \u00f6rne\u011fi ve iyi \u00f6rne\u011fi h\u0131zl\u0131ca verelim ve bekleme yapmaks\u0131z\u0131n devam edelim.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\nCheckConditions() ;\nFoo() ;<\/pre>\n\n<em>\u0130yi \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\n}<\/pre>\n\nDemek ki neymi\u015f, s\u00fcsl\u00fc parantez yine canm\u0131\u015f cananm\u0131\u015f :)\n\n<strong>\u015eeytani S\u00f6zc\u00fck: goto<\/strong>\n\nArkada\u015flar bu goto belas\u0131n\u0131, d\u0131\u015f mihraklar ba\u015f\u0131m\u0131za sarm\u0131\u015ft\u0131r. S\u0131rf kodlar\u0131m\u0131z hatal\u0131 olsun, anla\u015f\u0131lmas\u0131n, geli\u015femeyelim diye \u00f6n\u00fcm\u00fcze konmu\u015f \u015feytani bir s\u00f6zc\u00fckt\u00fcr bu. Kullan\u0131lmamas\u0131n\u0131n sevpo kazand\u0131rd\u0131\u011f\u0131, say\u0131s\u0131z makale ile sabitlenmi\u015ftir. Tek s\u00f6yleyece\u011fim: yapmay\u0131n, etmeyin.\n\nHi\u00e7 elim gitmiyor goto olan bir kodu yazmaya ama k\u00f6t\u00fc \u00f6rnek olarak yine yazaca\u011f\u0131m.\n\nK\u00f6t\u00fc \u00d6rnek:\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\nelse\n{\ngoto OTHER_OPTION;\n}\n}\n\nOTHER_OPTION: Goo() ;<\/pre>\n\n\u0130yi \u00d6rnek:\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\nelse\n{\nbreak;\n}\n}<\/pre>\n\ngoto belas\u0131n\u0131 kullanmadan da, emin olun ki yapmay\u0131 istedi\u011finiz \u015feyi yapmak m\u00fcmk\u00fcn. Dolay\u0131s\u0131yla \u00e7irkinle\u015fmemek ad\u0131na, goto kullanmayal\u0131m.\n\n<strong>Rastgele De\u011fi\u015fken Tan\u0131mlama<\/strong>\n\n\u015eimdi bu ba\u015fl\u0131k \"rastgele de\u011fi\u015fken tan\u0131mlamak\" diye anla\u015f\u0131lmas\u0131n, ba\u015fl\u0131k direk yapmaman\u0131z gereken bir \u015feyi a\u00e7\u0131k\u00e7a anlatmak i\u00e7in b\u00f6yle konulmu\u015ftur. \u00d6nerimiz basit; \"rastgele de\u011fi\u015fken tan\u0131mlama dostum\". Ne demek istiyoruz burada, esasen d\u00f6ng\u00fcn\u00fcn i\u00e7inde de\u011fi\u015fken tan\u0131malamas\u0131n\u0131z iyi olur demek istiyoruz.\n\nG\u00f6m\u00fcl\u00fc C derleyicilerinin hepsi C99 de\u011fildir. Baz\u0131s\u0131 yaln\u0131zca ANSI C'ye izin verir. Dolay\u0131s\u0131yla yazd\u0131\u011f\u0131n\u0131z kod her yerde derlensin istiyorsan\u0131z, d\u00f6ng\u00fc i\u00e7inde de\u011fi\u015fken tan\u0131mlama l\u00fcks\u00fcnden vazge\u00e7iniz.\n\nK\u00f6t\u00fc \u00d6rnek:\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nfor(uint32_t index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\n}<\/pre>\n\n\u0130yi \u00d6rnek:\n\n<pre class=\"lang:c decode:true\">#define INDEX_LIMIT (1000)\nuint32_t index=0;\nfor(index=0; index&lt;INDEX_LIMIT; index++)\n{\nif(CheckConditions() )\n{\nFoo() ;\n}\n}<\/pre>\n\n<strong>Yak\u0131\u015f\u0131kl\u0131 While<\/strong>\n\nHep for \u00fczerinden gittik. Bunlar asl\u0131nda while i\u00e7in de ge\u00e7erli. Ama while i\u00e7in de yak\u0131\u015f\u0131kl\u0131 \u00a0g\u00f6r\u00fclen bir \u015fablonu sizlerle payla\u015fmak isterim. Ama \u00f6nce artizlik belirtisi olarak yaz\u0131lan k\u00f6t\u00fc bir \u00f6rne\u011fi sizlerle payla\u015faca\u011f\u0131m.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">while(!0)\n{\n BidiBidi();\n}<\/pre>\n\nBurada yazar, \"true\" yani dogru ifadesini yakalamak i\u00e7in !0 yapm\u0131\u015f. !0 ifadesi her zaman yanl\u0131\u015f\u0131n de\u011fili, yani do\u011fru olaca\u011f\u0131ndan, while burada sonsuz d\u00f6ng\u00fc olmu\u015f olur. Ancaaaaak, d\u00f6ng\u00fcn\u00fcn her bir d\u00f6n\u00fc\u015f\u00fcn\u00fcn ba\u015f\u0131nda, s\u0131f\u0131r de\u011feri 1 kere NOT i\u015flemine tabi tutulur. Bu da her d\u00f6ng\u00fcde 1 CYCLE yani 1 saat darbesi kadar i\u015f g\u00fcc\u00fcn\u00fc \u00e7\u00f6pe atmakt\u0131r. Yani bu sonsuz s\u00fcreli bir israft\u0131r. B\u00f6yle bir \u00a0hatan\u0131n tarifi olmaz dostlar, yapmay\u0131n.\n\n<em>\u0130yi \u00d6rnek:<\/em>\n\n<pre class=\"lang:default decode:true\">#define FOREVER (1)\n\n\/*@non-terminating@*\/\nwhile(FOREVER)\n{\n Bidibidi();\n}<\/pre>\n\n\u0130yi \u00f6rnek \u00e7i\u00e7ek \u00e7i\u00e7ek. S\u00f6ylenecek s\u00f6z yok :)\n\nEveeet, bir program\u0131n daha sonuna geldik. Umar\u0131m s\u0131k\u0131lmadan okumu\u015fsunuzdur.\n\nUnutmadan; yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.\n\n\u015eimdi devam...\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=275\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=286\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]\n\n&nbsp;","_tr_post_name":"gomulu-sistemler-22-gomulu-c-donguler","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 11 : D\u00f6ng\u00fcler","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"tr","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[2,3],"tags":[],"class_list":["post-282","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-4y","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=282"}],"version-history":[{"count":0,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/282\/revisions"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}