CodeBlanks Logo Icon CodeBlanks

Fonksiyon işaretçi dizisi

  • C kursu
  • Orta seviye
  • Ders 28/116
  • 5 dk

Fonksiyon işaretçi dizisiyle dispatch tablo öğrenirsin.

Fonksiyon işaretçi dizisi

Bir fonksiyon işaretçi dizisi, her elemanı bir fonksiyon işaretçisi olan dizidir. Bu yapı, bir dispatch table (dağıtım tablosu) oluşturur; indekse göre çağrılacak fonksiyonu seçer.

Örnek: int (*ops[2])(int, int) = {add, sub};. Bu, iki elemanlı bir fonksiyon işaretçi dizisidir. ops[0](5, 3) çağrısı add(5, 3) yapar; ops[1](10, 4) çağrısı sub(10, 4) yapar. Bu desen, switch-case zincirinin yerine geçer; kodu daha temiz ve genişletilebilir yapar. Yeni işlem eklemek için yalnızca diziye bir eleman eklersin.

Dispatch table avantajı

Dispatch table, switch-case zincirine göre daha temizdir. Yeni işlem eklemek için yalnızca diziye eleman eklersin; çağırma mantığı değişmez.

Örnek: bir hesap makinesinde switch (op) { case 0: add(a,b); ... } yerine ops[op](a, b) yazarsın. Yeni bir 'çarp' işlemi eklemek için ops dizisine mul eklersin; çağırma ops[2](a, b) olur. Switch-case'in aksine, dispatch table veriyi ve davranışı ayırır; bu sayede genişletme kolaydır. Bu desen, komut satırlı uygulamalarda ve yorumlayıcılarda standarttır.

Uygulama Hesap makinesi yaz

int add(int a, int b) ve int sub(int a, int b) fonksiyonlarını yaz. int (*ops[2])(int, int) = {add, sub}; ile fonksiyon işaretçi dizisi tanımla. printf("%d\n", ops[0](5, 3)); ve printf("%d\n", ops[1](10, 4)); ile iki işlemi çağır ve yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// add ve sub fonksiyonlarını yaz
// ops fonksiyon işaretçi dizisi tanımla
// main içinde iki işlemi çağır ve yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    int (*ops[2])(int, int) = {add, sub};
    printf("%d\n", ops[0](5, 3));
    printf("%d\n", ops[1](10, 4));
    return 0;
}

Beklenen çıktı

8
6

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İşlemi fonksiyona eşle

Kavram Anlamı
ops[0] add fonksiyonu
ops[1] sub fonksiyonu
{add, sub} İlk değer listesi
int (*ops[2])(...) Dizi türü

2 Dispatch çağrısını tamamla

Soru
int (*ops[2])(int, int) = {add, sub};
int r = ____[0](5, 3);
Cevap
int (*ops[2])(int, int) = {add, sub};
int r = ops[0](5, 3);

Açıklama: ops[0](5, 3) add fonksiyonunu çağırır.

3 Dispatch table ne işe yarar?

  • Bellek ayırır
  • İsme göre fonksiyon çağırır Doğru cevap
  • Dosya okur
  • Dize kopyalar

Açıklama: Dispatch table, indekse göre çağrılacak fonksiyonu seçer.

Orta seviye bölümündeki tüm dersler