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 />

bir argüman göderilmediği anlaşılırt. Yani işleve gönderilen son değerin -1 olması<br />

gerektiği işlevin arayüzünün bir parçası oluyor.<br />

İşlev tanımı içinde önce va_list türünden va isimli bir değişkenin tanımlandığını<br />

görüyorsunuz. va_start makrosuna va değişkeni ve işlevin parametre değişkeni val<br />

argüman olarak gönderiliyor. Bu çağrıya karşılık gelen içsel kodun çalışmasıyla, va<br />

değişkeni argüman listesinde uygun argümanı gösterecek şekilde konumlandırıldığını<br />

düşünebilirsiniz. Böylece artık işleve gönderilen argümanların değeri elde edilebilir.<br />

va_arg Makrosu<br />

va_arg makrosu işleve gönderilen argümanların değerlerini elde etmek için kullanılır.<br />

Bu makro bir işlev gibi düşünüldüğünde aşağıdaki gibi gösterilebilir:<br />

tür va_arg (va_list ap, tür);<br />

va_list türünden değişkenimiz va_start makrosu ile ilkdeğerini aldıktan sonra bu makro<br />

seçneğe bağlı tüm argümanları elde etmek için çağrılır. Bu makrodan elde edilen<br />

seçeneğe bağlı argümanın değeridir. Makronun çalışması sonucu argüman listesi<br />

göstericisi de bir sonraki argümanı gösterecek biçimde konumlandırılmış olur.<br />

Bu makroya yapılan bir sonraki çağrı ile bir sonraki seçimlik argümanın değeri elde edilir.<br />

Makroya gönderilecek ikinci bilgi, değeri elde edilecek argümanın türüdür. Örneğin<br />

seçimlik argüman int türdense makronun ikinci argümanına<br />

int<br />

geçilmelidir. Yeniden add_all işlevine dönüyoruz:<br />

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

{<br />

va_list va_p;<br />

int sum = 0;<br />

va_start(va_p, val);<br />

}<br />

while (val != -1) {<br />

sum += val;<br />

val = va_arg(va_p, int);<br />

}<br />

/***/<br />

işlevin tanımında val değişkeni -1 olmadığı sürece dönen bir döngü oluşturuluyor.<br />

Döngünün her turunda val değişkeninin değeri sum değişkenine katılıyor ve val<br />

değişkenine seçimlik argümanlardan bir sonrakinin değeri aktarılıyor.<br />

val = va_arg(va_p, int);<br />

va_arg makrosunun ilk defa kullanılmasıyla seçimlik ilk argüman, 2. kez kullanılmasıyla<br />

seçimlik 2. argüman vs. elde edilir. Eğer belirli bir argümandan sonrası elde edilmek<br />

istenmiyorsa va_arg çağrıları sonuna kadar yapılmak zorunda değildir.<br />

İşleve çağrı ile gönderilen argüman sayısından daha fazla sayıda argüman elde etmeye<br />

çalışılırsa, yani va_arg makrosu olması gerekeneden daha fazla çağrılmaya çalışılırsa çöp<br />

değerler elde edilir.<br />

va_end Makrosu<br />

Argüman listesi göstericisinin işi bittiğinde va_end makrosu çağrılır.<br />

void va_end (va_list ap)<br />

526

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

Saved successfully!

Ooh no, something went wrong!