{"id":198,"date":"2014-11-27T23:56:35","date_gmt":"2014-11-27T21:56:35","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=198"},"modified":"2014-11-27T23:56:35","modified_gmt":"2014-11-27T21:56:35","slug":"gomulu-sistemler-15-gomulu-c-sabitler-ve-yorum-satirlari","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=198","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 4 : Sabitler ve Yorum Sat\u0131rlar\u0131"},"content":{"rendered":"<p>\u00d6nceki yaz\u0131da veri tipleri, de\u011fi\u015fkenler ve isimlendirmeden bahsetmi\u015ftim. Bu\u00a0yaz\u0131da yorum sat\u0131rlar\u0131ndan ve sabitlerden k\u0131saca bahsedece\u011fim.<\/p>\n<p>N\u015eA&#8217;da sabitler ve yorumlarla ilgili bahsedilebilecek \u015feyleri zaten okudu\u011funuzu \/ bildi\u011finizi varsay\u0131yorum. Nitekim herhangi bir C kitab\u0131nda ya da tutorial&#8217;inde mutlaka bir tak\u0131m temel \u015feyler yer al\u0131yor. Bu k\u0131s\u0131mda yine birazc\u0131k daha fazlas\u0131na de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m \ud83d\ude42<\/p>\n<p><strong>YORUMLAR<\/strong><\/p>\n<p>C dilinde yorum sat\u0131rlar\u0131 iki \u015fekilde yaz\u0131l\u0131r. Her iki duruma da \u00f6rnek olarak a\u015fa\u011f\u0131daki kod par\u00e7as\u0131 \u00f6rnek g\u00f6sterilebilir:<\/p>\n<pre class=\"lang:c decode:true \" title=\"Yorumlarla ilgili \u00f6rnek\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n#include &lt;string.h&gt;\n\n\/*\nAsagidaki fonksiyon main fonksiyonudur.\nGenelde C dilinde yazilimis bir kod, \nmain fonksiyonundan baslanarak isletilir.\nBu da bir yorum satiridir.\n*\/\nint main()\n{\n\/\/haydi bir degisken yaratalim\nuint32_t workOfThisProgram=0;\n\nreturn workOfThisProgram;\n}<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi tek sat\u0131rl\u0131k bir yorum yazmak i\u00e7in &#8220;\/\/yorum&#8221;, \u00e7ok sat\u0131rl\u0131 yorum yazmak i\u00e7in ise &#8220;\/* yorum *\/&#8221; kullan\u0131l\u0131r. Y\u0131ld\u0131zl\u0131 olan blok yorum esasen C++&#8217;da olan bir \u00f6zellik olup sonradan faideleri g\u00f6r\u00fcl\u00fcp C&#8217;ye de aktar\u0131lm\u0131\u015ft\u0131r. Yorumun program i\u00e7in a\u00e7\u0131klay\u0131c\u0131 olmas\u0131na dikkat edilmelidir.<\/p>\n<p><strong>SAB\u0130TLER<\/strong><\/p>\n<p>C dilinde yarat\u0131lan de\u011fi\u015fkenler, bellekte bir adreste saklan\u0131rlar. Bu de\u011fi\u015fkenlerin saklan\u0131\u015f \u015fekillerini bir \u00f6nceki yaz\u0131da incelemi\u015ftik. Bu de\u011fi\u015fkenleri yarat\u0131rken, de\u011fi\u015fkenlerin bir i\u015fe yaramas\u0131n\u0131 istiyorsak, de\u011fi\u015fkenlerin de\u011fer almas\u0131 mecburi olacakt\u0131r. \u0130\u015fte bu de\u011fer atamas\u0131nda, bir de\u011fi\u015fkeni ba\u015fka bir de\u011fi\u015fkene atayabilece\u011fimiz gibi, bir de\u011fi\u015fkene sabit bir de\u011fer de atayabiliriz. Misal,<\/p>\n<pre class=\"lang:default decode:true \">uint8_t abcProtokolununBesmelesi=0x18;\nuint8_t ehliyetAlmaYasi = 18;\nuint8_t ismininBasHarfi = '\u00d6';\nuint16_t birYildakiGunSayisi = 365;\nfloat birYildakiGercekGunSayisi=365.25;\nfloat piSayisi= 3.14;\nint8_t izinVerilenMinSicaklikCelciusCinsinden=-40;\n<\/pre>\n<p>De\u011fi\u015fkene sabit de\u011fer atamas\u0131 yap\u0131l\u0131rken, sabitin boyutunun de\u011fi\u015fkenin boyutu ile uyumlu olmas\u0131na dikkat etmek gerekir. Misal 8 bitlik bir de\u011fi\u015fkenin alabilece\u011fi azami de\u011fer 255 iken ona gidip 65372 gibi bir de\u011feri atamaya \u00e7al\u0131\u015fmamak gerekir. Ama oldu ki atad\u0131k, ne olaca\u011f\u0131n\u0131 da bilmemiz gerekir. Bu durumda de\u011fi\u015fkene 65372&#8217;nin 255 modundaki de\u011feri atan\u0131r. Bu da de\u011ferin bellekteki yerle\u015fiminin d\u00fc\u015f\u00fck \u00f6ncelikli byte&#8217;\u0131 demektir. Tabi bu derleyiciden derleyiciye de\u011fi\u015fir.<\/p>\n<p><strong>A\u011eZIMDAK\u0130 BAKLA<\/strong><\/p>\n<p>\u015eimdi gelelim as\u0131l mevzuya&#8230; Esasen yorum sat\u0131rlar\u0131 yaz\u0131l\u0131m d\u00fcnyas\u0131nda b\u00fcy\u00fck tart\u0131\u015fmalara sebep olmu\u015ftur. Hatta benim de bir mensubu oldu\u011fum &#8220;birileri&#8221; yorum sat\u0131rlar\u0131n\u0131n mecburi durumlar d\u0131\u015f\u0131nda kullan\u0131lmamas\u0131 gerekti\u011fi, gerekti\u011fi yerde de kullan\u0131lmamas\u0131n\u0131n hata oldu\u011fu y\u00f6n\u00fcnde g\u00f6r\u00fc\u015f bildirmi\u015ftir. Okulda ders ald\u0131\u011f\u0131m hocam\u0131n da mensubu oldu\u011fu &#8220;birileri&#8221; ise, yorumsuz kodu koddan saymam\u0131\u015f, reddetmi\u015f, s\u0131f\u0131r vermi\u015f, onu hakir g\u00f6rm\u00fc\u015ft\u00fcr.<\/p>\n<p>\u015eimdi mevzu asl\u0131nda yorum olup olmamas\u0131 de\u011fil bence. Her ne kadar bu konuda bir taraf olsam da, g\u00f6r\u00fc\u015f\u00fcm\u00fc detayl\u0131ca a\u00e7\u0131klayaca\u011f\u0131m. Sonras\u0131nda yolunuzu se\u00e7mek \u00fczere karar size ait \ud83d\ude42 Ben derim ki, bir yaz\u0131l\u0131m, ba\u015ftan iyi tasarlanm\u0131\u015f olmal\u0131d\u0131r, iyi implemente edilmi\u015f olmal\u0131d\u0131r, iyi yaz\u0131lm\u0131\u015f olmal\u0131d\u0131r. Yani kod \u00f6yle yaz\u0131lmal\u0131d\u0131r ki, ne i\u015f yapt\u0131\u011f\u0131n\u0131 zaten anlatmal\u0131d\u0131r. Bunu sadece ben de s\u00f6ylemiyorum &#8220;self-descriptive&#8221; yani kendini ifade eden kodlama, bir yaz\u0131l\u0131m kalitesi unsuru olarak literat\u00fcrde bakidir. Sonu\u00e7ta C,C++,Java ne olursa olsun s\u00f6z konusu ara\u00e7 bir dildir ve dilin kurallar\u0131 herkes i\u00e7in ortakt\u0131r. int i=5 derken, dili bilen herkes i diye bir de\u011fi\u015fkenin, int cinsinden yarat\u0131ld\u0131\u011f\u0131n\u0131 ve ona 5 de\u011ferinin atand\u0131\u011f\u0131n\u0131 bilir. Sorun, bu 5 de\u011ferinin ne oldu\u011fudur ve i&#8217;ye niye atand\u0131\u011f\u0131d\u0131r. i&#8217;nin neden int oldu\u011fu ve neden 5&#8217;in ona atand\u0131\u011f\u0131 da di\u011fer sorular tabi ki. \u015eimdi kimisi der ki ben pis pis kodumu yazar\u0131m, \u00fcst\u00fcn\u00fc de yorumla s\u0131var\u0131m. Nas\u0131l m\u0131? Misal:<\/p>\n<pre class=\"lang:default decode:true \">int i = 255;\/\/ dizinin son indeksi<\/pre>\n<p>\u015eimdi bu kodu yazan adam\u0131n arkas\u0131ndan nas\u0131l konu\u015fulur? \u015e\u00f6yle&#8230; Karde\u015f, kafan \u00e7ok g\u00fczelmi\u015f kodu da \u00f6yle yazm\u0131\u015fs\u0131n, zahmet edip yorum da yapm\u0131\u015fs\u0131n ama bu dizi kim? 255 dizinin neden son indeksi? Madem bu de\u011fi\u015fken bir dizinin son indeksi, de\u011fi\u015fkenin ad\u0131n\u0131 felancaDizininSonIndeksi filan diye koysan ne olurdu? Madem bu dizinin son indeksi 255, sen o bilgiyi ba\u015fka bir yerde de kullanacaks\u0131n ve yine ne oldu\u011funu kimse bilmeyecek. O bilgiyi etiketlesen can\u0131n m\u0131 \u00e7\u0131kard\u0131?<\/p>\n<p>Ve nihayetinde o bildi\u011finiz ac\u0131 son ile kodu yazan ki\u015finin arkas\u0131ndan bir g\u00fczel dualar edilirdi.Bir de a\u015fa\u011f\u0131daki sat\u0131r\u0131 yazan kodcu var tabi&#8230;<\/p>\n<pre class=\"lang:default decode:true \">#define COMMUNICATION_RX_BUFFER_SIZE 255\n#define COMMUNICATION_RX_BUFFER_LAST_INDEX (COMMUNICATION_RX_BUFFER_SIZE - 1)\n\n\/* We are starting from the last index because, the last value is the most recent one. By the way, we are inceasing the possibility to find the searched character *\/\nuint8_t commRxBufferCurrentIndex = COMMUNICATION_RX_BUFFER_LAST_INDEX;<\/pre>\n<p>\u00d6nce hi\u00e7 bir \u015fey denmez, \u00e7\u00fcnk\u00fc her\u015feyi anlam\u0131\u015f olman\u0131n verdi\u011fi ayd\u0131nlanma hissi bedeni kaplar. Yani neticede bir kodda bir s\u00fcr\u00fc yerde 255 de\u011ferinde bir \u015feyler olabilir ama hangisinin ne anlama geldi\u011fini anlatmak etiketler olmadan \u00e7ok zordur. Etiket dedi\u011fim de #define ile yazd\u0131\u011f\u0131m \u015fey. Bu sayede kodda 25 ge\u00e7ti\u011fi zaman o 25&#8217;in oda s\u0131cakl\u0131\u011f\u0131 m\u0131 yoksa, amerikan\u0131n bir eyaletindeki ehliyet alma ya\u015f\u0131 m\u0131 oldu\u011funu anlayabiliriz. Bu olaya &#8220;MAGIC NUMBER CODING&#8221; deniyor. Kodda nereden peydah oldu\u011funu bilmedi\u011fimiz sabit de\u011ferler olmamal\u0131 \ud83d\ude42 Yaz\u0131l\u0131mda zaten mevzuyu anlamak zor, bir de yorumlarla sabitler do\u011fru kullan\u0131lmad\u0131 m\u0131 olay epey i\u015fgenceye d\u00f6n\u00fcyor do\u011frusu.<\/p>\n<p>\u015eimdi bir di\u011fer \u00f6nemli konu da veri ve bilgi kavramlar\u0131n\u0131n farkl\u0131l\u0131\u011f\u0131.Programlamada birbirine en \u00e7ok kar\u0131\u015ft\u0131r\u0131lan kavramlardan biri de bilgi ve veri kavramlar\u0131d\u0131r. Eee haliyle \u00e7ok say\u0131da yanl\u0131\u015fl\u0131k da yap\u0131l\u0131yor. \u00d6rne\u011fin bir 3. s\u0131n\u0131f \u00f6\u011frencisininn &#8216;A&#8217; s\u0131n\u0131f\u0131nda olmas\u0131 bir bilgidir. O bilgi, say\u0131sal kar\u015f\u0131l\u0131\u011f\u0131 <a href=\"http:\/\/www.asciitable.com\/\">0x41 yani 65 olan veri<\/a> ile ifade edilebilir. Buradaki 65 say\u0131s\u0131, konu i\u00e7eri\u011fi bilinmeyen bir veridir. Keza \u00fclkemizde erkekler i\u00e7in emeklilik ya\u015f\u0131 da 65&#8217;tir. Yani bu bilgi de &#8216;A&#8217; ile ayn\u0131 \u015fekilde bellekte saklanmaktad\u0131r. Aaaaaa?<\/p>\n<p>i=&#8217;A&#8217;, i=65, i=0x41;<\/p>\n<p>Bunlar\u0131n hepsi ayn\u0131 de\u011ferde olan atamalar. Demek ki biz s\u00f6z konusu i\u00e7eri\u011fi\u00a0farkl\u0131 \u015fekilde sunsak, anlamland\u0131rsak da (bilgi), bu anlamland\u0131rman\u0131n bellekteki yerle\u015fimi ayn\u0131 olabiliyormu\u015f. Biz sadece okuyan adam daha iyi anlas\u0131n diye s\u0131n\u0131f\u0131 g\u00f6steren de\u011fi\u015fkene &#8216;A&#8217; verisini(de\u011ferini) atad\u0131k, emeklilik ya\u015f\u0131na da 65&#8217;i atad\u0131k. Bu yakla\u015f\u0131m\u0131n de\u011fi\u015fkenin ad\u0131n\u0131 d\u00fczg\u00fcn koymaktan bir ad\u0131m \u00f6teye gitti\u011fini l\u00fctfen ka\u00e7\u0131rmayal\u0131m. Sonu\u00e7ta her iki durumda da derleyici bu ifadeleri 65 say\u0131s\u0131na \u00e7evirecek ve bu veriyi bellek g\u00f6z\u00fcne yazacak. Demek ki neymi\u015f? Sabit&#8217;i atarken bile o bilgiyi ifade etme \u015feklimiz, iyi kod yazmak i\u00e7in, anla\u015f\u0131labilir olmak i\u00e7in \u00e7ok \u00e7ok \u00f6nemliymi\u015f. Buradan \u00e7\u0131kar\u0131lacak say\u0131s\u0131z ibretler var. Par\u00e7alar\u0131 birle\u015ftirecek olursak asl\u0131nda &#8216;A&#8217;,65 gibi say\u0131lar\u0131 kodun \u00e7e\u015fitli yerlerinde tekrar tekrar yazaca\u011f\u0131m\u0131za, #define ile etiket olu\u015fturup o etiketi kullanmakta b\u00fcy\u00fck feyizler var.<\/p>\n<p>Bu konunun bir \u00f6rne\u011fi de printf ile verilebilir. G\u00f6m\u00fcl\u00fc sistem yaz\u0131l\u0131mc\u0131lar\u0131, \u00e7ok pahal\u0131 bir fonksiyon olabildi\u011fi i\u00e7in printf&#8217;e kar\u015f\u0131 \u00e7ok mesafeli olsa da, konsepti anlatabilmek ad\u0131na \u00f6rne\u011fimizi onun \u00fczerinden vermemiz m\u00fcmk\u00fcn.<\/p>\n<pre class=\"lang:default decode:true \">#include &lt;stdio.h&gt; \/\/printf i\u00e7in laz\u0131m\n#include &lt;stdint.h&gt; \/\/int8_t i\u00e7in laz\u0131m\n\nint main()\n{\nint8_t anlamsizDegisken = 65;\nprintf(\"Verinin karakter olarak [ismin bas harfi] yorumlanmas\u0131: %crn\", anlamsizDegisken );\n\nprintf(\"Verinin onluk tabanda sayi olarak [emeklilik yas\u0131] yorumlanmas\u0131: %drn\", anlamsizDegisken );\n\nprintf(\"Verinin on alt\u0131l\u0131k tabanda sayi olarak [protokol basligi] yorumlanmas\u0131: %xrn\", anlamsizDegisken );\n\nwhile(1); \/ille elle kapat\nreturn 0;\n}<\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda her seferinde ayn\u0131 veriyi yazd\u0131rman\u0131za ra\u011fmen, s\u0131rayla &#8216;A&#8217;, 65 ve 41 g\u00f6r\u00fcrs\u00fcn\u00fcz. Bu bellekteki verinin bilgiye d\u00f6n\u00fc\u015f\u00fcm\u00fcd\u00fcr. \u00dczerinde d\u00fc\u015f\u00fcn\u00fcld\u00fc\u011f\u00fcnde burada da say\u0131s\u0131z ibretler vard\u0131r.<\/p>\n<p>Neticede a\u011fz\u0131mdaki baklay\u0131 \u00e7\u0131kard\u0131m. Yorum sat\u0131rlar\u0131n\u0131n kullan\u0131m\u0131 ile ilgili felsefemi aktard\u0131m. Karar sizin. Karar\u0131n\u0131za sad\u0131k kal\u0131n\u0131z.Ard\u0131ndan sabitlerle ilgili \u00e7ok \u00f6nemli oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm kavramlar\u0131 aktarmaya \u00e7al\u0131\u015ft\u0131m. Umuyorum bir \u015feyler katm\u0131\u015ft\u0131r, \u015fimdi devam \ud83d\ude42<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=186\" 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=220\" 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>\u00d6nceki yaz\u0131da veri tipleri, de\u011fi\u015fkenler ve isimlendirmeden bahsetmi\u015ftim. Bu\u00a0yaz\u0131da yorum sat\u0131rlar\u0131ndan ve sabitlerden k\u0131saca bahsedece\u011fim. N\u015eA&#8217;da sabitler ve yorumlarla ilgili bahsedilebilecek \u015feyleri zaten okudu\u011funuzu \/ bildi\u011finizi varsay\u0131yorum. Nitekim herhangi bir C kitab\u0131nda ya da tutorial&#8217;inde mutlaka bir tak\u0131m temel \u015feyler yer al\u0131yor. Bu k\u0131s\u0131mda yine birazc\u0131k daha fazlas\u0131na de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m \ud83d\ude42 YORUMLAR C dilinde yorum <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=198\">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":"\u00d6nceki yaz\u0131da veri tipleri, de\u011fi\u015fkenler ve isimlendirmeden bahsetmi\u015ftim. Bu\u00a0yaz\u0131da yorum sat\u0131rlar\u0131ndan ve sabitlerden k\u0131saca bahsedece\u011fim.\n\nN\u015eA'da sabitler ve yorumlarla ilgili bahsedilebilecek \u015feyleri zaten okudu\u011funuzu \/ bildi\u011finizi varsay\u0131yorum. Nitekim herhangi bir C kitab\u0131nda ya da tutorial'inde mutlaka bir tak\u0131m temel \u015feyler yer al\u0131yor. Bu k\u0131s\u0131mda yine birazc\u0131k daha fazlas\u0131na de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m :)\n\n<strong>YORUMLAR<\/strong>\n\nC dilinde yorum sat\u0131rlar\u0131 iki \u015fekilde yaz\u0131l\u0131r. Her iki duruma da \u00f6rnek olarak a\u015fa\u011f\u0131daki kod par\u00e7as\u0131 \u00f6rnek g\u00f6sterilebilir:\n\n<pre class=\"lang:c decode:true \" title=\"Yorumlarla ilgili \u00f6rnek\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n#include &lt;string.h&gt;\n\n\/*\nAsagidaki fonksiyon main fonksiyonudur.\nGenelde C dilinde yazilimis bir kod, \nmain fonksiyonundan baslanarak isletilir.\nBu da bir yorum satiridir.\n*\/\nint main()\n{\n\/\/haydi bir degisken yaratalim\nuint32_t workOfThisProgram=0;\n\nreturn workOfThisProgram;\n}<\/pre>\n\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi tek sat\u0131rl\u0131k bir yorum yazmak i\u00e7in \"\/\/yorum\", \u00e7ok sat\u0131rl\u0131 yorum yazmak i\u00e7in ise \"\/* yorum *\/\" kullan\u0131l\u0131r. Y\u0131ld\u0131zl\u0131 olan blok yorum esasen C++'da olan bir \u00f6zellik olup sonradan faideleri g\u00f6r\u00fcl\u00fcp C'ye de aktar\u0131lm\u0131\u015ft\u0131r. Yorumun program i\u00e7in a\u00e7\u0131klay\u0131c\u0131 olmas\u0131na dikkat edilmelidir.\n\n<strong>SAB\u0130TLER<\/strong>\n\nC dilinde yarat\u0131lan de\u011fi\u015fkenler, bellekte bir adreste saklan\u0131rlar. Bu de\u011fi\u015fkenlerin saklan\u0131\u015f \u015fekillerini bir \u00f6nceki yaz\u0131da incelemi\u015ftik. Bu de\u011fi\u015fkenleri yarat\u0131rken, de\u011fi\u015fkenlerin bir i\u015fe yaramas\u0131n\u0131 istiyorsak, de\u011fi\u015fkenlerin de\u011fer almas\u0131 mecburi olacakt\u0131r. \u0130\u015fte bu de\u011fer atamas\u0131nda, bir de\u011fi\u015fkeni ba\u015fka bir de\u011fi\u015fkene atayabilece\u011fimiz gibi, bir de\u011fi\u015fkene sabit bir de\u011fer de atayabiliriz. Misal,\n\n<pre class=\"lang:default decode:true \">uint8_t abcProtokolununBesmelesi=0x18;\nuint8_t ehliyetAlmaYasi = 18;\nuint8_t ismininBasHarfi = '\u00d6';\nuint16_t birYildakiGunSayisi = 365;\nfloat birYildakiGercekGunSayisi=365.25;\nfloat piSayisi= 3.14;\nint8_t izinVerilenMinSicaklikCelciusCinsinden=-40;\n<\/pre>\n\nDe\u011fi\u015fkene sabit de\u011fer atamas\u0131 yap\u0131l\u0131rken, sabitin boyutunun de\u011fi\u015fkenin boyutu ile uyumlu olmas\u0131na dikkat etmek gerekir. Misal 8 bitlik bir de\u011fi\u015fkenin alabilece\u011fi azami de\u011fer 255 iken ona gidip 65372 gibi bir de\u011feri atamaya \u00e7al\u0131\u015fmamak gerekir. Ama oldu ki atad\u0131k, ne olaca\u011f\u0131n\u0131 da bilmemiz gerekir. Bu durumda de\u011fi\u015fkene 65372'nin 255 modundaki de\u011feri atan\u0131r. Bu da de\u011ferin bellekteki yerle\u015fiminin d\u00fc\u015f\u00fck \u00f6ncelikli byte'\u0131 demektir. Tabi bu derleyiciden derleyiciye de\u011fi\u015fir.\n\n<strong>A\u011eZIMDAK\u0130 BAKLA<\/strong>\n\n\u015eimdi gelelim as\u0131l mevzuya... Esasen yorum sat\u0131rlar\u0131 yaz\u0131l\u0131m d\u00fcnyas\u0131nda b\u00fcy\u00fck tart\u0131\u015fmalara sebep olmu\u015ftur. Hatta benim de bir mensubu oldu\u011fum \"birileri\" yorum sat\u0131rlar\u0131n\u0131n mecburi durumlar d\u0131\u015f\u0131nda kullan\u0131lmamas\u0131 gerekti\u011fi, gerekti\u011fi yerde de kullan\u0131lmamas\u0131n\u0131n hata oldu\u011fu y\u00f6n\u00fcnde g\u00f6r\u00fc\u015f bildirmi\u015ftir. Okulda ders ald\u0131\u011f\u0131m hocam\u0131n da mensubu oldu\u011fu \"birileri\" ise, yorumsuz kodu koddan saymam\u0131\u015f, reddetmi\u015f, s\u0131f\u0131r vermi\u015f, onu hakir g\u00f6rm\u00fc\u015ft\u00fcr.\n\n\u015eimdi mevzu asl\u0131nda yorum olup olmamas\u0131 de\u011fil bence. Her ne kadar bu konuda bir taraf olsam da, g\u00f6r\u00fc\u015f\u00fcm\u00fc detayl\u0131ca a\u00e7\u0131klayaca\u011f\u0131m. Sonras\u0131nda yolunuzu se\u00e7mek \u00fczere karar size ait :) Ben derim ki, bir yaz\u0131l\u0131m, ba\u015ftan iyi tasarlanm\u0131\u015f olmal\u0131d\u0131r, iyi implemente edilmi\u015f olmal\u0131d\u0131r, iyi yaz\u0131lm\u0131\u015f olmal\u0131d\u0131r. Yani kod \u00f6yle yaz\u0131lmal\u0131d\u0131r ki, ne i\u015f yapt\u0131\u011f\u0131n\u0131 zaten anlatmal\u0131d\u0131r. Bunu sadece ben de s\u00f6ylemiyorum \"self-descriptive\" yani kendini ifade eden kodlama, bir yaz\u0131l\u0131m kalitesi unsuru olarak literat\u00fcrde bakidir. Sonu\u00e7ta C,C++,Java ne olursa olsun s\u00f6z konusu ara\u00e7 bir dildir ve dilin kurallar\u0131 herkes i\u00e7in ortakt\u0131r. int i=5 derken, dili bilen herkes i diye bir de\u011fi\u015fkenin, int cinsinden yarat\u0131ld\u0131\u011f\u0131n\u0131 ve ona 5 de\u011ferinin atand\u0131\u011f\u0131n\u0131 bilir. Sorun, bu 5 de\u011ferinin ne oldu\u011fudur ve i'ye niye atand\u0131\u011f\u0131d\u0131r. i'nin neden int oldu\u011fu ve neden 5'in ona atand\u0131\u011f\u0131 da di\u011fer sorular tabi ki. \u015eimdi kimisi der ki ben pis pis kodumu yazar\u0131m, \u00fcst\u00fcn\u00fc de yorumla s\u0131var\u0131m. Nas\u0131l m\u0131? Misal:\n\n<pre class=\"lang:default decode:true \">int i = 255;\/\/ dizinin son indeksi<\/pre>\n\n\u015eimdi bu kodu yazan adam\u0131n arkas\u0131ndan nas\u0131l konu\u015fulur? \u015e\u00f6yle... Karde\u015f, kafan \u00e7ok g\u00fczelmi\u015f kodu da \u00f6yle yazm\u0131\u015fs\u0131n, zahmet edip yorum da yapm\u0131\u015fs\u0131n ama bu dizi kim? 255 dizinin neden son indeksi? Madem bu de\u011fi\u015fken bir dizinin son indeksi, de\u011fi\u015fkenin ad\u0131n\u0131 felancaDizininSonIndeksi filan diye koysan ne olurdu? Madem bu dizinin son indeksi 255, sen o bilgiyi ba\u015fka bir yerde de kullanacaks\u0131n ve yine ne oldu\u011funu kimse bilmeyecek. O bilgiyi etiketlesen can\u0131n m\u0131 \u00e7\u0131kard\u0131?\n\nVe nihayetinde o bildi\u011finiz ac\u0131 son ile kodu yazan ki\u015finin arkas\u0131ndan bir g\u00fczel dualar edilirdi.Bir de a\u015fa\u011f\u0131daki sat\u0131r\u0131 yazan kodcu var tabi...\n\n<pre class=\"lang:default decode:true \">#define COMMUNICATION_RX_BUFFER_SIZE 255\n#define COMMUNICATION_RX_BUFFER_LAST_INDEX (COMMUNICATION_RX_BUFFER_SIZE - 1)\n\n\/* We are starting from the last index because, the last value is the most recent one. By the way, we are inceasing the possibility to find the searched character *\/\nuint8_t commRxBufferCurrentIndex = COMMUNICATION_RX_BUFFER_LAST_INDEX;<\/pre>\n\n\u00d6nce hi\u00e7 bir \u015fey denmez, \u00e7\u00fcnk\u00fc her\u015feyi anlam\u0131\u015f olman\u0131n verdi\u011fi ayd\u0131nlanma hissi bedeni kaplar. Yani neticede bir kodda bir s\u00fcr\u00fc yerde 255 de\u011ferinde bir \u015feyler olabilir ama hangisinin ne anlama geldi\u011fini anlatmak etiketler olmadan \u00e7ok zordur. Etiket dedi\u011fim de #define ile yazd\u0131\u011f\u0131m \u015fey. Bu sayede kodda 25 ge\u00e7ti\u011fi zaman o 25'in oda s\u0131cakl\u0131\u011f\u0131 m\u0131 yoksa, amerikan\u0131n bir eyaletindeki ehliyet alma ya\u015f\u0131 m\u0131 oldu\u011funu anlayabiliriz. Bu olaya \"MAGIC NUMBER CODING\" deniyor. Kodda nereden peydah oldu\u011funu bilmedi\u011fimiz sabit de\u011ferler olmamal\u0131 :) Yaz\u0131l\u0131mda zaten mevzuyu anlamak zor, bir de yorumlarla sabitler do\u011fru kullan\u0131lmad\u0131 m\u0131 olay epey i\u015fgenceye d\u00f6n\u00fcyor do\u011frusu.\n\n\u015eimdi bir di\u011fer \u00f6nemli konu da veri ve bilgi kavramlar\u0131n\u0131n farkl\u0131l\u0131\u011f\u0131.Programlamada birbirine en \u00e7ok kar\u0131\u015ft\u0131r\u0131lan kavramlardan biri de bilgi ve veri kavramlar\u0131d\u0131r. Eee haliyle \u00e7ok say\u0131da yanl\u0131\u015fl\u0131k da yap\u0131l\u0131yor. \u00d6rne\u011fin bir 3. s\u0131n\u0131f \u00f6\u011frencisininn 'A' s\u0131n\u0131f\u0131nda olmas\u0131 bir bilgidir. O bilgi, say\u0131sal kar\u015f\u0131l\u0131\u011f\u0131 <a href=\"http:\/\/www.asciitable.com\/\">0x41 yani 65 olan veri<\/a> ile ifade edilebilir. Buradaki 65 say\u0131s\u0131, konu i\u00e7eri\u011fi bilinmeyen bir veridir. Keza \u00fclkemizde erkekler i\u00e7in emeklilik ya\u015f\u0131 da 65'tir. Yani bu bilgi de 'A' ile ayn\u0131 \u015fekilde bellekte saklanmaktad\u0131r. Aaaaaa?\n\ni='A', i=65, i=0x41;\n\nBunlar\u0131n hepsi ayn\u0131 de\u011ferde olan atamalar. Demek ki biz s\u00f6z konusu i\u00e7eri\u011fi\u00a0farkl\u0131 \u015fekilde sunsak, anlamland\u0131rsak da (bilgi), bu anlamland\u0131rman\u0131n bellekteki yerle\u015fimi ayn\u0131 olabiliyormu\u015f. Biz sadece okuyan adam daha iyi anlas\u0131n diye s\u0131n\u0131f\u0131 g\u00f6steren de\u011fi\u015fkene 'A' verisini(de\u011ferini) atad\u0131k, emeklilik ya\u015f\u0131na da 65'i atad\u0131k. Bu yakla\u015f\u0131m\u0131n de\u011fi\u015fkenin ad\u0131n\u0131 d\u00fczg\u00fcn koymaktan bir ad\u0131m \u00f6teye gitti\u011fini l\u00fctfen ka\u00e7\u0131rmayal\u0131m. Sonu\u00e7ta her iki durumda da derleyici bu ifadeleri 65 say\u0131s\u0131na \u00e7evirecek ve bu veriyi bellek g\u00f6z\u00fcne yazacak. Demek ki neymi\u015f? Sabit'i atarken bile o bilgiyi ifade etme \u015feklimiz, iyi kod yazmak i\u00e7in, anla\u015f\u0131labilir olmak i\u00e7in \u00e7ok \u00e7ok \u00f6nemliymi\u015f. Buradan \u00e7\u0131kar\u0131lacak say\u0131s\u0131z ibretler var. Par\u00e7alar\u0131 birle\u015ftirecek olursak asl\u0131nda 'A',65 gibi say\u0131lar\u0131 kodun \u00e7e\u015fitli yerlerinde tekrar tekrar yazaca\u011f\u0131m\u0131za, #define ile etiket olu\u015fturup o etiketi kullanmakta b\u00fcy\u00fck feyizler var.\n\nBu konunun bir \u00f6rne\u011fi de printf ile verilebilir. G\u00f6m\u00fcl\u00fc sistem yaz\u0131l\u0131mc\u0131lar\u0131, \u00e7ok pahal\u0131 bir fonksiyon olabildi\u011fi i\u00e7in printf'e kar\u015f\u0131 \u00e7ok mesafeli olsa da, konsepti anlatabilmek ad\u0131na \u00f6rne\u011fimizi onun \u00fczerinden vermemiz m\u00fcmk\u00fcn.\n\n<pre class=\"lang:default decode:true \">#include &lt;stdio.h&gt; \/\/printf i\u00e7in laz\u0131m\n#include &lt;stdint.h&gt; \/\/int8_t i\u00e7in laz\u0131m\n\nint main()\n{\nint8_t anlamsizDegisken = 65;\nprintf(\"Verinin karakter olarak [ismin bas harfi] yorumlanmas\u0131: %crn\", anlamsizDegisken );\n\nprintf(\"Verinin onluk tabanda sayi olarak [emeklilik yas\u0131] yorumlanmas\u0131: %drn\", anlamsizDegisken );\n\nprintf(\"Verinin on alt\u0131l\u0131k tabanda sayi olarak [protokol basligi] yorumlanmas\u0131: %xrn\", anlamsizDegisken );\n\nwhile(1); \/ille elle kapat\nreturn 0;\n}<\/pre>\n\nBu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda her seferinde ayn\u0131 veriyi yazd\u0131rman\u0131za ra\u011fmen, s\u0131rayla 'A', 65 ve 41 g\u00f6r\u00fcrs\u00fcn\u00fcz. Bu bellekteki verinin bilgiye d\u00f6n\u00fc\u015f\u00fcm\u00fcd\u00fcr. \u00dczerinde d\u00fc\u015f\u00fcn\u00fcld\u00fc\u011f\u00fcnde burada da say\u0131s\u0131z ibretler vard\u0131r.\n\nNeticede a\u011fz\u0131mdaki baklay\u0131 \u00e7\u0131kard\u0131m. Yorum sat\u0131rlar\u0131n\u0131n kullan\u0131m\u0131 ile ilgili felsefemi aktard\u0131m. Karar sizin. Karar\u0131n\u0131za sad\u0131k kal\u0131n\u0131z.Ard\u0131ndan sabitlerle ilgili \u00e7ok \u00f6nemli oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm kavramlar\u0131 aktarmaya \u00e7al\u0131\u015ft\u0131m. Umuyorum bir \u015feyler katm\u0131\u015ft\u0131r, \u015fimdi devam :)\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=186\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=220\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]","_tr_post_name":"gomulu-sistemler-15-gomulu-c-sabitler-ve-yorum-satirlari","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 4 : Sabitler ve Yorum Sat\u0131rlar\u0131","_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,1],"tags":[],"class_list":["post-198","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-genel"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-3c","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/198","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=198"}],"version-history":[{"count":0,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/198\/revisions"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=198"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}