Fonksiyon prototipleri
FONKSİYON PROTOTİPLERİ
ANSI C'nin en önemli özelliklerinden biriside fonksiyonların ilk halleridir.(prototipleridir) Bu özellik, ANSI C komitesi tarafından C++ geliştiricilerinden alınmıştır. Bir fonksiyon prototipi, derleyiciye fonksiyon tarafından döndürülen verinin tipini, fonksiyonun almayı beklediği parametre sayısını, parametrelerin tiplerini ve parametrelerin sırasını bildirir.Derleyici, fonksiyonların ilk hallerini ( prototiplerini ) fonksiyon çağrılarını onaylamakta kullanır. C'nin daha önceki sürümleri bu tarzda bir kontrol yapmazdı. Bu sebepten, derleyici hataları belirleyemeden fonksiyonlar çağrılabiliyordu. Bu tür fonksiyon çağrıları, çalışma zamanlı ölümcül hatalara ya da güç fark edilen mantık hatalarına sebep oluyordu. ANSI C ,bu eksikliği gidermiştir.
İyi Programlama Alıştırmaları 5.8
C'nin kontrol yeteneklerinden faydalanabilmek için tüm fonksiyonların ilk hallerini (prototiplerini) programa dahil etmeliyiz. Uygun kütüphanelerdeki öncü dosyalardan, standart kütüphane fonksiyonlarının ilk hallerini ( prototiplerini ) elde etmek için #include önişlemci komutlarını kullanın. Ayrıca siz ve/ve ya arkadaşlarınızın kullandığı fonksiyon prototiplerini içeren öncü dosyaları elde etmek için de #include kullanın.
Şekil 5.4 'deki maksimum fonksiyonunun prototipi
1 |
int maksimum ( int, int, int );
|
şeklindedir.
Bu fonksiyon prototipi, maksimum fonksiyonunun int tipinde 3 argüman alacağını ve sonuç olarak int tipinde bir sonuç döndüreceğini belirtir. Dikkat edilirse, fonksiyon prototipiyle maksimum fonksiyonunun tanımının ilk satırı, parametrelerin isimlerinin (x, y ve z) bulunmayışı haricinde aynıdır.
İyi Programlama Alıştırmaları 5.9
Parametre isimleri, belgeleme amaçlı olarak fonksiyon prototipleri içinde yazılabilir. Derleyici, bu isimleri ihmal eder.
Genel Programlama Hataları 5.9
Fonksiyon prototipinin sonuna noktalı virgül koymamak bir yazım hatasıdır.
Fonksiyon prototipiyle eşleşmeyen bir fonksiyon çağrısı, yazım hatası oluşmasına sebep olur. Ayrıca eğer fonksiyon tanımıyla fonksiyon prototipi birbirine uymazsa, başka bir hata daha oluşturulur. Örneğin, Şekil 5.4' deki örneğimizde fonksiyon prototipini
1 |
void maksimum (int,int,int) ;
|
şeklinde yazmış olsaydık, derleyici fonksiyon başlığındaki geri dönüş tipi olan int ile fonksiyon prototipindeki geri dönüş değeri void birbirinden farklı olduğundan hata üretecekti.
Fonksiyon prototiplerinin önemli bir özelliği de argümanların zorlanmasıdır yani argümanların uygun tipte olmasının sağlanmasıdır. Örneğin, sqrt matematik fonksiyonunun math.h dosyasındaki prototipi double argüman ile belirlenmiş olsa da tamsayı argümanıyla da çağrılabilir ve fonksiyon hala doğru olarak çalışır. Örneğin,
1 |
printf ( "%.3f\n ", sqrt ( 4 ) );
|
ifadesi, sqrt ( 4 ) değerini doğru olarak hesaplayacak ve 2.000 değerini yazdıracaktır. Fonksiyon prototipi, derleyicinin tamsayı olan 4 değerini sqrt fonksiyonuna geçirmesinden önce bu değeri double değer olan 4.0'a çevirmesini sağlar. Genel olarak, fonksiyon prototipi içindeki parametre listesiyle uyuşmayan argüman değerleri, fonksiyon çağrılmadan uygun tipe dönüştürülür.
Bu dönüşümler eğer C'nin dönüştürme kurallarına uyulmazsa, yanlış sonuçlara sebep olabilir. Bu kurallar, bir tipten öteki tipe herhangi bir hata olmadan çevrimlerin nasıl yapılacağını belirtir. Mesela, yukarıdaki sqrt örneğimizde int, değerini kaybetmeden otomatik olarak double tipe dönüştürülmüştür. Ancak, double tipte bir veri int tipine çevrilseydi, o zaman double tipindeki verinin ondalıklı kısmı kaybolacaktı. Büyük tamsayı tipleri küçük tamsayı tiplerine dönüştürülürken (örneğin, long short'a çevrilirse) yine kayıplar olur.
Dönüştürme kuralları, otomatik olarak 2 ya da daha fazla veri tipi içeren ifadelere uygulanır. Bu tarzda ifadelerde her değerin tipi, otomatik olarak ifadedeki en yüksek veri tipine dönüştürülür. (aslında her değerin geçici bir kopyası oluşturulur ve bu kopya ifadede kullanılır-orijinal değerler değişmeden kalır) Şekil 5.5'de, veri tiplerini en yüksek tipten en düşük tipe doğru sıraladık ve her tipin printf ve scanf dönüşüm belirteçleriyle kullanımlarını gösterdik .
| VERİ TİPLERİ | printf ile kullanımları | scanf ile kullanımları |
| long double | %Lf | %Lf |
| double | %f | %lf |
| float | %f | %f |
| unsigned long int | %lu | %lu |
| long int | %ld | %ld |
| unsigned int | %u | %u |
| int | %d | %d |
| short | %hd | %hd |
| char | %c | %c |
Şekil 5.5 Veri tipleri için dönüşüm hiyerarşisi
Değerleri düşük tiplere çevirmek genelde yanlış değerler hesaplanmasına sebep olur. Bu sebepten, bir değeri daha düşük bir tipe dönüştürmek için değer özel olarak düşük tipte bir değişkene atanır ya da dönüşüm operatörleri kullanılır. Fonksiyon argüman değerleri, fonksiyon prototiplerindeki parametre tiplerine, o tipte değişkenlere atama yapılıyormuş gibi dönüştürülür. Eğer tamsayı parametresi kullanan kare fonksiyonu ( Şekil 5.3 ), ondalıklı tipte ( float ) argümanlarla çağrılsaydı, argüman int tipine (daha düşük bir tipe) dönüştürülecekti ve square fonksiyonu yanlış bir değer döndürecekti. Mesela square ( 4.5 ), 20.25 yerine 16 değerini verecekti.
Genel Programlama Hataları 5.10
Dönüşüm hiyerarşisinde, yüksek tipte bir veri tipi daha düşük bir veri tipine dönüştürülürse verinin değeri değişebilir.
Eğer bir fonksiyon prototipi programın içerisinde yer almazsa, derleyici fonksiyonla ilk kez karşılaştığında o fonksiyonun için kendisine göre bir prototip oluşturur. Fonksiyonun ilk göründüğü an, fonksiyon tanımı ya da fonksiyon çağrısı olabilir. Derleyici, otomatik olarak fonksiyonun geri dönüş değeri tipini int olarak kabul eder ve argümanlar için herhangi bir işlem yapmaz. Bu sebepten, fonksiyona geçirilen argümanlar hatalıysa derleyici bunları tespit edemez..
Genel Programlama Hataları 5.11
Fonksiyon prototipinin unutulması eğer fonksiyonun geri dönüş tipi int değilse ve fonksiyon tanımı fonksiyon çağrısından daha sonra bulunmuyorsa, yazım hatalarına sebep olur. Aksi takdirde, fonksiyon prototipini unutmak çalışma zamanlı ya da beklenmeyen hatalara yol açabilir.
Yazılım Mühendisliği Gözlemleri 5.9
Herhangi bir fonksiyon tanımı dışına yerleştirilmiş fonksiyon prototipi, dosyada fonksiyon prototipinin yazıldığı yerden itibaren fonksiyonun tüm çağrılarında geçerli olur. Eğer fonksiyon prototipi, bir fonksiyon tanımının içinde yer alırsa sadece o fonksiyon içinden yapılan çağrılara uygulanır.
Bilinmesi Gerekli
Arduino

Arduino ile bilgisayar programlarınızı gerçek dünyaya taşıyabilirsiniz.
İlk Transistör

Bell laboratuvarlarında icat edilen ilk transistör







