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
#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
#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
int (*ops[2])(int, int) = {add, sub};
int r = ____[0](5, 3);
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.