January 31, 2016

Selamün Aleyküm;
Android kaynak kodlarını incelerken şuna benzer bir kod gördüm:

void error(const char* fmt, ...)
{
 va_list(ap);
 // ...
}

Bu kullanımı internetten araştırdım ve değişken argümanlar olarak bilindiğini gördüm. Acaba bu yapı tam olarak nasıl kullanılıyor? Ayrıca bilinmeyen sayıda argüman verilebilecekse, herhangi bir dizi tanımlayıp verileri alabiliriz. Bu şekilde kullanım ile dizi kullanımı arasında ne gibi farklar olur?
Teşekkürler!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 31, 2016

Bu olanak, işlevlerin printf'te olduğu gibi farklı sayıda ve farklı türden parametre alabilmelerini sağlar.

Parametrelerin türleri yerine '...' verildiğinden, çağıran ile işlevin iyi anlaştıkları konusunda derleyici hiçbir güvence veremez. Örneğin, 'printf(duzen_dizgisi, 1.5)' çağrıldığında duzen_dizgisi'nin bir sonraki parametre değerini kesirli sayı olarak tarif ettiğini düşünürüz ve belki de öyledir ama bundan emin olamayız. (Bundan ancak düzen dizgisi sabit olarak verilmişse emin olabiliriz ve çoğu derleyici o durumda parametre değerlerine ve düzen dizgisine bakarak denetim yapar.)

Kabaca, şöyle kullanılıyor:

  1. İşlev, parametre okuma işlemini va_start ile başlatır

  2. İşlev, sıradaki parametrenin tam olarak ne türden olduğunu bir şekilde bilir ve değeri va_arg ile edinir

  3. İşlevden çıkılmadan önce va_end çağrılmalıdır

Alıntı (İbrahim):

>

bilinmeyen sayıda argüman verilebilecekse, herhangi bir dizi tanımlayıp verileri alabiliriz. Bu şekilde kullanım ile dizi kullanımı arasında ne gibi farklar olur?

Dizi de iyi bir yöntemdir ve D'de de yaygın olarak kullanılır:

http://ddili.org/ders/d/parametre_serbestligi.html#ix_parametre_serbestligi.i%C5%9Flev,%20belirsiz%20say%C4%B1da%20parametre

Farkı, dizi bilinmeyen sayıda parametre sağlar ama hepsinin belirli bir türden olmaları gerekir. Variadic arguments ise çağrıdan çağrıya bile farklı olan türlerle çağrılmayı sağlar. Örneğin, printf int, double, vs. türlerle ve bunların her farklı sırada kullanımı ile çağrılabilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]