08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

DEĞİŞKEN SAYIDA ARGÜMAN ALAN<br />

İŞLEVLER<br />

C’de değişken sayıda argüman alan işlevler tanımlanabilir. Değişken sayıda argüman alan<br />

bir işlevin bildirimi aşağıdaki gibidir:<br />

[İşlevin geri dönüş değeri]işlev ismi(parametre bildirimleri, ...);<br />

üç nokta "..." atomunun ismi ingilizce de "elipsis"tir. Bir işlevin değişken sayıda argüman<br />

alabilmesi için son parametresinin üç nokta atomuyla bildirilmesi zorunludur. Böyle<br />

işlevler istenen sayıda argümanla çağrılabilir.<br />

Böyle işlevlerin soldan en az bir paramteresi bilinen bir türden olmalıdır.<br />

Aşağıda bazı değişken sayıda argüman alan işlevlerin bildirimleri görülüyor:<br />

int printf(const char *, ...);<br />

int scanf(const char *, ...);<br />

double get_mean(int, ...);<br />

İşlevlerin tanımı da aynı biçimde yapılmalıdır. İşlev tanımlarında işleve gönderilen<br />

argümanlara bazı standart makrolar kullanılarak ulaşılır. Bu makrolar stdarg.h isimli<br />

standart başlık dosyası içinde tanımlanmıştır.<br />

Değişken sayıda argüman alan işlev içinde, türü ve ismi belirtilmiş parametre<br />

değişkenlerinin değerine diğer işlevlerde olduğu gibi isimleriyle ulaşılır. Seçimlik olan<br />

argümanlara, yani kaç tane olduğu bilinmeyen argümanların her birine ulaşım bazı<br />

standart makrolar kullanılmasıyla gerçekleştirilir:<br />

Önce bu makroları tanıyalım:<br />

va_start Makrosu<br />

Bu makro kullanılarak vs_list türünden bir değişkene ilkdeğeri verilir.<br />

va_list standart başlık dosyası içinde bildirilen bir typedef ismidir. Seçeneğe<br />

bağlı argümanları dolaşacak gösterici bu türdendir. Önce bu türden bir değişken<br />

tanımlanmalıdır. Bu göstericinin argüman listesini dolaşma işlemini yapabilmesi için, önce<br />

bu değişkene va_start makrosu ile ilkdeğeri verilmelidir.<br />

va_start makrosunun aşağıdaki gibi bir işleve karşılık geldiğini düşünebilirsiniz:<br />

void va_start (va_list ap, belirli son parametre);<br />

Bu makroya birinci argüman olarak va_list türünden değişken gönderilir. Makroya<br />

gönderilmesi gereken ikinci argüman işlevin türü ve ismi belirli olan son parametre<br />

değişkeninin değeridir.<br />

#include <br />

int add_all(int val, …)<br />

{<br />

va_list va;<br />

va_start(va, val);<br />

/***/<br />

}<br />

add_all isimli işlev kendisine gönderilen değişken sayıda pozitif tamsayıların toplam<br />

değeriyle geri dönecek. İşlevin ilk parametresinin int türden olduğunu görüyorsunuz. Bu<br />

işleve en az bir argüman gönderilmelidir. İşlev çağrısında kullanılacak toplam argüman<br />

sayısı isteğe bağlı olarak ayarlanabilir. Ancak son argümanın değeri -1 olduğunda, başka<br />

525

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!