{"id":186,"date":"2014-11-15T00:13:29","date_gmt":"2014-11-14T22:13:29","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=186"},"modified":"2014-11-15T00:13:29","modified_gmt":"2014-11-14T22:13:29","slug":"gomulu-sistemler-14-gomulu-c-veri-tipleri-ve-degiskenler","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=186","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 3 : Veri Tipleri, De\u011fi\u015fkenler ve \u0130simlendirme"},"content":{"rendered":"<div class=\"su-quote su-quote-style-default su-quote-has-cite\"><div class=\"su-quote-inner su-u-clearfix su-u-trim\">Any fool can write code that a computer can understand. Good programmers write code that humans can understand.<span class=\"su-quote-cite\">Martin Fowler<\/span><\/div><\/div>\n<p>G\u00f6m\u00fcl\u00fc sistemler yaz\u0131 dizisinin g\u00fczide yaz\u0131lar\u0131ndan bir olan &#8220;Merhaba D\u00fcnya&#8221; yaz\u0131s\u0131ndan sonra geldik art\u0131k veri tipleri ve de\u011fi\u015fkenlere. Tekrara d\u00fc\u015fmek manas\u0131z oldu\u011fundan s\u00fcrekli s\u00f6ylemek istemesem de, bu yaz\u0131 da bilinenlere referans vererek \u00f6nemli ba\u015fka konular\u0131 i\u00e7erecek. Yani <a href=\"http:\/\/www.tutorialspoint.com\/cprogramming\/c_data_types.htm\">herhangi bir\u00a0tutorial<\/a>&#8216;deki gibi bir bilgi seti beklemeyiniz \ud83d\ude42<\/p>\n<p>\u015eimdi malumunuz genelde bir program, bir problemi \u00e7\u00f6zmek i\u00e7in yaz\u0131l\u0131r. Problem demi\u015fken mevzu ille de negatif olacak diye bir \u015fey yok tabi. Sadizmi de bir kenara koyuyorum. Anlatmak istedi\u011fim \u015fu ki her program\u0131n bir amac\u0131 var. Bu ama\u00e7 belli nedenlerle tetiklenir ki buna da problem diyelim. Her program, problemi farkl\u0131 bak\u0131\u015f a\u00e7\u0131lar\u0131yla modeller. C bunu yap\u0131sal bak\u0131\u015f a\u00e7\u0131s\u0131yla modellemeye uygundur, C++ nesne y\u00f6nelimli modellemeye uygundur, SequenceL misal fonksiyonel modellemeye uygundur<a href=\"http:\/\/en.wikipedia.org\/wiki\/List_of_programming_languages_by_type#Functional_languages\"> falan filan<\/a>.<\/p>\n<p>Bu demek de\u011fil ki, C ile nesne y\u00f6nelimli modelleme yapamay\u0131z, C++ ile yap\u0131sal modelleme yapamay\u0131z. Yapar\u0131z de bazen lezzetli olmaz.\u00a0Bazen de \u00e7i\u00e7ek gibi olur; evine, i\u015f yerine koy seyret.<\/p>\n<p>Neyse konuya d\u00f6necek olursak her program mant\u0131ken bir problemi ama \u00f6yle ama b\u00f6yle modeller. \u0130\u015f o ki, programlama yapan adam bu modellemeyi <a href=\"http:\/\/www.iso.org\/iso\/home\/store\/catalogue_tc\/catalogue_detail.htm?csnumber=64764\">kaliteli <\/a>yaps\u0131n. Gel gelelim bu i\u015f, hakikaten zor i\u015f. Niye? \u00c7\u00fcnk\u00fc \u00e7ok fazla parametreyi d\u00fc\u015f\u00fcnmek gerekiyor ve bu parametrelerden baz\u0131lar\u0131 birbirleriyle \u00e7at\u0131\u015f\u0131yor. Misal kodu daha efektif yapmak \u00e7o\u011fu zaman anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 azalt\u0131r. Ta\u015f\u0131nabilirli\u011fi art\u0131rmak i\u00e7in kodun boyutu artar falan fi\u015fman. Madem bu kadar \u00e7ok parametre var, nas\u0131l state of art yaz\u0131l\u0131m yapaca\u011f\u0131z? Hem de g\u00f6m\u00fcl\u00fc yaz\u0131l\u0131m? Cevab\u0131 k\u0131saca \u015fu: g\u00fczel pratikleri takip ederek ve trade-off&#8217;lar\u0131n (bir \u015feyi kazanmak i\u00e7in bir \u015feylerden fedakarl\u0131k etmeyi gerektiren durumlar\u0131n)\u00a0FARKINDA\u00a0olarak.<\/p>\n<p>S\u00f6z\u00fcn k\u0131sas\u0131 yaz\u0131n\u0131n bu k\u0131sm\u0131nda, g\u00fczel pratiklerin bir nevi besmelesi anlat\u0131lacak. Hemen her problemin modellenmesinde de\u011fi\u015fkenler kullan\u0131l\u0131r. De\u011fi\u015fkenleri do\u011fru kullanmak ve do\u011fru isimlendirmek, anla\u015f\u0131l\u0131rl\u0131\u011fa \u00e7ok b\u00fcy\u00fck katk\u0131 sa\u011fl\u0131yor. Pek bir \u015feye de zarar vermiyor. Yani de\u011fi\u015fkenleri do\u011fru kullan\u0131p, do\u011fru adland\u0131rd\u0131\u011f\u0131m\u0131zda hi\u00e7 bir \u015fey kaybetmeden baya\u011f\u0131 bir k\u00e2ra ge\u00e7iyoruz. Bolca sevap kazan\u0131yoruz \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<p>C dili i\u00e7in genelde \u015f\u00f6yle bir tablo yap\u0131l\u0131r:<\/p>\n<div class=\"su-table su-table-alternate\">\n<table class=\"src\">\n<tbody>\n<tr>\n<th>Tip<\/th>\n<th>Boyut(in\u015f cnm yha)<\/th>\n<th>De\u011fer aral\u0131\u011f\u0131(in\u015f cnm yha)<\/th>\n<\/tr>\n<tr>\n<td>char<\/td>\n<td>1 byte<\/td>\n<td>-128 to 127 or 0 to 255<\/td>\n<\/tr>\n<tr>\n<td>unsigned char<\/td>\n<td>1 byte<\/td>\n<td>0 to 255<\/td>\n<\/tr>\n<tr>\n<td>signed char<\/td>\n<td>1 byte<\/td>\n<td>-128 to 127<\/td>\n<\/tr>\n<tr>\n<td>int<\/td>\n<td>2 ya da 4 byte<\/td>\n<td>-32,768 to 32,767 or -2,147,483,648 to 2,147,483,647<\/td>\n<\/tr>\n<tr>\n<td>unsigned int<\/td>\n<td>2 ya da 4 byte<\/td>\n<td>0 to 65,535 or 0 to 4,294,967,295<\/td>\n<\/tr>\n<tr>\n<td>short<\/td>\n<td>2 byte<\/td>\n<td>-32,768 to 32,767<\/td>\n<\/tr>\n<tr>\n<td>unsigned short<\/td>\n<td>2 byte<\/td>\n<td>0 to 65,535<\/td>\n<\/tr>\n<tr>\n<td>long<\/td>\n<td>4 byte<\/td>\n<td>-2,147,483,648 to 2,147,483,647<\/td>\n<\/tr>\n<tr>\n<td>unsigned long<\/td>\n<td>4 byte<\/td>\n<td>0 to 4,294,967,295<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Yukar\u0131daki tablo \u015ferdir, g\u00fcvenilmezdir, kemdir. Zaten boyut k\u0131sm\u0131nda in\u015f cnm yazmaktad\u0131r.<\/p>\n<p>Bu g\u00f6rm\u00fc\u015f oldu\u011funuz tipler C dilinin temel tipleri malumunuz. \u015eimdi size bir \u00f6nerim olacak. Bu veri tiplerini g\u00f6m\u00fcl\u00fc sistemlerde ASLA KULLANMAYIN. Akl\u0131n\u0131zdan iki soru ge\u00e7ti hemen&#8230; Birincisi &#8220;niye?&#8221;, ikincisi &#8220;ne kullancaz o zaman?&#8221;. \u0130kisine de nedenleriyle cevap vermeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<span class=\"su-dropcap su-dropcap-style-default\" style=\"font-size:1.5em\">Niye?<\/span>\n<p>\u00c7\u00fcnk\u00fc standard veri tiplerinin boyutu platform ba\u011f\u0131ml\u0131d\u0131r. Ne demek istiyorum? \u00d6rne\u011fin X mikrokontrol\u00f6r\u00fcnde int veri tipi 2 byte iken, Y mikrokontrol\u00f6r\u00fcnde int veri tipi 4 byte olabilir. Yine Z mikrokontrol\u00f6r\u00fcnde int veri tipi 8 byte olabilir ve e\u015f\u015fe\u011fin kula\u011f\u0131na su ka\u00e7\u0131rabilir. \u00d6rne\u011fin sizin bilgisayarlar\u0131n\u0131zda muhtemelen int 8 byte olacakt\u0131r. Bunun sebebi i\u015flemcinin adres yolunun geni\u015fli\u011finin platformdan platforma farkl\u0131 olabilmesidir. Bu kavram &#8220;void*&#8221; veri tipinde daha detayl\u0131 anlat\u0131lacakt\u0131r. Ancak \u015fu s\u00f6ylenebilir ki 32-bit&#8217;lik platformlarda int veri tipi 32 bit yer kaplar ki bu da malumunuz 4 byte&#8217;a tekab\u00fcl eder. Benzer \u015fekilde 64 bitlik sistemlerde int 8 byte yer kaplar. Tabi bunlar, normalde olmas\u0131 gereken durumdur, derleyici; Ali Cengiz oyunlar\u0131 ile burada ba\u015fka i\u015fler yapabilir. S\u00f6z\u00fcn k\u0131sas\u0131 \u00f6l\u00e7meden veri tiplerinin boyutunu bilemezsniz. Bu sebeple int, long, short gibi de\u011fi\u015fkenler &#8220;platform safe (platform-\u00fcl emin)&#8221; de\u011fildir. Peki efendim nas\u0131l \u00f6l\u00e7\u00fccez?<\/p>\n<p>Ahanda b\u00f6yle:<\/p>\n<pre class=\"lang:default decode:true\">#include &lt;stdio.h&gt;\n\nint main()\n{\n   printf(\"int degiskeninin boyu: %d n\", sizeof(int));\n\/* program i\u015fini bitirince \u00e7\u0131kar gider. \u00e7\u0131kmas\u0131n dursun istersen a\u015fa\u011f\u0131daki sat\u0131r\u0131 uncomment yap*\/\n\/\/while(1); \n   return 0;\n}<\/pre>\n<p>\u0130sterseniz kodu <a href=\"http:\/\/www.compileonline.com\/compile_c_online.php\">BURADAN <\/a>da derleyip \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<p>Neyse derdimizi anlatt\u0131k. Bu arada bir de\u011fi\u015fkenin limitlerini bilmiyorsan\u0131z yard\u0131mc\u0131 k\u00fct\u00fcpanelerle onlara da ula\u015fabilirsiniz. Misal float i\u00e7in \u015f\u00f6yle i\u015fler de yap\u0131labilir:<\/p>\n<pre class=\"lang:default decode:true\">#include &lt;stdio.h&gt;\n#include &lt;float.h&gt;\n\nint main()\n{\n   printf(\"float'in boyu : %d n\", sizeof(float));\n   printf(\"Minimum degeri: %En\", FLT_MIN );\n   printf(\"Maximum degeri: %En\", FLT_MAX );\n   printf(\"Cozunurlugu: %dn\", FLT_DIG );\n   \n   return 0;\n}<\/pre>\n<p>G\u00f6m\u00fcl\u00fc sistemlerde, belle\u011fin bilin\u00e7li \u015fekilde kullan\u0131labilmesi \u00e7ok \u00f6nemlidir. Program\u0131n bellek kullan\u0131m\u0131n\u0131n platformdan platforma de\u011fi\u015fmemesi ise, bir \u00e7ok hatan\u0131n \u00f6n\u00fcne ge\u00e7memizi sa\u011flar. \u00d6rne\u011fin iki adet g\u00f6m\u00fcl\u00fc sistemin haberle\u015fti\u011fini d\u00fc\u015f\u00fcn\u00fcn. Birinde(X) int 32 bit olsun di\u011ferinde(Y) ise 64 bit olsun. X&#8217;den Y&#8217;ye olan haberle\u015fmede ayn\u0131 kodlar\u0131 kullanmak istedi\u011fimizde Y&#8217;de daha az de\u011fer okumaya ba\u015flar\u0131z. Ayn\u0131 say\u0131da de\u011fer okumaya kalkarsak da yanl\u0131\u015f de\u011fer okuruz. Keza X&#8217;de bir struct&#8217;\u0131 oldu\u011fu gibi sd carda yazarsak, ve Y&#8217;de o sd card\u0131 ayn\u0131 struct ile okumaya kalkarsak, e\u011fer struct; int, float gibi platform safe olmayan de\u011fi\u015fkenler i\u00e7erirse verileri yanl\u0131\u015f okuruz. Misal a\u015fa\u011f\u0131daki struct&#8217;\u0131n ka\u00e7 byte yer kaplayaca\u011f\u0131n\u0131 soral\u0131m:<\/p>\n<pre class=\"lang:c decode:true \">typedef struct _ts_BulBakalimBoyumu\n{\nshort sBirGaripDegisken;\nint iDegiskeninKrali;\nfloat fDegiskeninDikAlasi;\ndouble dDegiskeninSonNoktasi;\nlong lUzunBirDegisken;\n}ts_BulBakalimBoyumu;<\/pre>\n<p>Ka\u00e7 byte kaplar? Cevap a\u015fa\u011f\u0131da&#8230;<\/p>\n<div class=\"su-spoiler su-spoiler-style-default su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>\u00d6NEML\u0130 B\u0130LG\u0130<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">Platformdan platforma ka\u00e7 byte kaplayaca\u011f\u0131 de\u011fi\u015fir. Ama misal 2+4+4+8+8 = 26 Byte kaplamas\u0131 \u015fa\u015f\u0131rtmazd\u0131. Yine de platform bilinmiyorsa net bit \u015fey s\u00f6ylenemez.<\/div><\/div>\n<p>Bu gibi bir \u00e7ok sebeple, \u00f6ntan\u0131ml\u0131 veri tiplerini g\u00f6m\u00fcl\u00fc sistemlerde kullanmamaya gayret etmekte fayda var. Ama tabi yeri gelir, ne yapt\u0131\u011f\u0131m\u0131z\u0131 bilerek, bedelini g\u00f6ze alarak ve sisteme zarar vermesini \u00f6nleyerek kullanabiliriz.<\/p>\n<p>Neyse&#8230; Niye sorusunun cevab\u0131n\u0131 verdik gibi. \u015eimdi di\u011fer soruya ge\u00e7elim \ud83d\ude42<\/p>\n<span class=\"su-dropcap su-dropcap-style-default\" style=\"font-size:1.5em\">Nas\u0131l?<\/span>\n<p>Ne kullanaca\u011f\u0131z \u00f6yleyse? Bu sorunun cevab\u0131n\u0131 i\u00e7 d\u00fcnyam\u0131zda aramayaca\u011f\u0131z. Cevap C&#8217;nin standard k\u00fct\u00fcphanelerinden birinde gizli. Anl\u0131 \u015fanl\u0131 <em><strong>&#8220;stdint.h&#8221; <\/strong><\/em>!!! Evet bu m\u00fcbarek k\u00fct\u00fcphane, bir \u00e7ok problemi tarihin tozlu sayfalar\u0131na g\u00f6m\u00fcyor.<\/p>\n<p>Cengaver gibi stdint tablosuna hemen bir g\u00f6z atal\u0131m.<\/p>\n<div class=\"su-table su-table-alternate\">\n<table class=\"wikitable\">\n<tbody>\n<tr>\n<th>Degisken<\/th>\n<th>\u0130\u015fareti<\/th>\n<th>Bits<\/th>\n<th>Bytes<\/th>\n<th>Minimum\u00a0De\u011fer<\/th>\n<th>Maksimum\u00a0De\u011fer<\/th>\n<\/tr>\n<tr>\n<td><span style=\"font-family: monospace\">int8_t<\/span><\/td>\n<td>Signed<\/td>\n<td>8<\/td>\n<td>1<\/td>\n<td>\u22122<sup>7<\/sup>\u00a0= \u2212128<\/td>\n<td>2<sup>7<\/sup> \u2212 1 =\u00a0127<\/td>\n<\/tr>\n<tr>\n<td>uint8_t<\/td>\n<td>Unsigned<\/td>\n<td>8<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>2<sup>8<\/sup> \u2212 1 =\u00a0255<\/td>\n<\/tr>\n<tr>\n<td>int16_t<\/td>\n<td>Signed<\/td>\n<td>16<\/td>\n<td>2<\/td>\n<td>\u22122<sup>15<\/sup>\u00a0= \u221232,768<\/td>\n<td>2<sup>15<\/sup> \u2212 1 =\u00a032,767<\/td>\n<\/tr>\n<tr>\n<td>uint16_t<\/td>\n<td>Unsigned<\/td>\n<td>16<\/td>\n<td>2<\/td>\n<td>0<\/td>\n<td>2<sup>16<\/sup> \u2212 1 =\u00a065,535<\/td>\n<\/tr>\n<tr>\n<td>int32_t<\/td>\n<td>Signed<\/td>\n<td>32<\/td>\n<td>4<\/td>\n<td>\u22122<sup>31<\/sup>\u00a0= \u22122,147,483,648<\/td>\n<td>2<sup>31<\/sup> \u2212 1 =\u00a02,147,483,647<\/td>\n<\/tr>\n<tr>\n<td>uint32_t<\/td>\n<td>Unsigned<\/td>\n<td>32<\/td>\n<td>4<\/td>\n<td>0<\/td>\n<td>2<sup>32<\/sup> \u2212 1 =\u00a04,294,967,295<\/td>\n<\/tr>\n<tr>\n<td>int64_t<\/td>\n<td>Signed<\/td>\n<td>64<\/td>\n<td>8<\/td>\n<td>\u22122<sup>63<\/sup>\u00a0= \u22129,223,372,036,854,775,808<\/td>\n<td>2<sup>63<\/sup> \u2212 1 =\u00a09,223,372,036,854,775,807<\/td>\n<\/tr>\n<tr>\n<td>uint64_t<\/td>\n<td>Unsigned<\/td>\n<td>64<\/td>\n<td>8<\/td>\n<td>0<\/td>\n<td>2<sup>64<\/sup> \u2212 1 =\u00a018,446,744,073,709,551,615<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>\u00d6nceki tabloda, yani int,char gibi \u00f6ntan\u0131ml\u0131 tiplerin yer ald\u0131\u011f\u0131 tabloda, boyut k\u0131sm\u0131nda &#8220;in\u015f cnm&#8221; vard\u0131. S\u0131k\u0131yorsa burada da olsun&#8230; Olmaz \u00e7\u00fcnk\u00fc bu de\u011fi\u015fkenlerin hepsinin boyutu SAB\u0130T. Hangi platforma giderseniz gidin, uint32_t, i\u015faretsiz olan 32 bitlik bir de\u011fi\u015fkendir. \u0130\u015fte bu! Yani biz bu de\u011fi\u015fkenleri kullanarak bir yaz\u0131l\u0131m ortaya koydu\u011fumuzda, yar\u0131n \u00f6b\u00fcr g\u00fcn o kodu ba\u015fka platforma ta\u015f\u0131sak da yaz\u0131l\u0131m\u0131m\u0131z\u0131n bellek kullan\u0131m\u0131 ayn\u0131 olacak. Buna ne denir? \u00c7i\u00e7ek \u00e7i\u00e7ek&#8230;<\/p>\n<div class=\"su-spoiler su-spoiler-style-default su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>\u00d6NEML\u0130 B\u0130LG\u0130<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">G\u00f6m\u00fcl\u00fc yaz\u0131l\u0131mlarda, yaln\u0131zca stdint k\u00fct\u00fcphanesinden de\u011fi\u015fkenleri kullanmak bir nevi sevapt\u0131r.<\/div><\/div>\n<p>O \u00e7ok sevilen char bile, platformdan platforma i\u015faret de\u011fi\u015ftirebilmekte. Velhas\u0131lkelam bunlar\u0131n hi\u00e7 birine g\u00fcven olmaz. \u0130yisi mi stdint kullan\u0131n. Hi\u00e7 zarar\u0131 yok desem yeridir, ama say\u0131s\u0131z faideleri mevcuttur.<\/p>\n<p>Bununla birlikte, ikinci sorumuzu da yan\u0131tlad\u0131k.\u00a0\u015eimdi geldik de\u011fi\u015fkenlere.<\/p>\n<p>DE\u011e\u0130\u015eKENLER<\/p>\n<p>\u015eimdi de\u011fi\u015fken dedi\u011fimiz nane, bellek adreslerinin g\u00fczelce etiketlenmesinden ba\u015fka bir \u015fey de\u011fildir. Misal int i=32 diye bir de\u011fi\u015fken yarat&#8230;. \u015eeytana uymay\u0131n int filan yok \ud83d\ude42 Ba\u015ftan alal\u0131m. Misal \u015f\u00f6yle bir de\u011fi\u015fken yaratal\u0131m.<\/p>\n<pre class=\"lang:c decode:true\">uint32_t u32MaxConnectionCnt=1988;<\/pre>\n<p>Derleyici biz bu de\u011fi\u015fkeni yaratt\u0131\u011f\u0131m\u0131zda ne yapar? Gider ram&#8217;e \u015funu der: &#8220;Abi m\u00fcsaitse ben bi 4 byte yer alay\u0131m i\u00e7ine de arkada\u015flar bi zahmet 1988=0x000007c4 yazs\u0131nlar.&#8221; Bunu duyan ram cevap verir &#8220;Abi bakal\u0131m varsa itin olsun.&#8221; Bunu asl\u0131nda ram&#8217;im kendisi de\u011fil de y\u00f6neticisi (i\u015fletim sistemi, vs) s\u00f6yler. Ve neticesinde at\u0131yorum 0x10208032 adresine sizin 1988 say\u0131s\u0131 4 byte olarak yerle\u015fir. <a href=\"http:\/\/en.wikipedia.org\/wiki\/Endianness\">Big endian veya little endian<\/a> olmas\u0131na g\u00f6re verinin\u00a0belle\u011fe yerle\u015fim s\u0131ras\u0131 de\u011fi\u015febilir. de\u011fi\u015fken uint32_t yerine int32_t olsa yine ayn\u0131 muhabbet olacakt\u0131 \ud83d\ude42 Ama int16_t olsa idi veri 0x07C4 olarak belle\u011fe yerle\u015fecekti. Neyse.<\/p>\n<p>Bu de\u011fi\u015fkenin de\u011fi\u015fmeyen \u00e7e\u015fidi de var ilgin\u00e7tir. Misal a\u015fa\u011f\u0131daki de\u011fi\u015fken, de\u011fi\u015fmeyen bir de\u011fi\u015fkendir ve de\u011feri derleme a\u015famas\u0131nda bir kez belirlenir ve o de\u011fi\u015fkenin de\u011feri bir daha asla de\u011fi\u015fmez.<\/p>\n<pre class=\"lang:default decode:true\">const uint32_t cu32MaxConnectionCnt=1988;<\/pre>\n<p>De\u011fi\u015fkenin ba\u015f\u0131na const koydu\u011fumuz zaman derleyiciye deriz ki, bak bilader bu de\u011fi\u015fkenin de\u011feri asla de\u011fi\u015fmeyecek. Dolay\u0131s\u0131yla sen bunu z\u0131rt p\u0131rt de\u011fi\u015fmeyecek bir bellekte saklayabilirsin. Derleyici de gider o de\u011fi\u015fkeni ram&#8217;e de\u011fil flash&#8217;a ya da hard diske ya da genel ad\u0131yla NVM&#8217;ye(non-volatile memory) koyar. Hmm demek ki de\u011fi\u015fken demekle asl\u0131nda bellekteki bir veri gurubunu etiketlemekten s\u00f6z ediyoruz. Nitekim belle\u011fin adresinden ziyade de\u011fi\u015fkenin ismini ak\u0131lda tutmak daha kolay \ud83d\ude42<\/p>\n<p>Peki karde\u015fim bu de\u011fi\u015fkenin de\u011feri de\u011fi\u015feni var de\u011fi\u015fmeyeni var. Yeri de\u011fi\u015fmeyeni istersek ne yapaca\u011f\u0131z biz? O zaman da de\u011fi\u015fkene durdu\u011fun yerde dur diyece\u011fiz. Nas\u0131l m\u0131? B\u00f6yle:<\/p>\n<pre class=\"lang:default decode:true\">static uint32_t cu32MaxConnectionCnt=1988;<\/pre>\n<p>\u015eimdi gelelim ba\u015fka bir mevzuya. Peki ya bizim de\u011fi\u015fkenimiz \u00f6yle ans\u0131z\u0131n de\u011fi\u015febilmeliyse? Ram&#8217;e eri\u015fmek g\u00f6rece \u00e7ok h\u0131zl\u0131 olsa da sonu\u00e7ta i\u015flemcinin d\u0131\u015f\u0131ndaki bir bellekten s\u00f6z ediyoruz ve haberle\u015fme i\u00e7in bir miktar zaman\u0131 pa\u015fa pa\u015fa kaybediyoruz. \u00d6yle bir imkan olsa ki \u00e7ok acil durumlar i\u00e7in daha h\u0131zl\u0131 bir \u00e7\u00f6z\u00fcm olsa. Var efendim, i\u015flemcinin register&#8217;lar\u0131 var. Biz derleyiciye \u015funu diyebiliriz. &#8220;Abicim e\u011fer yer varsa l\u00fctfen bi zahmet bunu i\u015flemcinin register&#8217;inda sakla. Yoksa da optimize filan etme kolayda tut laz\u0131m olunca hemen \u00e7ekelim.&#8221; Derdinizi anlatmay\u0131 bilirseniz derleyici dile\u011finizi yerine getirir. Bunun i\u00e7in ona \u015funu yazmal\u0131s\u0131n\u0131z:<\/p>\n<pre class=\"lang:default decode:true\">volatile uint32_t cu32MaxConnectionCnt=1988;<\/pre>\n<p>Bunlar\u0131 kar\u0131\u015ft\u0131rmak m\u00fcmk\u00fcn. Misal static const dedi\u011finizde iki iste\u011finiz ayn\u0131 anda ger\u00e7ekle\u015ftirilir. Ancaak birbiriyle \u00e7at\u0131\u015fan istekler ayn\u0131 anda kullan\u0131lamaz. Mesela const volatile diyemezsiniz \ud83d\ude42 \u0130\u015fin temel mant\u0131\u011f\u0131 budur. Bunu bildikten sonra bu operasyonlar\u0131n felsefi yorumlar\u0131n\u0131 yapmak hakikaten zor de\u011fil. Misal static olan bir de\u011fi\u015fkenin yeri bellekte de\u011fi\u015fmedi\u011finden, o de\u011fi\u015fken son de\u011ferini her zaman korur. B\u00fct\u00fcn C tutorial&#8217;larnda static de\u011fi\u015fkenin fonksiyon i\u00e7inde yaln\u0131zca bir kez initialize edildi\u011fini herkes anlat\u0131r. \u0130\u015fte onun alt\u0131na yatan nedeni de burda buldunuz. Art\u0131k ayn\u0131 mant\u0131kla hepsini yorumlamak m\u00fcmk\u00fcn \ud83d\ude42 Misal \u015fu bilgi de her yerde var; bir c dosyas\u0131nda global olara tan\u0131mlanm\u0131\u015f statik bir de\u011fi\u015fken yaln\u0131z o dosyada kullan\u0131labilir. Neden? \u00c7\u00fcnk\u00fc derleyici her \u00a0dosyay\u0131 bir obje olarak derler. Sonra da objeler linker day\u0131 taraf\u0131ndan birle\u015ftirilir. Bir objede bir de\u011fi\u015fkenin yeri sabit tutuluyorsa o bellek alan\u0131, sinemada rezerve edilen koltu\u011fa benzer. Ba\u015fkas\u0131na satmazlar \ud83d\ude42 Neyse i\u015fte bu bilgi setiyle t\u00fcm bu yorumlar\u0131 yapmak m\u00fcmk\u00fcn.<\/p>\n<p>Bir de extern \u00f6n eki var ama kendisini hi\u00e7 mi hi\u00e7 sevmem. Kullan\u0131m\u0131 bence k\u00f6t\u00fc mimarinin habercisidir. Uzaklardaki, ba\u015fka dosyalardaki de\u011fi\u015fkene eri\u015fmek i\u00e7in de, fonksiyona eri\u015fmek i\u00e7in de header dosyas\u0131 kullan\u0131m\u0131 daha mant\u0131kl\u0131d\u0131r. Zaman\u0131 gelince ona da daha detayl\u0131 de\u011finece\u011fim.<\/p>\n<p>Bizim yazd\u0131\u011f\u0131m\u0131z kod derlendi\u011finde kodun i\u015fletilecek olan k\u0131sm\u0131 ile, de\u011feri sabit olan de\u011fi\u015fkenler flash&#8217;a at\u0131l\u0131r. De\u011fi\u015fecek de\u011fi\u015fkenler, fonksiyon stack&#8217;leri ise ram&#8217;de tutulur. Burda dikkat edilmesi gereken konu fonksiyonun kendisinin genelde flash&#8217;ta tutuldu\u011fudur. Ama fonksiyon arg\u00fcmanlar\u0131 filan ram&#8217;den kopyalanabilir. Neticede fonksiyon da bellek i\u00e7indeki bir veri. C dilinde fonksiyonlar dahil olmak \u00fczere her \u015fey de\u011fi\u015fken \u00e7e\u015fidirir demek esasen m\u00fcmk\u00fcn. Fonksiyon farkl\u0131 olarak i\u015fletilebiliyor. Yani bellek i\u00e7indeki veri, i\u015flemci i\u00e7in anlaml\u0131 bir operasyon koduna (opcode&#8217;a) tekab\u00fcl ediyor. Ama sonu\u00e7ta de\u011fi\u015fken mi? Pa\u015fa pa\u015fa de\u011fi\u015fken \ud83d\ude42 Sadece daha pahal\u0131 bir de\u011fi\u015fken \ud83d\ude42 O zaman benzer kurallar fonksiyonlar i\u00e7in de ge\u00e7erli \ud83d\ude09<\/p>\n<p>Neyse bu k\u0131sm\u0131 da \u00e7e\u015fitli ibretlerle atlatt\u0131k. Gelelim bir di\u011fer \u00f6nemli k\u0131s\u0131ma. \u0130simlendirme&#8230;.<\/p>\n<p>Sen bellekten yer ay\u0131rm\u0131\u015fs\u0131n, ad\u0131n\u0131 d\u00fczg\u00fcn koymad\u0131ktan sonra neye yarar? Bir programda e\u011fer, devreye ba\u011fl\u0131 olan LED&#8217;in a\u00e7\u0131k m\u0131 kapal\u0131 m\u0131 oldu\u011funu anlatan de\u011fi\u015fkenin ad\u0131 fiveVFlag ise \u00fch\u00fc\u00fc\u00fc\u00fc yand\u0131 onu okuyan, yand\u0131 onu geli\u015ftirmeye \u00e7al\u0131\u015fan&#8230; Ama as\u0131l onun ad\u0131n\u0131 \u00a0fiveVFlag koyan yand\u0131 \u00e7\u00fcnk\u00fc kulaklar\u0131 \u00e7ok \u00e7\u0131nlar. isCommErrorLedOn koysan de\u011fi\u015fkenin ad\u0131n\u0131 eline mi yap\u0131\u015f\u0131r. Bu yaz\u0131n\u0131n ba\u015f\u0131nda bir me\u015fhur s\u00f6z payla\u015fm\u0131\u015ft\u0131m. Day\u0131 ne g\u00fczel demi\u015f&#8230; Kodu \u00f6yle yazmak laz\u0131m ki, insan anlas\u0131n insan&#8230; Kodu okuyan kimse, kodlama yapan ki\u015finin niyetini \u00e7ok a\u00e7\u0131k \u015fekilde anlamal\u0131d\u0131r. Ancak anlamal\u0131d\u0131r derken, anlamas\u0131n\u0131 sa\u011flama sorumlulu\u011fu kodu yazandad\u0131r. Hatta sorumluluk \u00f6ylesine kodu yazandad\u0131r ki, okuyan\u0131n i\u015fini kolayla\u015ft\u0131ran hemen her \u015feyi d\u00fc\u015f\u00fcnmek zorundad\u0131r kodu yazan. \u00a0Ayn\u0131 zamanda kod self-documenting olmal\u0131d\u0131r yani d\u00f6k\u00fcmana gerek kalmaks\u0131z\u0131n i\u015flevini a\u00e7\u0131k\u00e7a anlatabilmelidir. Kod, konuyla alakas\u0131 olmayan biri taraf\u0131ndan bile anla\u015f\u0131labilmelidir. Sadece ba\u015fkas\u0131 i\u00e7in d\u00fc\u015f\u00fcnmeyin, yazd\u0131\u011f\u0131n\u0131z koda 2 sene sonra bakman\u0131z gerekirse siz de tam olarak s\u0131f\u0131rdan ba\u015flayacaks\u0131n\u0131z. Her zaman bunun korkusu ile ve bilinci ile kod yazmakta say\u0131s\u0131z faideler var. \u015eimdi bunlar\u0131 biraz somutla\u015ft\u0131ral\u0131m.<\/p>\n<p><strong>Macar Notasyonu<\/strong><\/p>\n<p>Macar notasyonu (Hungarian Notation) der ki de\u011fi\u015fkenin ismini \u00f6yle g\u00fczel yaz ki hem derdini anlats\u0131n hem de tipini. \u0130yi demi\u015f ne g\u00fczel demi\u015f ama Macar Notasyonu bile \u00e7o\u011fu ki\u015fi taraf\u0131ndan farkl\u0131 farkl\u0131 yorumlanm\u0131\u015f, temeli ayn\u0131 kalmak kayd\u0131yla farkl\u0131 estetiklerle uygulanm\u0131\u015ft\u0131r. \u0130nternette aratt\u0131\u011f\u0131n\u0131zda Macar notasyonu ile ilgili \u00e7ok farkl\u0131 \u00f6rneklere rastlayacaks\u0131n\u0131z. Ama dedi\u011fim gibi amac\u0131 hep ayn\u0131d\u0131r, tip bilgisini vermek ve a\u00e7\u0131klay\u0131c\u0131 olmak. Misal:<\/p>\n<pre class=\"lang:default decode:true\">int8_t* strIpAddressV4;<\/pre>\n<p>Buna ra\u011fmen notasyon se\u00e7imde tecr\u00fcbeler der ki, \u00e7al\u0131\u015f\u0131lan platform \u00e7ok \u00e7ok \u00f6nemlidir. Mesela \u00e7al\u0131\u015fma ortam\u0131 Visual Studio olacaksa, ve hep \u00f6yle kalacaksa tip bilgisini de\u011fi\u015fken ismine g\u00f6mmek ahmak\u00e7ad\u0131r. \u00c7\u00fcnk\u00fc kodu yazan ki\u015fi de\u011fi\u015fkeni \u00e7a\u011f\u0131r\u0131rken tipi zaten hintBox&#8217;da otomatik g\u00f6r\u00fcnmektedir. Keza o de\u011fi\u015fkeni ba\u015fka bir de\u011fi\u015fkene atayacakken de\u011fi\u015fkenin ad\u0131n\u0131 yazmaya ba\u015flad\u0131\u011f\u0131nda de\u011fi\u015fkenin tipi zaten hintBox&#8217;da \u00e7\u0131kmaktad\u0131r. O zaman ne gere\u011fi var? Bir de de\u011fi\u015fkenin tipini de\u011fi\u015fkenin ba\u015f\u0131na koymak auto code completition (otomatik kod tamamlama) olan geli\u015ftirme ortamlar\u0131nda sorun yaratacakt\u0131r. \u00c7\u00fcnk\u00fc siz ip adresini kullanmak istedi\u011finizde onun string olmas\u0131ndan daha \u00e7ok ip adresi olmas\u0131yla ilgilenece\u011finizden de\u011fi\u015fkeni yazmaya ipAddress diye ba\u015flayacaks\u0131n\u0131z. E\u011fer ortam\u0131n\u0131z VisualStudio ise yine y\u0131rtt\u0131n\u0131z ama Eclipse&#8217;in bu g\u00fcnk\u00fc bir versiyonu ise yand\u0131n\u0131z \u00e7\u00fcnk\u00fc de\u011fi\u015fken ipAddress ile de\u011fil de str ile ba\u015flad\u0131\u011f\u0131 i\u00e7in auto code completition yap\u0131lamayacak de\u011fi\u015fken bulunamayacakt\u0131r. Ama Keil uVision gibi ta\u015f gibi, ama ta\u015f devrinden kalm\u0131\u015f izlenimi veren d\u00fcmd\u00fcz ama delikanl\u0131 bir IDE ile \u00e7al\u0131\u015f\u0131yorsan\u0131z tip bilgisini de\u011fi\u015fkene ekleseniz\u00a0iyi edersiniz \ud83d\ude42<\/p>\n<p>Benim isimlendirme stilimi bu yaz\u0131 dizisi boyunca yeterince tan\u0131yaca\u011f\u0131n\u0131zdan \u015fimdi detayl\u0131ca anlatm\u0131yorum \ud83d\ude42 Siz de kendinizinkini olu\u015fturmakta \u00f6zg\u00fcrs\u00fcn\u00fcz, ya da bir standard\u0131 kullanabilirsiniz [ki belki daha iyi bir se\u00e7im olabilir, tart\u0131\u015f\u0131l\u0131r] ama her durumda kafan\u0131zdakini Blale anlat\u0131rcas\u0131na a\u00e7\u0131k\u00e7a koda aktarmakla y\u00fck\u00fcml\u00fcs\u00fcn\u00fcz.<\/p>\n<p>Efendim de\u011fi\u015fken derken ben fonksiyonlar\u0131 da ay\u0131rmad\u0131\u011f\u0131m\u0131 s\u00f6ylemi\u015ftim. Fonksiyon, as\u0131l i\u015fi yapacak olan yaz\u0131l\u0131m blo\u011fu oldu\u011fundan \u00e7ok do\u011fru isimlendirilmeli, \u00e7ok do\u011fru yarat\u0131lmal\u0131d\u0131r. \u00c7o\u011fu zaman fonksiyon isimleri, hatal\u0131 kodlar\u0131 ele vermektedir. Nas\u0131l ki yaz\u0131lan de\u011fi\u015fken neyi temsil etti\u011fini a\u00e7\u0131k\u00e7a anlatmal\u0131 ise, fonksiyon da yapaca\u011f\u0131 i\u015fi a\u00e7\u0131k\u00e7a anlatmal\u0131d\u0131r. Ayn\u0131 zamanda her fonksiyon yaln\u0131zca ama yaln\u0131zca bir i\u015fi yapmal\u0131d\u0131r. Bunu ilerde fonksiyonlar k\u0131sm\u0131nda daha detayl\u0131 anlataca\u011f\u0131m ama misal \u015fu fonksiyonun mesela isminde hay\u0131r olmad\u0131\u011f\u0131ndan kendinin de hay\u0131rl\u0131 bir i\u015f yapmad\u0131\u011f\u0131 a\u00e7\u0131kt\u0131r:<\/p>\n<pre class=\"lang:default decode:true\">void ikiDegiskeniToplaVeSeriPortaYaz(uint32_t a, uint32_t b)\n{\nuint32_t c= a+b;\n\nUART5.RESET = 1;\nUART5.DREG = c&gt;&gt;24; \nUART5.TX = 1;\n\nUART5.RESET=1;\nUATRT5.DREG=c&gt;&gt;16;\nUART5.TX = 1;\n\nUART5.RESET=1;\nUART5.DREG=c&gt;&gt;8;\nUART5.TX =1;\n\nUART5.RESET=1;\nUART5.DREG=c;\nUART5.TX=1;\n}<\/pre>\n<p>Arkada\u015f bir kere bu fonksiyonun ad\u0131 o kadar sa\u00e7ma ki, C dilini ve bu hayali mikrodenetleyiciyi bilen hemen her kes bu kodun iki say\u0131y\u0131 toplay\u0131p seri porta yazd\u0131\u011f\u0131n\u0131 g\u00f6rebilir. \u0130yi de niye yazd\u0131? Fonksiyonun ad\u0131n\u0131n bunu anlatmas\u0131 gerekir. Ki yaz\u0131m\u0131 da \u00e7ok k\u00f6t\u00fc zaten ya neyse. Hadi biraz d\u00fczeltelim madem.<\/p>\n<pre class=\"lang:default decode:true\">typedef union\n{\n   uint32_t u32Veri;\n   uint8_t  au8Veri[4];\n}tu_VeriPaketi32Bit;\n\nvoid bilgisayaraByteGonder(uint8_t u8Veri)\n{\n UART5.RESET=1;\n UART5.DREG=u8Veri;\n UART5.TX = 1;\n}\n\nuint32_t hasilatiHesaplaTL(uint16_t u16BazUcretTL, uint16_t u16KomisyonUcretiTL)\n{\n    return (u16BazUcretTL+u16KomisyonUcretiTL);\n}\n\nvoid hasilatiGonder(uint32_t u32HasilatTL)\n{\n tu_VeriPaketi32Bit UHasilat.u32Veri=u32HasilatTL;\n for(uint8_t i=0;i&lt;sizeof(tu_VeriPaketi32Bit); i++)\n {\n    bilgisayaraByteGonder(UHasilat.au8Veri[i]);\n }\n}\n\n<\/pre>\n<p>Art\u0131k her fonksiyon ad\u0131na yana\u015f\u0131r \u015fekilde bir i\u015f yap\u0131yor ve kodun iki say\u0131y\u0131 toplay\u0131p seri porttan yollamakla hangi problemi \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fc anlayabiliyoruz. Ayr\u0131ca belli ki auto code completition olmayan bir yerde kodu yazm\u0131\u015f\u0131z. Bir di\u011fer \u00f6nemli nokta ise kodun dili. Kodun yar\u0131s\u0131 \u0130ngilizce yar\u0131s\u0131 T\u00fcrk\u00e7e olmamal\u0131. Hangisini se\u00e7tiyseniz ona sad\u0131k kal\u0131n. Normalde C dilinin anahtar s\u00f6zc\u00fckleri \u0130ngilizce oldu\u011fundan ben tamam\u0131n\u0131 \u0130ngilizce yazmay\u0131 tercih ediyorum. Ancak \u0130ngilizce bilmeyen arkada\u015flar da anlatmak istedi\u011fim \u015feyi anlayabilsin diye bu defa T\u00fcrk\u00e7e yazd\u0131m. Union k\u0131sm\u0131n\u0131 anlamad\u0131ysan\u0131z \u015fimdi ona \u00e7ok tak\u0131lmay\u0131n. \u0130bret al\u0131nacak ba\u015fka noktalara bakal\u0131m. \u0130lk fonksiyonun ad\u0131n\u0131n ne kadar ama\u00e7s\u0131z oldu\u011fu konusunda anla\u015ft\u0131\u011f\u0131m\u0131z\u0131 san\u0131yorum. Bir di\u011fer hata da isminden de anla\u015f\u0131ld\u0131\u011f\u0131 \u00fczere iki i\u015fi birden yapmaya \u00e7al\u0131\u015fmas\u0131. \u0130\u015fte bu tekrar kullan\u0131labilirli\u011fi \u00f6ld\u00fcr\u00fcyor. \u00dcstteki koddaki adam seri porta ba\u015fka bir \u015fey yazmak istedi\u011finde kod tekrar\u0131 yapacak ve birinde hata yaparsa belki hatay\u0131 bulamayacak. Alttaki kodda ise bilgisayaraByteGonder fonksiyonu \u00e7i\u00e7ek gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan \u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131 her yerde hataya mahal vermeksizin \u00e7al\u0131\u015fmaya devam edecek. Ayr\u0131yeten bilgisayara bilgi g\u00f6nderecek her fonksiyon onu tekrar tekrar kullanabilecek. Bu nedenle fonksiyon isminde and, or, if filan var ise bilin ki o fonksiyon \u00e7ok \u00e7irkin bir fonksiyondur. Ayr\u0131ca isimlendirme, dilin anlatamad\u0131\u011f\u0131n\u0131 anlatmay\u0131 hedeflemelidir. De\u011fi\u015fkenin ad\u0131n\u0131 uzun yazmakta bir sak\u0131nca yoktur. Derleyici zaten derleyince onu adrese d\u00f6n\u00fc\u015ft\u00fcrecektir. Bir harfle isimlendirilen de\u011fi\u015fken de, uzunca ismi olan de\u011fi\u015fken de tipi ayn\u0131 oldu\u011fu takdirde ayn\u0131 miktarda yer kaplayacakt\u0131r.<\/p>\n<p>G\u00fczel kodlama pratikleri \u00fczerinde ileriki konularda da konu\u015faca\u011f\u0131z. \u015eimdilik g\u00f6r\u00fc\u015fmek \u00fczere \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=172\" 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=198\" 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","protected":false},"excerpt":{"rendered":"<p>G\u00f6m\u00fcl\u00fc sistemler yaz\u0131 dizisinin g\u00fczide yaz\u0131lar\u0131ndan bir olan &#8220;Merhaba D\u00fcnya&#8221; yaz\u0131s\u0131ndan sonra geldik art\u0131k veri tipleri ve de\u011fi\u015fkenlere. Tekrara d\u00fc\u015fmek manas\u0131z oldu\u011fundan s\u00fcrekli s\u00f6ylemek istemesem de, bu yaz\u0131 da bilinenlere referans vererek \u00f6nemli ba\u015fka konular\u0131 i\u00e7erecek. Yani herhangi bir\u00a0tutorial&#8216;deki gibi bir bilgi seti beklemeyiniz \ud83d\ude42 \u015eimdi malumunuz genelde bir program, bir problemi \u00e7\u00f6zmek i\u00e7in yaz\u0131l\u0131r. <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=186\">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":"[su_quote cite=\"Martin Fowler\"]Any fool can write code that a computer can understand. Good programmers write code that humans can understand.[\/su_quote]\n\nG\u00f6m\u00fcl\u00fc sistemler yaz\u0131 dizisinin g\u00fczide yaz\u0131lar\u0131ndan bir olan \"Merhaba D\u00fcnya\" yaz\u0131s\u0131ndan sonra geldik art\u0131k veri tipleri ve de\u011fi\u015fkenlere. Tekrara d\u00fc\u015fmek manas\u0131z oldu\u011fundan s\u00fcrekli s\u00f6ylemek istemesem de, bu yaz\u0131 da bilinenlere referans vererek \u00f6nemli ba\u015fka konular\u0131 i\u00e7erecek. Yani <a href=\"http:\/\/www.tutorialspoint.com\/cprogramming\/c_data_types.htm\">herhangi bir\u00a0tutorial<\/a>'deki gibi bir bilgi seti beklemeyiniz :)\n\n\u015eimdi malumunuz genelde bir program, bir problemi \u00e7\u00f6zmek i\u00e7in yaz\u0131l\u0131r. Problem demi\u015fken mevzu ille de negatif olacak diye bir \u015fey yok tabi. Sadizmi de bir kenara koyuyorum. Anlatmak istedi\u011fim \u015fu ki her program\u0131n bir amac\u0131 var. Bu ama\u00e7 belli nedenlerle tetiklenir ki buna da problem diyelim. Her program, problemi farkl\u0131 bak\u0131\u015f a\u00e7\u0131lar\u0131yla modeller. C bunu yap\u0131sal bak\u0131\u015f a\u00e7\u0131s\u0131yla modellemeye uygundur, C++ nesne y\u00f6nelimli modellemeye uygundur, SequenceL misal fonksiyonel modellemeye uygundur<a href=\"http:\/\/en.wikipedia.org\/wiki\/List_of_programming_languages_by_type#Functional_languages\"> falan filan<\/a>.\n\nBu demek de\u011fil ki, C ile nesne y\u00f6nelimli modelleme yapamay\u0131z, C++ ile yap\u0131sal modelleme yapamay\u0131z. Yapar\u0131z de bazen lezzetli olmaz.\u00a0Bazen de \u00e7i\u00e7ek gibi olur; evine, i\u015f yerine koy seyret.\n\nNeyse konuya d\u00f6necek olursak her program mant\u0131ken bir problemi ama \u00f6yle ama b\u00f6yle modeller. \u0130\u015f o ki, programlama yapan adam bu modellemeyi <a href=\"http:\/\/www.iso.org\/iso\/home\/store\/catalogue_tc\/catalogue_detail.htm?csnumber=64764\">kaliteli <\/a>yaps\u0131n. Gel gelelim bu i\u015f, hakikaten zor i\u015f. Niye? \u00c7\u00fcnk\u00fc \u00e7ok fazla parametreyi d\u00fc\u015f\u00fcnmek gerekiyor ve bu parametrelerden baz\u0131lar\u0131 birbirleriyle \u00e7at\u0131\u015f\u0131yor. Misal kodu daha efektif yapmak \u00e7o\u011fu zaman anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 azalt\u0131r. Ta\u015f\u0131nabilirli\u011fi art\u0131rmak i\u00e7in kodun boyutu artar falan fi\u015fman. Madem bu kadar \u00e7ok parametre var, nas\u0131l state of art yaz\u0131l\u0131m yapaca\u011f\u0131z? Hem de g\u00f6m\u00fcl\u00fc yaz\u0131l\u0131m? Cevab\u0131 k\u0131saca \u015fu: g\u00fczel pratikleri takip ederek ve trade-off'lar\u0131n (bir \u015feyi kazanmak i\u00e7in bir \u015feylerden fedakarl\u0131k etmeyi gerektiren durumlar\u0131n)\u00a0FARKINDA\u00a0olarak.\n\nS\u00f6z\u00fcn k\u0131sas\u0131 yaz\u0131n\u0131n bu k\u0131sm\u0131nda, g\u00fczel pratiklerin bir nevi besmelesi anlat\u0131lacak. Hemen her problemin modellenmesinde de\u011fi\u015fkenler kullan\u0131l\u0131r. De\u011fi\u015fkenleri do\u011fru kullanmak ve do\u011fru isimlendirmek, anla\u015f\u0131l\u0131rl\u0131\u011fa \u00e7ok b\u00fcy\u00fck katk\u0131 sa\u011fl\u0131yor. Pek bir \u015feye de zarar vermiyor. Yani de\u011fi\u015fkenleri do\u011fru kullan\u0131p, do\u011fru adland\u0131rd\u0131\u011f\u0131m\u0131zda hi\u00e7 bir \u015fey kaybetmeden baya\u011f\u0131 bir k\u00e2ra ge\u00e7iyoruz. Bolca sevap kazan\u0131yoruz :)\n\n&nbsp;\n\nC dili i\u00e7in genelde \u015f\u00f6yle bir tablo yap\u0131l\u0131r:\n\n[su_table]\n<table class=\"src\">\n<tbody>\n<tr>\n<th>Tip<\/th>\n<th>Boyut(in\u015f cnm yha)<\/th>\n<th>De\u011fer aral\u0131\u011f\u0131(in\u015f cnm yha)<\/th>\n<\/tr>\n<tr>\n<td>char<\/td>\n<td>1 byte<\/td>\n<td>-128 to 127 or 0 to 255<\/td>\n<\/tr>\n<tr>\n<td>unsigned char<\/td>\n<td>1 byte<\/td>\n<td>0 to 255<\/td>\n<\/tr>\n<tr>\n<td>signed char<\/td>\n<td>1 byte<\/td>\n<td>-128 to 127<\/td>\n<\/tr>\n<tr>\n<td>int<\/td>\n<td>2 ya da 4 byte<\/td>\n<td>-32,768 to 32,767 or -2,147,483,648 to 2,147,483,647<\/td>\n<\/tr>\n<tr>\n<td>unsigned int<\/td>\n<td>2 ya da 4 byte<\/td>\n<td>0 to 65,535 or 0 to 4,294,967,295<\/td>\n<\/tr>\n<tr>\n<td>short<\/td>\n<td>2 byte<\/td>\n<td>-32,768 to 32,767<\/td>\n<\/tr>\n<tr>\n<td>unsigned short<\/td>\n<td>2 byte<\/td>\n<td>0 to 65,535<\/td>\n<\/tr>\n<tr>\n<td>long<\/td>\n<td>4 byte<\/td>\n<td>-2,147,483,648 to 2,147,483,647<\/td>\n<\/tr>\n<tr>\n<td>unsigned long<\/td>\n<td>4 byte<\/td>\n<td>0 to 4,294,967,295<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n[\/su_table]\n\nYukar\u0131daki tablo \u015ferdir, g\u00fcvenilmezdir, kemdir. Zaten boyut k\u0131sm\u0131nda in\u015f cnm yazmaktad\u0131r.\n\nBu g\u00f6rm\u00fc\u015f oldu\u011funuz tipler C dilinin temel tipleri malumunuz. \u015eimdi size bir \u00f6nerim olacak. Bu veri tiplerini g\u00f6m\u00fcl\u00fc sistemlerde ASLA KULLANMAYIN. Akl\u0131n\u0131zdan iki soru ge\u00e7ti hemen... Birincisi \"niye?\", ikincisi \"ne kullancaz o zaman?\". \u0130kisine de nedenleriyle cevap vermeye \u00e7al\u0131\u015faca\u011f\u0131m.\n\n[su_dropcap]Niye?[\/su_dropcap]\n\n\u00c7\u00fcnk\u00fc standard veri tiplerinin boyutu platform ba\u011f\u0131ml\u0131d\u0131r. Ne demek istiyorum? \u00d6rne\u011fin X mikrokontrol\u00f6r\u00fcnde int veri tipi 2 byte iken, Y mikrokontrol\u00f6r\u00fcnde int veri tipi 4 byte olabilir. Yine Z mikrokontrol\u00f6r\u00fcnde int veri tipi 8 byte olabilir ve e\u015f\u015fe\u011fin kula\u011f\u0131na su ka\u00e7\u0131rabilir. \u00d6rne\u011fin sizin bilgisayarlar\u0131n\u0131zda muhtemelen int 8 byte olacakt\u0131r. Bunun sebebi i\u015flemcinin adres yolunun geni\u015fli\u011finin platformdan platforma farkl\u0131 olabilmesidir. Bu kavram \"void*\" veri tipinde daha detayl\u0131 anlat\u0131lacakt\u0131r. Ancak \u015fu s\u00f6ylenebilir ki 32-bit'lik platformlarda int veri tipi 32 bit yer kaplar ki bu da malumunuz 4 byte'a tekab\u00fcl eder. Benzer \u015fekilde 64 bitlik sistemlerde int 8 byte yer kaplar. Tabi bunlar, normalde olmas\u0131 gereken durumdur, derleyici; Ali Cengiz oyunlar\u0131 ile burada ba\u015fka i\u015fler yapabilir. S\u00f6z\u00fcn k\u0131sas\u0131 \u00f6l\u00e7meden veri tiplerinin boyutunu bilemezsniz. Bu sebeple int, long, short gibi de\u011fi\u015fkenler \"platform safe (platform-\u00fcl emin)\" de\u011fildir. Peki efendim nas\u0131l \u00f6l\u00e7\u00fccez?\n\nAhanda b\u00f6yle:\n\n<pre class=\"lang:default decode:true\">#include &lt;stdio.h&gt;\n\nint main()\n{\n   printf(\"int degiskeninin boyu: %d n\", sizeof(int));\n\/* program i\u015fini bitirince \u00e7\u0131kar gider. \u00e7\u0131kmas\u0131n dursun istersen a\u015fa\u011f\u0131daki sat\u0131r\u0131 uncomment yap*\/\n\/\/while(1); \n   return 0;\n}<\/pre>\n\n\u0130sterseniz kodu <a href=\"http:\/\/www.compileonline.com\/compile_c_online.php\">BURADAN <\/a>da derleyip \u00e7al\u0131\u015ft\u0131rabilirsiniz.\n\nNeyse derdimizi anlatt\u0131k. Bu arada bir de\u011fi\u015fkenin limitlerini bilmiyorsan\u0131z yard\u0131mc\u0131 k\u00fct\u00fcpanelerle onlara da ula\u015fabilirsiniz. Misal float i\u00e7in \u015f\u00f6yle i\u015fler de yap\u0131labilir:\n\n<pre class=\"lang:default decode:true\">#include &lt;stdio.h&gt;\n#include &lt;float.h&gt;\n\nint main()\n{\n   printf(\"float'in boyu : %d n\", sizeof(float));\n   printf(\"Minimum degeri: %En\", FLT_MIN );\n   printf(\"Maximum degeri: %En\", FLT_MAX );\n   printf(\"Cozunurlugu: %dn\", FLT_DIG );\n   \n   return 0;\n}<\/pre>\n\nG\u00f6m\u00fcl\u00fc sistemlerde, belle\u011fin bilin\u00e7li \u015fekilde kullan\u0131labilmesi \u00e7ok \u00f6nemlidir. Program\u0131n bellek kullan\u0131m\u0131n\u0131n platformdan platforma de\u011fi\u015fmemesi ise, bir \u00e7ok hatan\u0131n \u00f6n\u00fcne ge\u00e7memizi sa\u011flar. \u00d6rne\u011fin iki adet g\u00f6m\u00fcl\u00fc sistemin haberle\u015fti\u011fini d\u00fc\u015f\u00fcn\u00fcn. Birinde(X) int 32 bit olsun di\u011ferinde(Y) ise 64 bit olsun. X'den Y'ye olan haberle\u015fmede ayn\u0131 kodlar\u0131 kullanmak istedi\u011fimizde Y'de daha az de\u011fer okumaya ba\u015flar\u0131z. Ayn\u0131 say\u0131da de\u011fer okumaya kalkarsak da yanl\u0131\u015f de\u011fer okuruz. Keza X'de bir struct'\u0131 oldu\u011fu gibi sd carda yazarsak, ve Y'de o sd card\u0131 ayn\u0131 struct ile okumaya kalkarsak, e\u011fer struct; int, float gibi platform safe olmayan de\u011fi\u015fkenler i\u00e7erirse verileri yanl\u0131\u015f okuruz. Misal a\u015fa\u011f\u0131daki struct'\u0131n ka\u00e7 byte yer kaplayaca\u011f\u0131n\u0131 soral\u0131m:\n\n<pre class=\"lang:c decode:true \">typedef struct _ts_BulBakalimBoyumu\n{\nshort sBirGaripDegisken;\nint iDegiskeninKrali;\nfloat fDegiskeninDikAlasi;\ndouble dDegiskeninSonNoktasi;\nlong lUzunBirDegisken;\n}ts_BulBakalimBoyumu;<\/pre>\n\nKa\u00e7 byte kaplar? Cevap a\u015fa\u011f\u0131da...\n\n[su_spoiler title=\"\u00d6NEML\u0130 B\u0130LG\u0130\"]Platformdan platforma ka\u00e7 byte kaplayaca\u011f\u0131 de\u011fi\u015fir. Ama misal 2+4+4+8+8 = 26 Byte kaplamas\u0131 \u015fa\u015f\u0131rtmazd\u0131. Yine de platform bilinmiyorsa net bit \u015fey s\u00f6ylenemez.[\/su_spoiler]\n\nBu gibi bir \u00e7ok sebeple, \u00f6ntan\u0131ml\u0131 veri tiplerini g\u00f6m\u00fcl\u00fc sistemlerde kullanmamaya gayret etmekte fayda var. Ama tabi yeri gelir, ne yapt\u0131\u011f\u0131m\u0131z\u0131 bilerek, bedelini g\u00f6ze alarak ve sisteme zarar vermesini \u00f6nleyerek kullanabiliriz.\n\nNeyse... Niye sorusunun cevab\u0131n\u0131 verdik gibi. \u015eimdi di\u011fer soruya ge\u00e7elim :)\n\n[su_dropcap]Nas\u0131l?[\/su_dropcap]\n\nNe kullanaca\u011f\u0131z \u00f6yleyse? Bu sorunun cevab\u0131n\u0131 i\u00e7 d\u00fcnyam\u0131zda aramayaca\u011f\u0131z. Cevap C'nin standard k\u00fct\u00fcphanelerinden birinde gizli. Anl\u0131 \u015fanl\u0131 <em><strong>\"stdint.h\" <\/strong><\/em>!!! Evet bu m\u00fcbarek k\u00fct\u00fcphane, bir \u00e7ok problemi tarihin tozlu sayfalar\u0131na g\u00f6m\u00fcyor.\n\nCengaver gibi stdint tablosuna hemen bir g\u00f6z atal\u0131m.\n\n[su_table]\n<table class=\"wikitable\">\n<tbody>\n<tr>\n<th>Degisken<\/th>\n<th>\u0130\u015fareti<\/th>\n<th>Bits<\/th>\n<th>Bytes<\/th>\n<th>Minimum\u00a0De\u011fer<\/th>\n<th>Maksimum\u00a0De\u011fer<\/th>\n<\/tr>\n<tr>\n<td><span style=\"font-family: monospace;\">int8_t<\/span><\/td>\n<td>Signed<\/td>\n<td>8<\/td>\n<td>1<\/td>\n<td>\u22122<sup>7<\/sup>\u00a0= \u2212128<\/td>\n<td>2<sup>7<\/sup> \u2212 1 =\u00a0127<\/td>\n<\/tr>\n<tr>\n<td>uint8_t<\/td>\n<td>Unsigned<\/td>\n<td>8<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>2<sup>8<\/sup> \u2212 1 =\u00a0255<\/td>\n<\/tr>\n<tr>\n<td>int16_t<\/td>\n<td>Signed<\/td>\n<td>16<\/td>\n<td>2<\/td>\n<td>\u22122<sup>15<\/sup>\u00a0= \u221232,768<\/td>\n<td>2<sup>15<\/sup> \u2212 1 =\u00a032,767<\/td>\n<\/tr>\n<tr>\n<td>uint16_t<\/td>\n<td>Unsigned<\/td>\n<td>16<\/td>\n<td>2<\/td>\n<td>0<\/td>\n<td>2<sup>16<\/sup> \u2212 1 =\u00a065,535<\/td>\n<\/tr>\n<tr>\n<td>int32_t<\/td>\n<td>Signed<\/td>\n<td>32<\/td>\n<td>4<\/td>\n<td>\u22122<sup>31<\/sup>\u00a0= \u22122,147,483,648<\/td>\n<td>2<sup>31<\/sup> \u2212 1 =\u00a02,147,483,647<\/td>\n<\/tr>\n<tr>\n<td>uint32_t<\/td>\n<td>Unsigned<\/td>\n<td>32<\/td>\n<td>4<\/td>\n<td>0<\/td>\n<td>2<sup>32<\/sup> \u2212 1 =\u00a04,294,967,295<\/td>\n<\/tr>\n<tr>\n<td>int64_t<\/td>\n<td>Signed<\/td>\n<td>64<\/td>\n<td>8<\/td>\n<td>\u22122<sup>63<\/sup>\u00a0= \u22129,223,372,036,854,775,808<\/td>\n<td>2<sup>63<\/sup> \u2212 1 =\u00a09,223,372,036,854,775,807<\/td>\n<\/tr>\n<tr>\n<td>uint64_t<\/td>\n<td>Unsigned<\/td>\n<td>64<\/td>\n<td>8<\/td>\n<td>0<\/td>\n<td>2<sup>64<\/sup> \u2212 1 =\u00a018,446,744,073,709,551,615<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n[\/su_table]\n\n\u00d6nceki tabloda, yani int,char gibi \u00f6ntan\u0131ml\u0131 tiplerin yer ald\u0131\u011f\u0131 tabloda, boyut k\u0131sm\u0131nda \"in\u015f cnm\" vard\u0131. S\u0131k\u0131yorsa burada da olsun... Olmaz \u00e7\u00fcnk\u00fc bu de\u011fi\u015fkenlerin hepsinin boyutu SAB\u0130T. Hangi platforma giderseniz gidin, uint32_t, i\u015faretsiz olan 32 bitlik bir de\u011fi\u015fkendir. \u0130\u015fte bu! Yani biz bu de\u011fi\u015fkenleri kullanarak bir yaz\u0131l\u0131m ortaya koydu\u011fumuzda, yar\u0131n \u00f6b\u00fcr g\u00fcn o kodu ba\u015fka platforma ta\u015f\u0131sak da yaz\u0131l\u0131m\u0131m\u0131z\u0131n bellek kullan\u0131m\u0131 ayn\u0131 olacak. Buna ne denir? \u00c7i\u00e7ek \u00e7i\u00e7ek...\n\n[su_spoiler title=\"\u00d6NEML\u0130 B\u0130LG\u0130\"]G\u00f6m\u00fcl\u00fc yaz\u0131l\u0131mlarda, yaln\u0131zca stdint k\u00fct\u00fcphanesinden de\u011fi\u015fkenleri kullanmak bir nevi sevapt\u0131r.[\/su_spoiler]\n\nO \u00e7ok sevilen char bile, platformdan platforma i\u015faret de\u011fi\u015ftirebilmekte. Velhas\u0131lkelam bunlar\u0131n hi\u00e7 birine g\u00fcven olmaz. \u0130yisi mi stdint kullan\u0131n. Hi\u00e7 zarar\u0131 yok desem yeridir, ama say\u0131s\u0131z faideleri mevcuttur.\n\nBununla birlikte, ikinci sorumuzu da yan\u0131tlad\u0131k.\u00a0\u015eimdi geldik de\u011fi\u015fkenlere.\n\nDE\u011e\u0130\u015eKENLER\n\n\u015eimdi de\u011fi\u015fken dedi\u011fimiz nane, bellek adreslerinin g\u00fczelce etiketlenmesinden ba\u015fka bir \u015fey de\u011fildir. Misal int i=32 diye bir de\u011fi\u015fken yarat.... \u015eeytana uymay\u0131n int filan yok :) Ba\u015ftan alal\u0131m. Misal \u015f\u00f6yle bir de\u011fi\u015fken yaratal\u0131m.\n\n<pre class=\"lang:c decode:true\">uint32_t u32MaxConnectionCnt=1988;<\/pre>\n\nDerleyici biz bu de\u011fi\u015fkeni yaratt\u0131\u011f\u0131m\u0131zda ne yapar? Gider ram'e \u015funu der: \"Abi m\u00fcsaitse ben bi 4 byte yer alay\u0131m i\u00e7ine de arkada\u015flar bi zahmet 1988=0x000007c4 yazs\u0131nlar.\" Bunu duyan ram cevap verir \"Abi bakal\u0131m varsa itin olsun.\" Bunu asl\u0131nda ram'im kendisi de\u011fil de y\u00f6neticisi (i\u015fletim sistemi, vs) s\u00f6yler. Ve neticesinde at\u0131yorum 0x10208032 adresine sizin 1988 say\u0131s\u0131 4 byte olarak yerle\u015fir. <a href=\"http:\/\/en.wikipedia.org\/wiki\/Endianness\">Big endian veya little endian<\/a> olmas\u0131na g\u00f6re verinin\u00a0belle\u011fe yerle\u015fim s\u0131ras\u0131 de\u011fi\u015febilir. de\u011fi\u015fken uint32_t yerine int32_t olsa yine ayn\u0131 muhabbet olacakt\u0131 :) Ama int16_t olsa idi veri 0x07C4 olarak belle\u011fe yerle\u015fecekti. Neyse.\n\nBu de\u011fi\u015fkenin de\u011fi\u015fmeyen \u00e7e\u015fidi de var ilgin\u00e7tir. Misal a\u015fa\u011f\u0131daki de\u011fi\u015fken, de\u011fi\u015fmeyen bir de\u011fi\u015fkendir ve de\u011feri derleme a\u015famas\u0131nda bir kez belirlenir ve o de\u011fi\u015fkenin de\u011feri bir daha asla de\u011fi\u015fmez.\n\n<pre class=\"lang:default decode:true\">const uint32_t cu32MaxConnectionCnt=1988;<\/pre>\n\nDe\u011fi\u015fkenin ba\u015f\u0131na const koydu\u011fumuz zaman derleyiciye deriz ki, bak bilader bu de\u011fi\u015fkenin de\u011feri asla de\u011fi\u015fmeyecek. Dolay\u0131s\u0131yla sen bunu z\u0131rt p\u0131rt de\u011fi\u015fmeyecek bir bellekte saklayabilirsin. Derleyici de gider o de\u011fi\u015fkeni ram'e de\u011fil flash'a ya da hard diske ya da genel ad\u0131yla NVM'ye(non-volatile memory) koyar. Hmm demek ki de\u011fi\u015fken demekle asl\u0131nda bellekteki bir veri gurubunu etiketlemekten s\u00f6z ediyoruz. Nitekim belle\u011fin adresinden ziyade de\u011fi\u015fkenin ismini ak\u0131lda tutmak daha kolay :)\n\nPeki karde\u015fim bu de\u011fi\u015fkenin de\u011feri de\u011fi\u015feni var de\u011fi\u015fmeyeni var. Yeri de\u011fi\u015fmeyeni istersek ne yapaca\u011f\u0131z biz? O zaman da de\u011fi\u015fkene durdu\u011fun yerde dur diyece\u011fiz. Nas\u0131l m\u0131? B\u00f6yle:\n\n<pre class=\"lang:default decode:true\">static uint32_t cu32MaxConnectionCnt=1988;<\/pre>\n\n\u015eimdi gelelim ba\u015fka bir mevzuya. Peki ya bizim de\u011fi\u015fkenimiz \u00f6yle ans\u0131z\u0131n de\u011fi\u015febilmeliyse? Ram'e eri\u015fmek g\u00f6rece \u00e7ok h\u0131zl\u0131 olsa da sonu\u00e7ta i\u015flemcinin d\u0131\u015f\u0131ndaki bir bellekten s\u00f6z ediyoruz ve haberle\u015fme i\u00e7in bir miktar zaman\u0131 pa\u015fa pa\u015fa kaybediyoruz. \u00d6yle bir imkan olsa ki \u00e7ok acil durumlar i\u00e7in daha h\u0131zl\u0131 bir \u00e7\u00f6z\u00fcm olsa. Var efendim, i\u015flemcinin register'lar\u0131 var. Biz derleyiciye \u015funu diyebiliriz. \"Abicim e\u011fer yer varsa l\u00fctfen bi zahmet bunu i\u015flemcinin register'inda sakla. Yoksa da optimize filan etme kolayda tut laz\u0131m olunca hemen \u00e7ekelim.\" Derdinizi anlatmay\u0131 bilirseniz derleyici dile\u011finizi yerine getirir. Bunun i\u00e7in ona \u015funu yazmal\u0131s\u0131n\u0131z:\n\n<pre class=\"lang:default decode:true\">volatile uint32_t cu32MaxConnectionCnt=1988;<\/pre>\n\nBunlar\u0131 kar\u0131\u015ft\u0131rmak m\u00fcmk\u00fcn. Misal static const dedi\u011finizde iki iste\u011finiz ayn\u0131 anda ger\u00e7ekle\u015ftirilir. Ancaak birbiriyle \u00e7at\u0131\u015fan istekler ayn\u0131 anda kullan\u0131lamaz. Mesela const volatile diyemezsiniz :) \u0130\u015fin temel mant\u0131\u011f\u0131 budur. Bunu bildikten sonra bu operasyonlar\u0131n felsefi yorumlar\u0131n\u0131 yapmak hakikaten zor de\u011fil. Misal static olan bir de\u011fi\u015fkenin yeri bellekte de\u011fi\u015fmedi\u011finden, o de\u011fi\u015fken son de\u011ferini her zaman korur. B\u00fct\u00fcn C tutorial'larnda static de\u011fi\u015fkenin fonksiyon i\u00e7inde yaln\u0131zca bir kez initialize edildi\u011fini herkes anlat\u0131r. \u0130\u015fte onun alt\u0131na yatan nedeni de burda buldunuz. Art\u0131k ayn\u0131 mant\u0131kla hepsini yorumlamak m\u00fcmk\u00fcn :) Misal \u015fu bilgi de her yerde var; bir c dosyas\u0131nda global olara tan\u0131mlanm\u0131\u015f statik bir de\u011fi\u015fken yaln\u0131z o dosyada kullan\u0131labilir. Neden? \u00c7\u00fcnk\u00fc derleyici her \u00a0dosyay\u0131 bir obje olarak derler. Sonra da objeler linker day\u0131 taraf\u0131ndan birle\u015ftirilir. Bir objede bir de\u011fi\u015fkenin yeri sabit tutuluyorsa o bellek alan\u0131, sinemada rezerve edilen koltu\u011fa benzer. Ba\u015fkas\u0131na satmazlar :) Neyse i\u015fte bu bilgi setiyle t\u00fcm bu yorumlar\u0131 yapmak m\u00fcmk\u00fcn.\n\nBir de extern \u00f6n eki var ama kendisini hi\u00e7 mi hi\u00e7 sevmem. Kullan\u0131m\u0131 bence k\u00f6t\u00fc mimarinin habercisidir. Uzaklardaki, ba\u015fka dosyalardaki de\u011fi\u015fkene eri\u015fmek i\u00e7in de, fonksiyona eri\u015fmek i\u00e7in de header dosyas\u0131 kullan\u0131m\u0131 daha mant\u0131kl\u0131d\u0131r. Zaman\u0131 gelince ona da daha detayl\u0131 de\u011finece\u011fim.\n\nBizim yazd\u0131\u011f\u0131m\u0131z kod derlendi\u011finde kodun i\u015fletilecek olan k\u0131sm\u0131 ile, de\u011feri sabit olan de\u011fi\u015fkenler flash'a at\u0131l\u0131r. De\u011fi\u015fecek de\u011fi\u015fkenler, fonksiyon stack'leri ise ram'de tutulur. Burda dikkat edilmesi gereken konu fonksiyonun kendisinin genelde flash'ta tutuldu\u011fudur. Ama fonksiyon arg\u00fcmanlar\u0131 filan ram'den kopyalanabilir. Neticede fonksiyon da bellek i\u00e7indeki bir veri. C dilinde fonksiyonlar dahil olmak \u00fczere her \u015fey de\u011fi\u015fken \u00e7e\u015fidirir demek esasen m\u00fcmk\u00fcn. Fonksiyon farkl\u0131 olarak i\u015fletilebiliyor. Yani bellek i\u00e7indeki veri, i\u015flemci i\u00e7in anlaml\u0131 bir operasyon koduna (opcode'a) tekab\u00fcl ediyor. Ama sonu\u00e7ta de\u011fi\u015fken mi? Pa\u015fa pa\u015fa de\u011fi\u015fken :) Sadece daha pahal\u0131 bir de\u011fi\u015fken :) O zaman benzer kurallar fonksiyonlar i\u00e7in de ge\u00e7erli ;)\n\nNeyse bu k\u0131sm\u0131 da \u00e7e\u015fitli ibretlerle atlatt\u0131k. Gelelim bir di\u011fer \u00f6nemli k\u0131s\u0131ma. \u0130simlendirme....\n\nSen bellekten yer ay\u0131rm\u0131\u015fs\u0131n, ad\u0131n\u0131 d\u00fczg\u00fcn koymad\u0131ktan sonra neye yarar? Bir programda e\u011fer, devreye ba\u011fl\u0131 olan LED'in a\u00e7\u0131k m\u0131 kapal\u0131 m\u0131 oldu\u011funu anlatan de\u011fi\u015fkenin ad\u0131 fiveVFlag ise \u00fch\u00fc\u00fc\u00fc\u00fc yand\u0131 onu okuyan, yand\u0131 onu geli\u015ftirmeye \u00e7al\u0131\u015fan... Ama as\u0131l onun ad\u0131n\u0131 \u00a0fiveVFlag koyan yand\u0131 \u00e7\u00fcnk\u00fc kulaklar\u0131 \u00e7ok \u00e7\u0131nlar. isCommErrorLedOn koysan de\u011fi\u015fkenin ad\u0131n\u0131 eline mi yap\u0131\u015f\u0131r. Bu yaz\u0131n\u0131n ba\u015f\u0131nda bir me\u015fhur s\u00f6z payla\u015fm\u0131\u015ft\u0131m. Day\u0131 ne g\u00fczel demi\u015f... Kodu \u00f6yle yazmak laz\u0131m ki, insan anlas\u0131n insan... Kodu okuyan kimse, kodlama yapan ki\u015finin niyetini \u00e7ok a\u00e7\u0131k \u015fekilde anlamal\u0131d\u0131r. Ancak anlamal\u0131d\u0131r derken, anlamas\u0131n\u0131 sa\u011flama sorumlulu\u011fu kodu yazandad\u0131r. Hatta sorumluluk \u00f6ylesine kodu yazandad\u0131r ki, okuyan\u0131n i\u015fini kolayla\u015ft\u0131ran hemen her \u015feyi d\u00fc\u015f\u00fcnmek zorundad\u0131r kodu yazan. \u00a0Ayn\u0131 zamanda kod self-documenting olmal\u0131d\u0131r yani d\u00f6k\u00fcmana gerek kalmaks\u0131z\u0131n i\u015flevini a\u00e7\u0131k\u00e7a anlatabilmelidir. Kod, konuyla alakas\u0131 olmayan biri taraf\u0131ndan bile anla\u015f\u0131labilmelidir. Sadece ba\u015fkas\u0131 i\u00e7in d\u00fc\u015f\u00fcnmeyin, yazd\u0131\u011f\u0131n\u0131z koda 2 sene sonra bakman\u0131z gerekirse siz de tam olarak s\u0131f\u0131rdan ba\u015flayacaks\u0131n\u0131z. Her zaman bunun korkusu ile ve bilinci ile kod yazmakta say\u0131s\u0131z faideler var. \u015eimdi bunlar\u0131 biraz somutla\u015ft\u0131ral\u0131m.\n\n<strong>Macar Notasyonu<\/strong>\n\nMacar notasyonu (Hungarian Notation) der ki de\u011fi\u015fkenin ismini \u00f6yle g\u00fczel yaz ki hem derdini anlats\u0131n hem de tipini. \u0130yi demi\u015f ne g\u00fczel demi\u015f ama Macar Notasyonu bile \u00e7o\u011fu ki\u015fi taraf\u0131ndan farkl\u0131 farkl\u0131 yorumlanm\u0131\u015f, temeli ayn\u0131 kalmak kayd\u0131yla farkl\u0131 estetiklerle uygulanm\u0131\u015ft\u0131r. \u0130nternette aratt\u0131\u011f\u0131n\u0131zda Macar notasyonu ile ilgili \u00e7ok farkl\u0131 \u00f6rneklere rastlayacaks\u0131n\u0131z. Ama dedi\u011fim gibi amac\u0131 hep ayn\u0131d\u0131r, tip bilgisini vermek ve a\u00e7\u0131klay\u0131c\u0131 olmak. Misal:\n\n<pre class=\"lang:default decode:true\">int8_t* strIpAddressV4;<\/pre>\n\nBuna ra\u011fmen notasyon se\u00e7imde tecr\u00fcbeler der ki, \u00e7al\u0131\u015f\u0131lan platform \u00e7ok \u00e7ok \u00f6nemlidir. Mesela \u00e7al\u0131\u015fma ortam\u0131 Visual Studio olacaksa, ve hep \u00f6yle kalacaksa tip bilgisini de\u011fi\u015fken ismine g\u00f6mmek ahmak\u00e7ad\u0131r. \u00c7\u00fcnk\u00fc kodu yazan ki\u015fi de\u011fi\u015fkeni \u00e7a\u011f\u0131r\u0131rken tipi zaten hintBox'da otomatik g\u00f6r\u00fcnmektedir. Keza o de\u011fi\u015fkeni ba\u015fka bir de\u011fi\u015fkene atayacakken de\u011fi\u015fkenin ad\u0131n\u0131 yazmaya ba\u015flad\u0131\u011f\u0131nda de\u011fi\u015fkenin tipi zaten hintBox'da \u00e7\u0131kmaktad\u0131r. O zaman ne gere\u011fi var? Bir de de\u011fi\u015fkenin tipini de\u011fi\u015fkenin ba\u015f\u0131na koymak auto code completition (otomatik kod tamamlama) olan geli\u015ftirme ortamlar\u0131nda sorun yaratacakt\u0131r. \u00c7\u00fcnk\u00fc siz ip adresini kullanmak istedi\u011finizde onun string olmas\u0131ndan daha \u00e7ok ip adresi olmas\u0131yla ilgilenece\u011finizden de\u011fi\u015fkeni yazmaya ipAddress diye ba\u015flayacaks\u0131n\u0131z. E\u011fer ortam\u0131n\u0131z VisualStudio ise yine y\u0131rtt\u0131n\u0131z ama Eclipse'in bu g\u00fcnk\u00fc bir versiyonu ise yand\u0131n\u0131z \u00e7\u00fcnk\u00fc de\u011fi\u015fken ipAddress ile de\u011fil de str ile ba\u015flad\u0131\u011f\u0131 i\u00e7in auto code completition yap\u0131lamayacak de\u011fi\u015fken bulunamayacakt\u0131r. Ama Keil uVision gibi ta\u015f gibi, ama ta\u015f devrinden kalm\u0131\u015f izlenimi veren d\u00fcmd\u00fcz ama delikanl\u0131 bir IDE ile \u00e7al\u0131\u015f\u0131yorsan\u0131z tip bilgisini de\u011fi\u015fkene ekleseniz\u00a0iyi edersiniz :)\n\nBenim isimlendirme stilimi bu yaz\u0131 dizisi boyunca yeterince tan\u0131yaca\u011f\u0131n\u0131zdan \u015fimdi detayl\u0131ca anlatm\u0131yorum :) Siz de kendinizinkini olu\u015fturmakta \u00f6zg\u00fcrs\u00fcn\u00fcz, ya da bir standard\u0131 kullanabilirsiniz [ki belki daha iyi bir se\u00e7im olabilir, tart\u0131\u015f\u0131l\u0131r] ama her durumda kafan\u0131zdakini Blale anlat\u0131rcas\u0131na a\u00e7\u0131k\u00e7a koda aktarmakla y\u00fck\u00fcml\u00fcs\u00fcn\u00fcz.\n\nEfendim de\u011fi\u015fken derken ben fonksiyonlar\u0131 da ay\u0131rmad\u0131\u011f\u0131m\u0131 s\u00f6ylemi\u015ftim. Fonksiyon, as\u0131l i\u015fi yapacak olan yaz\u0131l\u0131m blo\u011fu oldu\u011fundan \u00e7ok do\u011fru isimlendirilmeli, \u00e7ok do\u011fru yarat\u0131lmal\u0131d\u0131r. \u00c7o\u011fu zaman fonksiyon isimleri, hatal\u0131 kodlar\u0131 ele vermektedir. Nas\u0131l ki yaz\u0131lan de\u011fi\u015fken neyi temsil etti\u011fini a\u00e7\u0131k\u00e7a anlatmal\u0131 ise, fonksiyon da yapaca\u011f\u0131 i\u015fi a\u00e7\u0131k\u00e7a anlatmal\u0131d\u0131r. Ayn\u0131 zamanda her fonksiyon yaln\u0131zca ama yaln\u0131zca bir i\u015fi yapmal\u0131d\u0131r. Bunu ilerde fonksiyonlar k\u0131sm\u0131nda daha detayl\u0131 anlataca\u011f\u0131m ama misal \u015fu fonksiyonun mesela isminde hay\u0131r olmad\u0131\u011f\u0131ndan kendinin de hay\u0131rl\u0131 bir i\u015f yapmad\u0131\u011f\u0131 a\u00e7\u0131kt\u0131r:\n\n<pre class=\"lang:default decode:true\">void ikiDegiskeniToplaVeSeriPortaYaz(uint32_t a, uint32_t b)\n{\nuint32_t c= a+b;\n\nUART5.RESET = 1;\nUART5.DREG = c&gt;&gt;24; \nUART5.TX = 1;\n\nUART5.RESET=1;\nUATRT5.DREG=c&gt;&gt;16;\nUART5.TX = 1;\n\nUART5.RESET=1;\nUART5.DREG=c&gt;&gt;8;\nUART5.TX =1;\n\nUART5.RESET=1;\nUART5.DREG=c;\nUART5.TX=1;\n}<\/pre>\n\nArkada\u015f bir kere bu fonksiyonun ad\u0131 o kadar sa\u00e7ma ki, C dilini ve bu hayali mikrodenetleyiciyi bilen hemen her kes bu kodun iki say\u0131y\u0131 toplay\u0131p seri porta yazd\u0131\u011f\u0131n\u0131 g\u00f6rebilir. \u0130yi de niye yazd\u0131? Fonksiyonun ad\u0131n\u0131n bunu anlatmas\u0131 gerekir. Ki yaz\u0131m\u0131 da \u00e7ok k\u00f6t\u00fc zaten ya neyse. Hadi biraz d\u00fczeltelim madem.\n\n<pre class=\"lang:default decode:true\">typedef union\n{\n   uint32_t u32Veri;\n   uint8_t  au8Veri[4];\n}tu_VeriPaketi32Bit;\n\nvoid bilgisayaraByteGonder(uint8_t u8Veri)\n{\n UART5.RESET=1;\n UART5.DREG=u8Veri;\n UART5.TX = 1;\n}\n\nuint32_t hasilatiHesaplaTL(uint16_t u16BazUcretTL, uint16_t u16KomisyonUcretiTL)\n{\n    return (u16BazUcretTL+u16KomisyonUcretiTL);\n}\n\nvoid hasilatiGonder(uint32_t u32HasilatTL)\n{\n tu_VeriPaketi32Bit UHasilat.u32Veri=u32HasilatTL;\n for(uint8_t i=0;i&lt;sizeof(tu_VeriPaketi32Bit); i++)\n {\n    bilgisayaraByteGonder(UHasilat.au8Veri[i]);\n }\n}\n\n<\/pre>\n\nArt\u0131k her fonksiyon ad\u0131na yana\u015f\u0131r \u015fekilde bir i\u015f yap\u0131yor ve kodun iki say\u0131y\u0131 toplay\u0131p seri porttan yollamakla hangi problemi \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fc anlayabiliyoruz. Ayr\u0131ca belli ki auto code completition olmayan bir yerde kodu yazm\u0131\u015f\u0131z. Bir di\u011fer \u00f6nemli nokta ise kodun dili. Kodun yar\u0131s\u0131 \u0130ngilizce yar\u0131s\u0131 T\u00fcrk\u00e7e olmamal\u0131. Hangisini se\u00e7tiyseniz ona sad\u0131k kal\u0131n. Normalde C dilinin anahtar s\u00f6zc\u00fckleri \u0130ngilizce oldu\u011fundan ben tamam\u0131n\u0131 \u0130ngilizce yazmay\u0131 tercih ediyorum. Ancak \u0130ngilizce bilmeyen arkada\u015flar da anlatmak istedi\u011fim \u015feyi anlayabilsin diye bu defa T\u00fcrk\u00e7e yazd\u0131m. Union k\u0131sm\u0131n\u0131 anlamad\u0131ysan\u0131z \u015fimdi ona \u00e7ok tak\u0131lmay\u0131n. \u0130bret al\u0131nacak ba\u015fka noktalara bakal\u0131m. \u0130lk fonksiyonun ad\u0131n\u0131n ne kadar ama\u00e7s\u0131z oldu\u011fu konusunda anla\u015ft\u0131\u011f\u0131m\u0131z\u0131 san\u0131yorum. Bir di\u011fer hata da isminden de anla\u015f\u0131ld\u0131\u011f\u0131 \u00fczere iki i\u015fi birden yapmaya \u00e7al\u0131\u015fmas\u0131. \u0130\u015fte bu tekrar kullan\u0131labilirli\u011fi \u00f6ld\u00fcr\u00fcyor. \u00dcstteki koddaki adam seri porta ba\u015fka bir \u015fey yazmak istedi\u011finde kod tekrar\u0131 yapacak ve birinde hata yaparsa belki hatay\u0131 bulamayacak. Alttaki kodda ise bilgisayaraByteGonder fonksiyonu \u00e7i\u00e7ek gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan \u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131 her yerde hataya mahal vermeksizin \u00e7al\u0131\u015fmaya devam edecek. Ayr\u0131yeten bilgisayara bilgi g\u00f6nderecek her fonksiyon onu tekrar tekrar kullanabilecek. Bu nedenle fonksiyon isminde and, or, if filan var ise bilin ki o fonksiyon \u00e7ok \u00e7irkin bir fonksiyondur. Ayr\u0131ca isimlendirme, dilin anlatamad\u0131\u011f\u0131n\u0131 anlatmay\u0131 hedeflemelidir. De\u011fi\u015fkenin ad\u0131n\u0131 uzun yazmakta bir sak\u0131nca yoktur. Derleyici zaten derleyince onu adrese d\u00f6n\u00fc\u015ft\u00fcrecektir. Bir harfle isimlendirilen de\u011fi\u015fken de, uzunca ismi olan de\u011fi\u015fken de tipi ayn\u0131 oldu\u011fu takdirde ayn\u0131 miktarda yer kaplayacakt\u0131r.\n\nG\u00fczel kodlama pratikleri \u00fczerinde ileriki konularda da konu\u015faca\u011f\u0131z. \u015eimdilik g\u00f6r\u00fc\u015fmek \u00fczere :)\n\n&nbsp;\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=172\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=198\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]","_tr_post_name":"gomulu-sistemler-14-gomulu-c-veri-tipleri-ve-degiskenler","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 3 : Veri Tipleri, De\u011fi\u015fkenler ve \u0130simlendirme","_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":[3],"tags":[],"class_list":["post-186","post","type-post","status-publish","format-standard","hentry","category-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-30","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/186","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=186"}],"version-history":[{"count":1,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/186\/revisions"}],"predecessor-version":[{"id":639,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/186\/revisions\/639"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=186"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}