Gömülü C – 11 : Döngüler

Selamlar efendim. Bugünkü yazımızın naçizane konusu, C dilindeki döngü yapıları olacak. Kontrolsüz dönüşler mide bulandırır malumunuz. İşbu döngüleri nasıl yapar, nasıl ederiz de dönme dolap misali zevk verir hale getiririz bunu dilin döndüğünce anlatmaya çalışacağım. Nasıl anlatacağım? Örnekler ile efendim.

Bir kaç basit kural ile, olayın özünü aktarmaya çalışacağım. Meselenin aslı ortaya kondu mu, çözüm bulmak kolay olur demişler 🙂

Döngülerin Sabit Limitler İle Sınırlandırılması

Efendim malumunuz, ağzımızdan çıkan iki kelimeden biri “sınırlı” sözcüğü. Gömülü sistemler şöyle sınırlı, böyle sınırlı deyip duruyoruz. Madem her-şey böyle sınırlı, sonlu sürede bitmesini istediğimiz işler için de bir sınır koymamız şart 🙂

Bir kere döngü dediğimiz nanenin, statik olarak öngörülebilir, sabit bir üst limitinin olmasında sayısız faydalar var. Bunu sadece ben demiyorum, kodunuzu hangi statik kod analiz programına verseniz, aynısını size o da söyleyecek. Yalnızca onun benim kadar nezaketle söylemeyeceğini bildirmek isterim.

Peki her döngü ille sınırsız mı olacak? Bir sınır konulanlar evet. Ama task tanımlamalarında vs yapılan bazı döngülerin özellikle (sözde) sonsuz olması gerekir. O zaman da ben bunu bilinçli yaptım, ne yaptığımın da farkındayım diye bu döngünün tepesine ecnebice;

ya da kendi dilimizde;

gibisinden birşeyler yazmakta fayda var.

Muhteremler, tamam peki sınırlı döngü olacaksa sınır olur zaten dediğinizi duyuyorum. Önemli nokta bu sınırın, deterministik ve sabit bir sınır olması. Hemen mevzuyu yine örnekle açıklayayım.

Kötü Örnek:

Mesela bu yukarıdaki döngü ne zaman biter? Mantıken bitmez aslında ama, pratikte indexLimit değeri taşıp sıfırlanıp index değerine tur bindirince bir yerlerde belki biter. Bu durum oldukça çirkin bir durumdur ve genelde yok yere hem uygulamanın kompleksitesini doğrusal olmayan yani tahmin edilmesi güç noktalara getirebilir, hem de gereksiz yere çokça güç tüketimine sebep olur. Mazallah daha fena hadiselere de sebep olabilir ama onları söylemeye dilim varmıyor.

Peki ne yaparız? Bir önceki yazıdan kopyayı çekiyoruz.

İyi Örnek:

Yine imdadımıza define yetişti. Bizim dayının kulakları çınlasın. Artık döngünün, çiçek gibi bir limiti var. Hem ne olduğu hem ne olacağı gayet anlaşılır. Kodu makine için değil insan için yazdığımızı hatırlayacak olursak, konsepti anlatan kodlar yazmanın ehemmiyetini idrak etmemiz kaçınılmaz olur.

Erişilebilir Döngü Sınırı

Şimdi diyelim sınır, öngörülebilir bir sınır. Ama arada mayınlı bölge var ulaşmak mümkün değil. Böyle sınır, ancak hasret ve hüzün doğurur. Döngüyü kontrol eden sayacın, döngü sınırına varabilmesi gerekir. Bazen farketmeden, erişilemez döngü sınırları koyuyoruz. Bundan çekinmek ve tiksinmek lazım.

Misal üzerinden gidelim yine ki mevzu havada kalmasın, ayakta kalmasın, yerine otursun. Diyelim döngüyü kontrol eden sayaç uint8_t cinsinden ve döngünün sınırı da 2000. Bu durumda aklı başında herkes bir durur ve der ki, aga bu nedir? Niye böyle der? Çünkü uint8_t tipinde birisi asla ve asla 2000 değerine ulaşamaz. İstemsiz olarak yaratılmış bir sonsuz döngüye hoşgeldin diyebilirsiniz. Hatta hoş geldin faslından sonra çay kahve de ikram edebilirsiniz çünkü döngüden asla çıkılmayacağından her şey için yeterince zaman olacaktır. Tabi bu durumda döngünün dışını yani özgürlüğü unutmak gerek. Neyse, demek ki neymiş; erişilemeyecek döngü sınırı kötüymüş.

