Selamün Aleyküm;
Kodum şu şekilde:
void foo(const char* str, ...)
{
va_list args;
va_start(args, str);
for (int i = 0; i < 3; i++)
cout << va_arg(args, char*) << endl;
va_end(args);
}
'Sual 1-)' va_start ile değişken parametreler için ilk konum neresi olacak onu konumlandırıyoruz. Fakat bunun için en az bir tane parametre gerekiyor (bu kodda 'const char* str'). Peki ben bu şekilde varsayılan bir parametre koymadan va_list args'ı konumlandıramaz mıyım?
'Sual 2-)' Kodda da görüldüğü gibi for ile 3'e kadar dönüyorum, çünkü önceden 3 tane argüman göndereceğimi biliyorum. Peki Kaç tane parametre gönderileceğini bilmediğim zamanlarda nasıl bu argümanları alabileceğim? Yani argüman sayısını nasıl bulabilirim?
'Sual 3-)' va_arg fonksiyonu ile argümanları yakalayabiliyoruz. Lakin va_arg'ın ikinci parametresini argümanın tipini bildiğim için char* yazdım. Lakin argüman tipini bilmediğim zamanlarda nasıl bir yol izlemeliyim? Aslında türleri decltype, std::is_same veya typeid gibi özelliklerle bulup ona göre işlem yaptırabilirim, fakat bu gibi ek denetimlere gerek kalmadan yapabilir miyiz?
'Sual 4-)' Aslında benim şu anda ihtiyacım olan bir konu da şu: 'void foo(int n, ...)' gibi bir fonksiyonu şu şekilde kullanıyoruz 'foo(1, "a", "b", "c");' Peki ben bir diziyi bu fonksiyona değişken parametre olarak nasıl gönderebilirim?
Bir örnek olarak:
// foo Bildirimi:
void foo(int n, ...);
.
.
.
char* dizi[] = { "a", "b", "c" };
foo (12, dizi);
Neden böyle yapmak istediğimi merak ediyorsanız şu şekilde anlatayım: Bazı dillerde değişken parametreler olmadığı için veyahut da karmaşık yollardan yapıldığı için C++'da yazdığım fonksiyonu o dilde kullanırken dizi olarak atmak istiyorum. Niçin C++ fonksiyon bildiriminde parametreyi değişken parametreler yerine dizi kullanmıyorum? Çünkü verilen parametrelerin başka bir fonksiyona parametre olarak verilmesi gerektiğindendir. Mesela bir örnek:
// C++ Fonksiyonu:
void foo(int n, ...)
{
va_list args;
va_start(args, n);
for (args içinde dön)
bar(Argümanları bu fonksiyona parametre olarak geçir.);
// ÖRNEK: bar (1, "a", "b", "c"); gibi
}
// Object Pascal Kodu:
// Bu dilde diziyi argüman olarak vermek en kolayı,
// çünkü C / C++ gibi değişken parametreleri dolaylı olmayan yoldan desteklemiyor. ::
foo(1, ['aa', 'bb', 'cc', 22, 33, 4.5]);
Yani ya C++ fonksiyonunda dizi olarak parametre tanımlayacağım, ya da değişken parametre tanımlayıp buna dizi geçirebileceğim. İlk yolu tercih edersem de örnek koddaki gibi dizi elemanlarını başka bir fonksiyona nasıl tek tek argüman olarak atayacağım? Her 2 yol da yapılabilir mi? Yapılırsa nasıl yapılır?
Teşekkürler!
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply