From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Tue 02 Mar 2004 - 06:50:09 EST
Selamlar..
Ilginc bir konu. C gibi dillerde disiplin son derece onemlidir. Siz
fonksiyonun basina void yazmakla, o fonksiyonun deger dondurmesi
gerekmedigini derleyiciye bildirirsiniz. Asil konu buradadir. Bir void
fonksiyon deger dondurmedigi gibi sonlanmak zorunda da degildir.
Derleyici bilhassa optimizasyonlar vs. icin bu bilgiyi kullanabilir. Ama
aslen derleyici sizin geriye deger dondurmek istemediginizden emin olur.
Uzerinde durulmayan bir diger hususta, "Keep compiler be happy" gibi bir
kaide vardi, o mevzudur. Valued fonksiyonlarda, deger donduren tum
fonksiyonlarin "return val;" seklinde sona ermesi gerekirken void
fonksiyonlar return ile sonlanmayabilir. Hatta, bazi durumlarda
fonksiyon asla sonlanmayabilir. Asenkron fonksiyonlari dusunun, fork
gibi ilginc fonksiyonlari dusunun. fork, sonlaninca iki process'e birden
deger dondurur. Bunun gibi enteresan durumlar her zaman mevcuttur.
longjmp mevzusu gibi durumlar vs. vs.
Kisaca, void, aslen derleyiciye bu fonksiyon deger dondurmeyecek
demektir. Bu da,
1. return komutu kullanmayabilirim (kodun sonu=return).
2. Bu fonksiyon asla sonlanmayabilir (asla return koduna
ulasamayabilirsin).
3. Geriye hic bir zaman deger dondurulmeyecek, hata yaparsam beni uyar..
Gibi temel anlamlar tasir. Velakin, mesela, gcc 2.95.2 soyle bir kodu
kabul ediyordu:
void a(void) {
. return 1;
}
Bu bug kisa zamanda duzeltildi. cunku type casting gibi mekanizmalarin
duzgun isleyebilmesi icin derleyicinin veri tiplerini iyi tanimasi
elzemdir.
Saygi ve sevgiler..
> Merhabalar arkadaşlar
>
> Void konusunda yanılmıyorsam hatırladığım bir iki eklemeyi yapmak yerinde
> olur. fonksiyonlara pointer tanımlaması yaparak kullanımlarını daha basit
> hale getirebilirsiniz.Çoğu zaman programlarımızda header veya include
> deyimlerini kullanarak ulaştığımız fonksiyon tanımlama kısımlarında tip
> tanımlama alanlarında void türde fonksiyonların tanımlandığını görürüz.İşte
> bu noktada parametreleri ne olursa olsun herhangibir fonksiyonun o
> fonksiyona giriş paremetreleri doğru girildiğinde çağrılacabileceğini
> göstermektedir.Yani bir fonksiyon içinde çağrılan bir diğer fonksiyona
> adresi ile ulaşabilirsiniz anlamına geliyor.Ve bu tanım kısmında fonksiyonu
> void * function bildirimi ile tanımlarsınız , tabii diğer fonksiyon
> içinden.Böylece örneğin adresini elde edebildiğiniz herhangibir
> karşılaştırma fonksiyonunu bu ister integer olsun isterse char olsun (veya
> string) sonucu uygun formatta ekrana basacak şekilde asıl fonksiyonunuzdan
> bahsedilen yardımcı fonksiyonu kullanarak ulaşabilirsiniz anlamına
> geliyor.Uzun zamandır bu tür fonksiyonları kullanmadığımdandolayı birkaç
> ayrıntıyı unutmuş olabilirim
>
> Kusuruma bakmayın artık
>
>
> -----Original Message-----
> From: linux-programlama-bounce@liste.linux.org.tr
> [mailto:linux-programlama-bounce@liste.linux.org.tr]On Behalf Of serdar
> Sent: Tuesday, March 02, 2004 9:54 AM
> To: linux-programlama@liste.linux.org.tr
> Subject: [linux-programlama] Re: merhaba .. ilk mailim .
>
>
> Isinize yararsa bildiklerimi anlatayim.=20
> i) C programlama dili ile sorun yasamak istemiyorsaniz pointer kavramini
> tam anlamiyla cozmek gerekiyor. Buda benin gorebilgigim zamanla oluyor.
>
> ii) Void benimde C'ye basladigim zamanlarda kafami karistirmisti. Bir
> fonksiyonun protatip'ine void yazilmasiyla yazilmamasi arasinda ne fark
> olabilir?
> void fonk(...) protatipi fonk fonksiyonunun geriye birsey
> donduremeyecegini anlatir.
> fonk(...) seklinde bir protatip tanimlarsaniz derleyici otamatik olarak
> bu fonksiyonun geri donus degerini "int" kabul eder.=20
> Eger geri donus degerine ihtiyac yoksa bir fonksiyonu void fonk(...)
> seklinde tanimlamak mem. acisindan daha tasarufludur.
>
> iii) main() fonksiyonu c programinda ilk calisacak fonksiyondur. Main
> fonksiyonu bitmesi programinda sonlanmasi anlamina gelir. Diger
> fonksiyonlar main icerisinde kullanilir ve main sonlanmadan once hepsi
> sonlanmasi gerekir. (Sonlandiklarinda donulecek yer yine main'dir.)=20
>
> Main fonksiyonunu ;
> void main(void) seklinde tanimlamak mainin(programin) giris argumaninin
> ve geri donus degerinin olmayacagi anlamina gelir.=20
> int main(int argc, char *argv[]) seklindeki bir main tanimlamasi
> main'in(programin) giris argumanlari olabilecegini ve geri donus
> degerinin int oldugu anlamina gelir.
>
>
> Saygilarimla ...
> =20
>
>
> -----Original Message-----
> From: linux-programlama-bounce@liste.linux.org.tr
> [mailto:linux-programlama-bounce@liste.linux.org.tr] On Behalf Of cambaz
> samet
> Sent: Monday, March 01, 2004 7:40 PM
> To: linux-programlama@liste.linux.org.tr
> Subject: [linux-programlama] merhaba .. ilk mailim .
>
> =FEimdi benim sorum C programlama dili ile ilgili
> olucak..=20
>
> =FEu void() fonksiyonunu anla=FE=FDlcak =FEekilde hi=E7biryerde
> dinleyemedim.. hi=E7bir=FEey geriye bilgi
> dondurulmeyecek anlam=FDna geliyormu=FE.. eh tamamda nas=FDl
> yani void() geriye bilgi gondermiyecekse neden
> kullan=FDls=FDnki ?
>
> di=F0er bir soruda...
>
> main() program=FDn baslad=FD=F0=FD ve genellikle son buldu=F0u
> bir fonksiyondur? nas=FDl yani ...... art=FD
>
> void(main) ne anlama geliyor o zaman program
> baslam=FDyacak anlam=FDna gelmezmi..
>
> ya da main(void) <bu ile >void(main) aras=FDndaki fark
> nedir...
>
> ah su void() fonksiyonu.....
>
> basta serdar koylu olmak uzere ki(ciddiyim serdar
> koyluye hayran=FDm onun kadar kolay bir programlama
> o=F0reten gormedim hatta bir yerde programlama sorusunla
> kars=FDlast=FDm=FD an=FDnda cevaplar ama super cevaplar:)
>
> sevgi ve sayg=FD..