Kötü Örnek:

Çok söze gerek yok. Peki iyisi nasıl olur bunun? 1000’e kadar sayacaksanız ona göre bir sayaç tipi seçmekte fayda var. uint16_t olabilir mesela ama 2 byte sıkıntınız yoksa şayet, ben gelecekteki değişikliklere de pay bırakmak için uint32_t tanımlardım.

İyi Örnek:

İyi örnekte, sayaç tipini uint32_t tanımlayarak, uzakları yakın ettik 😀 Artık döngümüz ulaşılabilir bir sınıra sahip!

Döngünün Namusu

Biraz ağır olmuş olabilir başlık ama, döngünün kodda da bir sınırı olmalı.

Önemli Nokta
Süslü parantezler döngünün sınırıdır. Sınır namustur demişler. Bu nedenle hataların önüne geçmek için döngüleri de lütfen sınırsız, parantezsiz kullanmayınız. Tekrar söylüyorum, zaten hata çıkarabilecek tonla şey varken, bir tane daha eklememizin hiç gereği yok.  

Hemen hızlıca bu hususta da kötü örneği ve iyi örneği hızlıca verelim ve bekleme yapmaksızın devam edelim.

Kötü Örnek:

İyi Örnek:

Demek ki neymiş, süslü parantez yine canmış cananmış 🙂

Şeytani Sözcük: goto

Arkadaşlar bu goto belasını, dış mihraklar başımıza sarmıştır. Sırf kodlarımız hatalı olsun, anlaşılmasın, gelişemeyelim diye önümüze konmuş şeytani bir sözcüktür bu. Kullanılmamasının sevpo kazandırdığı, sayısız makale ile sabitlenmiştir. Tek söyleyeceğim: yapmayın, etmeyin.

Hiç elim gitmiyor goto olan bir kodu yazmaya ama kötü örnek olarak yine yazacağım.

Kötü Örnek:

İyi Örnek:

goto belasını kullanmadan da, emin olun ki yapmayı istediğiniz şeyi yapmak mümkün. Dolayısıyla çirkinleşmemek adına, goto kullanmayalım.

Rastgele Değişken Tanımlama

Şimdi bu başlık “rastgele değişken tanımlamak” diye anlaşılmasın, başlık direk yapmamanız gereken bir şeyi açıkça anlatmak için böyle konulmuştur. Önerimiz basit; “rastgele değişken tanımlama dostum”. Ne demek istiyoruz burada, esasen döngünün içinde değişken tanımalamasınız iyi olur demek istiyoruz.

Gömülü C derleyicilerinin hepsi C99 değildir. Bazısı yalnızca ANSI C’ye izin verir. Dolayısıyla yazdığınız kod her yerde derlensin istiyorsanız, döngü içinde değişken tanımlama lüksünden vazgeçiniz.

Kötü Örnek:

İyi Örnek:

Yakışıklı While

Hep for üzerinden gittik. Bunlar aslında while için de geçerli. Ama while için de yakışıklı  görülen bir şablonu sizlerle paylaşmak isterim. Ama önce artizlik belirtisi olarak yazılan kötü bir örneği sizlerle paylaşacağım.

Kötü Örnek:

Burada yazar, “true” yani dogru ifadesini yakalamak için !0 yapmış. !0 ifadesi her zaman yanlışın değili, yani doğru olacağından, while burada sonsuz döngü olmuş olur. Ancaaaaak, döngünün her bir dönüşünün başında, sıfır değeri 1 kere NOT işlemine tabi tutulur. Bu da her döngüde 1 CYCLE yani 1 saat darbesi kadar iş gücünü çöpe atmaktır. Yani bu sonsuz süreli bir israftır. Böyle bir  hatanın tarifi olmaz dostlar, yapmayın.

İyi Örnek:

İyi örnek çiçek çiçek. Söylenecek söz yok 🙂

Eveeet, bir programın daha sonuna geldik. Umarım sıkılmadan okumuşsunuzdur.

Unutmadan; yazıları beğendiyseniz eğer,  faydalanabilecek arkadaşlarınızla da paylaşabilirseniz sevinirim.

Şimdi devam…

Önceki Sayfa   Sonraki Sayfa

 

Leave a Reply