C'de Atama ile İlk Değer Verme Arasındaki Fark

10:34


Yerel degisken bildirimi fonksiyonun herhangi bir yerinde tanimlanabilir. AMA yürütülebilir deyimden sonra bildirim deyimi kullanilamaz. (C89)
image
,
Atama ile ilk deger vermeyi birbirinden ayirmak gerekir. Örneğin = isaretinin kullanildigi iki farkli yer var bunlar atama operatörü “ x=30 " ve bildirim deyimi " int x=30 ”. Bu iki “=" birbirinden farkli anlamlara gelmektedir.
image
C++’da böyle bir sorun söz konusu değildir. Dosyamızın uzantısını .cpp yaparak derlersek aşağıda görüldüğü gibi herhangi bri hata vermeyecektir.
image
Program sorunsuzca çalışacaktır.
image
Tekrar bildirim ile atama işlemlerinin farkına değinmek gerekirse;
image
image
Atama var olan -hayatta olan- bir nesneye yapılır. ( Derleyici int tmp=0 dedigimizde tmp’i aramaz. ) Bu kural'ın getiriliş amacı DEC mimarilerine uygunluk olarak kabul edilmiştir. C'nin sonraki standartlarında bu kural kaldırılmıştır.

conio.h kutuphanesini Linux ortamında kullanma

09:23

Windows derleyicileri özgü olan conio kütüphanesinin fonksiyonlarını kullanmamız mümkün değildir. Çünkü standart bir C kütüphanesi değildir. Bu nedenle Linux'te bazı işlemler yapıldıktan sonra bu kütüphaneye özgü fonksiyonları kullanmamız mümkün olacaktır.


Aşağıda görüldüğü gibi derleme işleminde preprocessor conio.h' ı bulamadı ve hatayla karşılaştık
.

libconio isimli implementasyon açık kaynak kodlu bir projedir. Ve standart bir C fonksiyonu olmadığı için zorunlu olmadıkça bu kütüphaneyi kullanmak riskli olacaktır. libconio isimli dosyayı linux' te herhangi bir yere indiriyoruz.


sıkıştırılmış dosyayı açıyoruz ve dosyanın içine giriyoruz.


Ardından sırayla :

./configure
make
make install



 komutlarını çalıştırıyoruz ve hatasız bir şekilde kurulum gerçekleştiriliyor.


Kodumuzu tekrardan biraz güncelleyip derleme işlemini gerçekleştiriyoruz.


Burada önemli nokta gcc'ye parametre olarak  -lconio  'yu girmemiz.


Programı derleyip çalıştırırsak kodumuzun başarıyla çalıştığı görülecektir.

Klayveden EOF simülasyonu

06:03
Kod geliştirirken EOF (End of File) gelene kadar okuma yap gibi işlemlerde klavyeden bunu nasıl simüle edileceği biçimi windows ve UNIX türevi işletim sistemlerinde farklılık göstermektedir.



Yukarıda görüldüğü gibi stdin dosyasından EOF gelene kadar okuma yapılmaktadır. stdin dosya ise bunun için bir şey yapmamıza gerek yok fakat stdin klavye ise burada yapılması gereken şey klavyeden EOF'ye karşılık gelecek bir şeyler girmemiz gerekir. Peki ama bunu nasıl başarabiliriz?

Windows'ta bu işlem:   ctrl + Z
Unix'te bu işlem:           ctrl + D                şeklinde giriş yaparsak program while döngüsünden çıkacaktır.

qsort ile sıralama

09:39

void qsort(
void *base, 
size_t nmemb, 
size_t size,
int(*compar)(const void *, const void *)
);


  1. parametre: sıralanacak dizinin başlangıç adresi
  2. parametre: sıralanacak dizinin boyutu
  3. parametre: verilen dizideki elemanların byte uzunluğu
  4. parametre: karşılaştırma fonksiyonunun adresi

qsort fonksiyonu quick sort algoritmasına göre verilen diziyi karşılaştırma fonksiyonun çalışma mantığına uygun olarak sıralar. Burada karşılaştırma yapılacak fonksiyonu dikkatli yazmamız gerekmektedir. Bizim tarafımızda en önemli iş yükü karşılaştırma fonksiyonunu yazmaktır.



Aşağıdaki programdaki sıralama fonksiyonu ise iki void * adresi struct LESSON* haline getirip struct içindeki ders isimlerine göre strcmp fonksiyonu kullanılarak karşılaştırma işlemi gerçekleştirilir.


Sıralama sonuçlarının ekran görüntüsü aşağıdaki gibidir:


Karşılaştırma işleminin başına - koymak sıralamayı tersine çevirecektir.


int bir diziyi sıralamak için ise aşağıdaki gibi bir program yazılabilir.


Aşağıdaki karşılaştırma fonksiyonu iki void * adresi int * 'a dönüştürüp içeriğini karşılaştırmaktır.

Benzer karşılaştırma işlemi aşağıdaki gibidir.





C'de SYSLOG mekanizmasının kullanılması

07:43

Proje gerçekleştirirken log mekanizmasının projeye konulması hem debug aşamasında hem de release aşamasında faydalı olacak bir özelliktir. Linux'te syslog mekanizmasını C'de kullanılabilecek kütüphaneler mevcuttur. syslog.h başlık dosyası dahil edildiğinde openlog,syslog,closelog,setlogmask fonksiyonları kullanılacak fonksiyonlardır.



openlog,syslog,closelog sistem log mekanızmasına mesaj göndermek için kullanılır. openlog sistem log mekanizması ile program arasında bağlantı(connection) açmak için kullanılır.




syslog log mesajı oluşturmak (generate) için kullanılır.


closelog ise sistem log mekanizması ile program arasında açılan bağlantıyı (connection) sonlandırmak için kullanılır.


setlogmask fonksiyonu adından da anlaşılacağı gibi log öncelik mask değerini set etmek için kullanılır.


/var/log altındaki syslog dosyası içine process'imizin ekleme yaptığı görülmektedir.

C - Preprocessor ( Ön işlemci ) Kavramı

13:48

  • Preprocessor derleyiciden önce çalışan bir programdir. Preprocessor C dilini bilmez, Makina koduna dönüştürme gibi bir yeteneği yoktur. Text düzenleme işlemleri yapmaktadır.

  • C'de fonksiyon ve değisken isimlerinin tamamı büyük harfle yazılmaz. Büyük harfle yazılmış bir isim görürsek bunun önişlemciye ilişkin bir atom olduğunu anlarız.

  • include anahtar sözcük değildir. Preprocessor #include (replace) işlemini yaptıktan sonra komutu siler. Dolayısıyla derleyici # ile başlayan hiçbir satırı görmeyecektir.
    • null directivedir, hata vermez. Hiçbir şey de yapmaz.

  • Belli başlı Preprocessor identifier'ları aşağıdaki gibidir:

#include

  • Preprocessor' ün "#include" komutu için yaptigi iş en basitinden kopyala - yapıştır işlemidir. " #include " ile başlayan bir satır gördügünde #include' dan sonraki dosyayi bulur ve #include' un oldugu satırı silerek buraya yapıştırır. 

Aşağıda foo.h dosyasının içeriği görülmektedir. header dosyasının içine ekrana çıktı veren bir main fonksiyonu yazılmıştır.

main.c içine ise sadece #include "foo.h" eklenmiştir. Ve görüldüğü gibi ekrana beklenen çıktı verimiştir. Yukarıda bahsedildiği gibi #include kabaca  kopyala - yapıştır işlemidir.


  • #include :Verilen dosyanın içeriğini bu komutun bulunduğu yere yapıştırılmasını sağlamaktadır. Dolayısıyla #include '' foo.txt '' de yazabiliriz. 

    • Standart başlık dosyaları derleyicilerin verdiği dosyalar açısal ( < > ) içine alınırken, 3. part başlık (header) dosyaları tırnak ( ''  '' ) içine alınmaktadır. Burada bu şekilde bir ayrıma gidilmesinin sebebi koda bakana bir algı oluşturmak amaçlanmıştır.



    • Derleyiciler genelde include adında bir klasör bulundururlar ve header dosyaları genelde bunların içinde bulunurlar.

    #define


    • İyi bir C programcısı Standart kütüphanenin define tanımlamalarının hangi başlık dosyasında define edildiğini bilmesi gerekir.

    • Preprocessor komutlarının sonuna " ; " konulmaz. Bazı noktalarda hataya yol açabilmektedir.



    • include komutunda preprocessor 'ün çalışma mantığı kodları yapıştırdı, baştan tekrar başladı ve o başlık dosyalarının içinde de komut varsa onları da tekrardan işleyecektir. Bir işlem yaptıktan sonra tekrar baştan başlamaktadır.

    • Preprocessor isminin farklı iki değere define edilmesi tanımsız davranıştır.

    • Preprocessor de identifier'ın karşılığı olarak bir şey yazılmazsa Preprocessor identifier'ı boş ifadeyle yer değiştirir.



    • Preprocessor identifier 'ı belirgin bir ifade olarak istemektedir. Bu nedenle sayısal bir ifadeyi identifier olarak kabul etmemektedir.



    Visual Studio'da C kodlarını C veya C++ derleyicisi ile derleme

    09:47

    Visual Studio IDE'sinde otomatik olarak uzantısı .c ise c derleyicisi ile .cpp ise C++ derleyicisi ile derleyebilmektedir. Fakat bu durumu aşağıdaki gibi bir ayarla değiştirmek mümkündür. Yani C kodlarını da C++ derleyicisi ile derlemek mümkün.




    Neden böyle bir ayara ihtiyaç vardır?

    C++ ile gelen Clean C denilen bir kavram vardır. Geleneksel C ile gelen bazı kuralları kullanmazsak bu C'nin %1'lik bir kısmıdır  C++ derleyicilerinde de derlenebilecek C kodları oluşturulabilir. Bu durumda hem daha güvenli hem de daha taşınılabilir kodlar oluşturmak mümkündür. Bu amaçla bu derleme ayarları değiştirirerek çalışmak istenebilir.