5 Mart 2017 Pazar

-CC++ pointer fonksiyon nesneler-


Merhabalar,

CCpp'da pointer'lar birçok şekilde kullanılabilir.
Temel düzeyde pointer'lar,değişken tanımlama,değer atama ve pointer değişkenden
bir başka pointer'e atamalarda karşılaşırız-kullanırız.
Bu örnekte pointer'ların fonksiyonlar ile birlikte nasıl kullanıldığını göreceğiz.

Temel düzeyde fonksiyonların pointer ile kullanıma dair önceki makalemi okuyabilirsiniz.
 link

Bu örnekte üç(3) adet fonksiyon mevcuttur.
Bu fonksiyonlar,oluşturulan sanal bir pointer fonksiyon nesnesine tek tek atanabileceği gibi,
toplu olarak da atanabilir.  Böyle bir atama işleminde,sanal olarak oluşturulan fonksiyon nesnesi
artık atanan fonksiyonun yerine kullanılabilir.
Dolayısıyla fonksiyonu çağırma,parametre gönderme ve geri döndürdüğü değeri bu sanal fonksiyon pointeri
üzerinden elde edebiliriz.

Aşağıda verilen örneklerde ilk olarak tek fonksiyon kullanılıyor.

NOT: Bu makalede temel "pointer" kavramını bildiğiniz varsayılmıştır.

#include <stdio.h>
#include <string.h>

void func1(int *a)
{
printf("func1: %d\n",*a);
}
void func2(int *a)
{
printf("func2: %d\n",*a);
}
void func3(int *a)
{
printf("func3: %d\n",*a);
}

int main()
{
 // tek fonksiyon kullanımı:
   /*
   * Pointer olarak oluşturulan sanal fonksiyon aşağıda verilmiştir.
   * Atanacak fonksiyon "func1" ismindedir. Fonksiyon int türünden bir parametre almaktadır
   * ve geri değer döndürmüyor. Dolayısıyla sanal fonksiyon da buna uygun tasarlanmıştır.
   * "void": elde edilecek fonksiyonun geri dönüş değeri.
   * "(*function)": sanal fonksiyon nesnesidir.
   * "(int *)" : func1 fonksiyonun parametre türüdür. Parametre sayısı kadar oluşturulmalıdır.
   **/
   void (*function)(int *) = func1; //func1 fonksiyonu atanıyor.
   int a = 55;
   //func1 fonksiyonuna sanal nesne üzerinden değer gönderiliyor.
  (*function)(&a); // func(&a) ile aynı görevi görmektedir.

  //Fonksiyon atamasını aşağıdaki gibi yapabiliriz.
  void (*function)(int *) = &func1; //"&" karakterine dikkat!!

  //şayet funk1 fonksiyonu iki parametreli olsaydı,bu durumda pointer tanımlaması şöyle olacaktı:
  void (*function)(int *,int *) = func1;
}


//ÖRNEK 2:
Bu örnekte elimizde bulunan tüm(3 adet) fonksiyonları tek bir pointer nesnesi üzerinden kontrol edeceğiz.
Bu nedenle bir array(dizi) oluşturmamız gerekir.
Aşağıda tüm fonksiyonlar tek pointer nesnesine atanmıştır.

int main()
{
   //pointer nesnesi array olarak tanımlanıyor.
   void (*functions[3])(int *) = {func1,func2,func3}; //fonksiyonlar atanıyor.
 
     int a = 10;
     int b = 20;
     int c = 30;
     //parametre gönderiliyor:
     (*functions[0])(&a);
     (*functions[1])(&b);
     (*functions[2])(&c);
    return 0;
}


//ÖRNEK 3:
Son örneğimizde ise fonksiyonlarımız geri dönüş değerine sahiptir.
Bu durumda,oluşturacağımız sanal fonksiyon pointeri bu yapıya uygun tasarlanmalıdır.
Yani fonksiyon geri dönüş tipi-türüne uygun olmalıdır.

int *func1(int *a)
{
printf("func1: %d\n",*a);
*a = *a + 5;
return a;
}
int *func2(int *a)
{
printf("func2: %d\n",*a);
*a = *a + 5;
return a;
}
int *func3(int *a)
{
printf("func3: %d\n",*a);
*a = *a + 5;
return a;
}

int main()
{
     int a = 10;
     int b = 20;
     int c = 30;
     //func1,func2,func3 fonksiyon dönüş tipleri "int" olduğu için:
    int* (*functions[3])(int *) = {func1,func2,func3};
   
    printf("%d\n",*(*functions[0])(&a)); // pointer karakterine(*) dikkat.
    printf("%d\n",*(*functions[1])(&b));
    printf("%d\n",*(*functions[2])(&c));
     
return 0;
}


İyi çalışmalar.

1 Mart 2017 Çarşamba

Bilişim Sohbetleri 3 Mart 2017 Cuma

3 Mart 2017 Cuma Türkiye saati ile 21:30'da Bilişim Sohbetleri canlı yayınında konuğumuz Turkey Java User Group Başkan Yardımcısı, Android-AOSP/Linux Kernel Developer(R&D Engineer), Java/Android Teknik Kitap Yazarı Sayın Kerim Fırat hocamız ile Yazılım Sektörünün İhtiyaçları üzerine konuşacağız. Sakın kaçırmayın. :)
Canlı yayın adresimiz: https://youtu.be/wCLH2HiuHIk
Hazırlayıp sunanlar:Mimar Aslan & Çağdaş Öğüt