Şimdi Ara

İşaretçi Fonksiyonlar(Teknik İngilizcesi iyi olan birisi yardım edebilir mi ?)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
2
Cevap
0
Favori
232
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba,rica etsem işaretçiler konusunda tecrübe sahipleri bana işaretçi fonksiyonların ne işe yaradığını,ne fayda sağladığını,genel syntaxını açıklayabilir misiniz? Bir de Function Pointer in C - GeeksforGeeks adresinde bununla ilgili bir makale var.Linke göz atabilir misiniz ?

    Ben
    1)Fonk. işaretçi datayı değil kodu işaret eder.
    2)Bellekten alan tahsil etmezler.
    3)Fonk. adı fonk.un adresidir ayrıca.
    4)void (*f_arr[])(int, int)={add,subtract,multiply};-->Mainde tanımlanmış bu fonksiyon arrayla switch case görevi görür.0:add 1:subtract 2:multiply (f_arr is an array of function pointers)
    5)Başka fonksiyonları parametreyle alıp onları gerçekleştirebilir.
    sonuçlarını çıkardım.Eklemem gereken ya da yanlış olan bir bilgi var mı ?

    Son olarak aşağıdaki kodlarda koyu kısımları açıklayabilir misiniz?(//-->?)

    #include <stdio.h> 
    void add(int a, int b)
    {
    printf("Addition is %d\n", a+b);
    }
    void subtract(int a, int b)
    {
    printf("Subtraction is %d\n", a-b);
    }
    void multiply(int a, int b)

    {
    printf("Multiplication is %d\n", a*b);
    }
    int main()

    {
    // fun_ptr_arr is an array of function pointers
    [b] void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};//Sanırım burada switch kase yapısı kurulmuş.[/b] //-->?

    unsigned int ch, a = 15, b = 10;
    printf("Enter Choice: 0 for add, 1 for subtract and 2 "

    "for multiply\n");
    scanf("%d", &ch);
    if (ch > 2) return 0;

    (*fun_ptr_arr[ch])(a, b);

    return 0;

    }



    Burada ne yaptığımızı hiç anlamadım.Bize sağlanan kolaylık nedir ?

    // A simple C program to show function pointers as parameter 
    #include <stdio.h>

    // Two simple functions
    void fun1() { printf("Fun1\n"); }
    void fun2() { printf("Fun2\n"); }

    // A function that receives a simple function
    // as parameter and calls the function
    void wrapper(void (*fun)())
    {
    fun();
    }

    int main()
    {
    wrapper(fun1);
    wrapper(fun2);
    return 0;
    }


    // An example for qsort and comparator 
    #include <stdio.h>
    #include <stdlib.h>

    // A sample comparator function that is used
    // for sorting an integer array in ascending order.
    // To sort any array for any other data type and/or
    // criteria, all we need to do is write more compare
    // functions. And we can use the same qsort()
    int compare (const void * a, const void * b)
    {
    [b]return ( *(int*)a - *(int*)b );[/b] //-->?

    }

    int main ()
    {
    int arr[] = {10, 5, 15, 12, 90, 80};
    int n = sizeof(arr)/sizeof(arr[0]), i;

    [b]
    qsort (arr, n, sizeof(int), compare);[/b] //-->?


    for (i=0; i<n; i++)
    printf ("%d ", arr[i]);
    return 0;
    }


    Mümkünse işaretçi dizilere de deyinmenizi rica ederim.

    Gönderdiğiniz bir harfin bile biz talebeler için çok önemli olduğunu unutmayınız.Şimdiden yardımını esirgemeyen herkese teşekkürler ederim.







  • SemihKoca S kullanıcısına yanıt
    Şimdi function pointerların özellikle C dilinde ilk ve nihai amacı program dizaynı ve modülarite üzerinedir.

    Şimdi bir program yazdın diyelim. İleride o programı geliştirmek istiyorsun ama gelecek zamanda ne tarz bir gelişime tabi tutulacağı bilinmiyor, belirsiz ise function pointer kullanabilirsin. Bunun sayesinde mesela 2 ay sonra o programda ne tarz bir değişiklik veya özelleştirme gerekiyorsa o function pointerın çağrıldığı noktada tanımlanmış fonksiyonu istediğin şekilde yazarak (2 ay evvel yazmış olduğun eski kodda herhangi bir değiklik yapmaya gerek kalmadan) bu değişikliği yapmış olursun.

    C++ da bu işi hususi olarak function pointer kullanmadan endirekt olarak inheritance/miras ve virtual functions/sanal fonksiyonlar mekanizmasını kullanarak yapıyorsun. Yani kısaca function pointer hadisesi birbirlerinden ayrı tanımlanmış modüller yaratabileceğin bir nevi "object oriented" dizayn olanağı.

    Mesela function pointerlar bazı şeylerde bir zorunluluk. En meşhur örneği Windows programlamada işletim sisteminin senin programına yolladığı mesajları yakalayabilmen için API dökümantasyonunda tarif edildiği şekilde mesajların iletileceği fonksiyonu programında kendin yazarak tanımlaman ve işletim sistemine o fonksiyonun adresini bildirmen gerekiyor. Bunun sayesinde tetiklemesi işletim sistemi tarafından yapılan senin yazdığın mesaj döngüsü fonksiyonu çalıştırılıyor ve mesajlar nasıl işlenmesi gerekiyorsa senin o fonksiyon içersine kendi yazdığın kodlar sayesinde oluyor.

    Yani madem şöyle de açıklamaya çalışayım:
    Bir fonksiyonun/işin yapılması lazım... ama o işin ne olacağı gelecekte belli olacaksa tetikleyicileri sen önce kendin yazıyorsun, tetiklerin çalıştıracağı fonksiyonların ne olacağı ilerki zamanlarda belli olduğunda da o fonksiyonu da yazıyorsun. İşte tüm bu meselenin olabilmesi için gereken mekanizma "function pointer" mekanizması. Bazı hız gereken işlerde de "function pointer" kullanılabilinir... Bunun sayesinde mesela değişen durumlara göre daha uygun ve hızlı çalışacak fonksiyonu seçebilmek de function pointer kullanılarak yapılabilinir mesela.

    Mesela "Device Driver" yazmak vs gibi işlerde de function pointer mekanizması olmazsa olmaz hadiselerden biri.

    Verdiğin örneklere şöyle üstünkörü baktım ama syntax myntax vs işler basit işler olduğu için bu konunun neden önemli olduğunu açıklayacak daha genel şeyler yazmak istedim.. Program dizaynı hadiseleri zordur onu gereğince yapabilmek için sürekli program yazmak gerekir . O konuda da gelişim yıllar sürer.



    < Bu mesaj bu kişi tarafından değiştirildi Buzz Lightyear -- 27 Temmuz 2015; 21:49:52 >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.