|
Yavaş yavaş ileri seviye C++ derslerine geçişimizi sürdürürken, size bu sefer biraz daha karmaşık (gibi görünen) bir teknik öğretmeyi amaçlıyorum. Bu derste bir fonksiyonun, diğer bir fonksiyona, işaretçi bir argüman olarak nasıl geçirildiğini öğreneceksiniz. Aslında bu özelliğin normal değişkenleri işaretçi olarak geçirmekten çok farkı yok. Biraz kurcalarsanız ne kadar kolay olduğunu kavrayacaksınız. Ayrıca belirtmek isterim ki, önceki derslerimin tutulması beni çok sevindirdi. Hayatımda yazdığım ilk dersler olmasına rağmen başarılı olabileceğimi düşünmüyordum. Çok teşekkür ederim… Her neyse, derse geçmek gerekirse, ufak bir örnekle başlayalım hemen. Ama hatırlatmalıyım ki, pointerlar(işaretçiler) ile fonksiyonlar hakkında bilgisi olmayanlar önceki derslere dönüş yapmalılar. #include <iostream> //her zamanki gibi girdi çıktı işlemleri için #include <string> //string sınıfımızı kullanmak için include ediyoruz using namespace std; //std isimuzayını kullan void yazdir(string yazi) //yazı yazdıran fonksiyonumuz { cout << yazi << endl; } void fonkcagir(void (*fonk)(string)) //işte can alıcı nokta! kodlardan sonrasını okuyun { fonk("bu bir denemedir!"); //bize gönderilen fonksiyonu yazı argümanıyla çağır } int main(int argc, char* argv[]) { fonkcagir(yazdir); //fonkcagir fonksiyonuna yazdir fonksiyonunu argüman olarak geçir system(“pause”); //durdur ki çıktıyı görelim :) return 0; } Çıktı elbette şöyledir: bu bir denemedir! Şimdi fonkcagir fonksiyonunu ele alalım; void fonkcagir(void (*fonk)(string)) Gördüğünüz gibi, alınan argüman bir tane. Geridönüş değeri “void” olan bir fonksiyona işaret et, ve bu fonksiyona “fonk” de! (siz hede veya hodo de diyebilirsiniz :) ). Sonrasında bu fonksiyonun argümanlarını bildir. Tek bir argümanı var, o da string yapısına sahip. Yani bunu tekrar ele alırsak; void(*fonk)(string) olarak yazmalıyız. Esasında bunu okunabilirliğin artması açısından şu şekilde de yazabilirdik; void(*fonk)(string yazi) Sonrasında ise fonkcagir(yazdir) olarak çağırarak aslında şunu yapmış oluyoruz; yazdir(“bu bir denemedir!”); Peki bize gönderilen fonksiyon birden çok argümanlı ya da geridönüş değeri “int” falan olsa idi ne yapacaktık? Pekala, o halde yazdir fonksiyonunu tekrar ele alalım bakalım. Bu düşündüğümüzün ikisinide uygulayalım; int yazdir(string yazi, int sayi) { cout << yazi << “ sayi = “ << sayi << endl; //gelen yazi ve sayi değişkenlerinin çıktısını alıyoruz. return 0; //geridönüş tipi “int” olan bir fonksiyon olduğundan herhangi bir sayı döndürmeliyiz. } Ardından hemen fonkcagir fonksiyonunu da değiştirmeliyiz; void fonkcagir(int (*gelenfonk)(string, int)) { gelenfonk("bu bir denemedir!", 5); } Bunu önceki programa uyarlayıp çalıştırdığımızda şu çıktıyı alırız: bu bir denemedir! sayi = 5 Ayrıca dikkatinizi çekmiştir ki, daha iyi anlaşılabilmesi için fonk argüman adını gelenfonk adıyla değiştirdim. Tamam bunu da anladıysak, şimdide fonkcagir a birden fazla argüman özelliği verelim. Sonrada çağıralım bakalım ne olacak; void fonkcagir(int (*gelenfonk)(string, int), int sayi) { gelenfonk("bu bir denemedir!", sayi); //gelenfonk a iki argüman geçiriyoruz. } Bu sefer iki tane argüman var, birisi “int (*gelenfonk)(string, int)” diğeri “int sayi”… Bunu main fonksiyonumuz içinde şu şekilde çağırır isek; fonkcagir(yazdir, 10); Çıktımız elbette şu şekilde olacaktır: bu bir denemedir! sayi = 10 Bu dersimizinde sonuna geldik. Burada size gösterilenler bu özelliğin temel düzeyinden ibarettir. Yapabilecekleriniz hayal gücünüzle sınırlıdır! Aslında sınırsızdır :) Kendinize sınır koymamayı, devamlı daha yükseğe zıplamayı öğrenmeye gayret edin! Ancak bu şekilde yapamayacağını düşündüğünüz şeyleri kolaylıkla yapabileceksiniz… Bu ders hakkında her türlü soruyu forumda sorabilirsiniz. İyi kodlamalar! Evren ACIGÜL
|