C'de multi solution projelerde visual studio ayarları

11:38 ,

C veya C++ projelerinde birden fazla projeyi aynı anda yönetmek bir projenin çiktisini .lib yapmak ve diğer projenin bu .lib'i kullanması gibi senaryolar yazilim proje dünyasında sık karşılaşılan durumlarıdır. Visual Studio yardımıyla biz de temel düzeyde bir örnek oluşturalım. Bir tane .lib üreten proje bir tane de bu .lib 'i kullanan projemiz olsun.



yapmamız gereken iki ayar mevcuttur. ilk olarak oluşturduğumuz kullanan tarafta add new reference kısmına .lib üreten projemizi eklemek


ardından .h dosyasini kullanan tarafa eklemek yeterli olacaktır.



 ardından funcpool.c 'de Karesi fonksiyonunda yaptiğimiz bir değişiklik ardından projerler derlendiğinde otomatik olarak güncel versiyon üzerinden çalıştığı görülecektir.


if deyimi ile ilgili tüyolar

10:37

  • if deyimi yazılırken if’in içinde birden fazla kontrol yapılacaksa if(exp1 && exp2 && exp3 … gibi durumlarda) başa en az maliyetli olan konur ki çalışma anında kontrol maliyeti düşsün ya da olumsuz olma ihtimali yüksek olan varsa başa gene bu ifade konulur ki maliyet açısından avantajlı çalışabilsin.
  • Bütün deyimler basit deyim ise virgül operatörü kullanılarak fazlalıklar elenebilir.

image
  • if(Foo()) ifadesinde Foo fonksiyonu geriye bir şey döndürmüyorsa logic true olacaktır hata vermeyecektir ve if ifadesinin içi her zaman çalışacaktır.
  • C’de redundancy kavramı fazladan ,fuzuli kod yazma anlamına gelmektedir. C’de bir kodu yazmadan da oluyorsa o kodu yazmamak genellikle doğru olacaktır. Mesela
image

olarak ta yazabiliriz. Burada görüldüğü gibi else ifadesine gerek yoktur.

image

ifadesi aslında y=x anlamına gelmekedir.

image

  ifadesi aslında z=y==x ifadesiyle aynı çalışacaktır.

image

Yukarıdaki else hangi if’e aittir. Bu else ingilizcede dangling else denir. Ve C ‘de bu else içteki if’e aittir.

  • if else veya switch-case’lerde sıralama yapılırken olma olasılığı yüksek olan ifadeler yukarı yazılır ki fazla kontrolden sakınılmış olsun.


C'de memory alanlarının kopyalanması

11:37
Aşağıda anlatacağım C fonksiyonları bir memory bloğundaki verileri başka bir memory bloğuna kopyalamak için kullanılmaktadır.

memcpy:

memcpy bir memory bloğundaki bilgiyi diğer memory bloğuna fonksiyona geçirilen 3. parametrede geçen değer kadar byte kopyalaması yapar. memory overlap sorununa karşı korumasız durumdadır. Yani source ve destination memory alanlarında üst üste gelme durumu varsa fonksiyon istenilen çıktıları üretememektedir.


Aşağıda örnek bir kod ve çalışması görülmektedir.



 Aşağıda 24 byte kopyalama yapılmıştır. Böylece Null karakter kopyalaması da ptrDest dizisine kopyalanmıştır.





memccpy:

memccpy memcpy ile benzer çalışmakta 3. ve 4. parametreler  ise 3. parametrede karakter olarak gönderilen değerle karşılaşıncaya kadar kopyalama yapar bulamazsa 4. parametre verilen boyuta kadar kopyalama yapar.


  Aşağıdaki örnekte B harfini gönderene kadar ya da maksimum 24 byte kopyalama yapar.



mempcpy:

mempcpy fonksiyonu memcpy ile benzer çalışmakta yalnızca geri dönüş değeri olarak kopyalama işlemi yaptıktan sonra (hedef alana) bir sonraki adresi geri dönüş olarak verir. Bu fonksiyon daha çok birden fazla hafıza alanından birleştirme yaparken kullanılır.


 Örnek bir kullanım aşağıdaki gibidir:





memmove:

memmove memcpy ile benzer yapıdadır. Fakat memory overlap'e karşı önce kaynağı temp bir alana kopyalar ardından hedef olarak verilen yere temp alandan kopyalama yapar. Daha güvenli bir kopyalama sağlar ama memcpy 'ye göre daha yavaştır.


 Örnek bir memmove kullanımı aşağıdaki gibidir:




 Aşağıda memory overlap durumuna bir örnek verilmiştir.





strcpy:

strcpy fonksiyonu ise hedef ve kaynak parametrelerini alır hedefte verilen string'i null karakter görene kadar hedef alana kopyalamaya çalışır. Ya da üçüncü parametre olarak verilen byte kadar kopyalama yapar. Eğer verilen uzunluk dahilinde string içinde Null karakter yoksa kopyalama sonrası hedef alanda sonunda null karakter olmayan bir string olacaktır.


string kopyalama işlemlerinde daha çok strcpy fonksiyonu kullanılmaktadır. Örnek bir uygulama aşağıdaki gibidir:







bcopy:

deprecated olmuş bir fonksiyondur. memcpy ile benze çalışmaktadır. Memory overlap durumuna karşı korumalıdır.


 Örnek bir uygulama:





cURL kütüphanesinin C'de Kullanımı

10:46 ,


Derlediğimiz lib dosyasını projemize dahil etmek için yapmamız gereken bazı ayarlamalar vardır. ilk önce yapılması gereken preprocessor definition kısmına BUILDING_LIBCURL tanımlamasının girilmesi gerekmektedir.





Ardından Additional Dependencies kısmına ise libcurl.lib,ws2_32.lib,wldap32.lib kütüphanelerinin girilmesi gerekmektedir.




.lib dosyamızın yeri de projemize gösterilmesi gerekir.







Preprocessor'ün ihtiyacı olan başlık dosyalarının yerinin de gösterilmesinin ardından cURL artık kullanılmaya hazır hale gelmiştir.




Eğer bu noktada linker hatası aldıysanız problemin 32 Bit - 64 Bit farkı olma olasılığı yüksektir.





Çünkü biz kütüphanemizi 32 Bitte derlemiş olabiliriz.(öyle yaptık)


Bu noktada yapılması gereken şey libcurl projesini 64 Bitte derlemek olacaktır. Ardından .lib dosyasını eskisiyle değiştirilmesinin ardından projemiz başarıyla çalışacaktır.









Bu noktada projemizi 32 Bit'e çeksek bu sefer yine linker hatası verecektir. Çünkü libcurl'ü 64 Bitte derledik.











cURL kütüphanesinin C Projesine dahil edilmesi

10:50 ,




cURL kütüphanesi C ile http gibi web isteklerini gerçekleştirmek için kullanılan bir kütüphanedir. Öncelikle yapılamsı gereken web sitesinden ( http://curl.haxx.se/ ) ilgili dosya indirilir.




ve dosya içeriğindeki vs-> vc8 -> lib içindeki visual studio proje kısayolu ile libcurl projesi açılır. 


Projenin çıktısı .lib dosyası olacaktır. Derleme işleminin ardından .lib dosyamızın oluştuğu görülecektir. 



Projeyi derlemeden önce aditional include library kısmına projenin ihtiyacı olan dosyaların yerlerinin düzgün verildiğine dikkat ediniz. 



Ardından projeyi build ettiğinizde projenin derlendiğini göreceksiniz. Burda dikkat edilmesi gereken parametreler 32 Bit - 64 Bit ve Debug -Release Mod seçenekleri olacaktır.

Umask Fonksiyonu


umask user mask  kelimelerinden türetilmiştir. Dosya oluştururken hangi haklarla oluşturulacağını ayarlayan C POSIX fonksiyonudur. Kısaca fonksiyon 0777 ile mask değerini logical and (&) işlemine sokar.



umask(0) demek oluşturulan dosya tüm gruplar için  rwx haklarına sahip olacağını ( u=rwx, g=rwx, o=rwx ) umask(777) ile ise hiçbir hakka ( u=, g=, o= ) sahip olunmayacağını belirtir.



Aşağıda görüldüğü gibi umask değerinin değiştirmezsek user için rwx diğerleri için hiçbir hakka sahip olmadan oluşturduğu gözükür.


Bu işlemin benzerlerinin shell üzerinden de aşağıdaki şekilde yapılabilir.



umask -S ile oluşturulacak dosyaların hangi haklarla oluşturulacağını u(ser), g(roup), o(ther) belirtir.