Menu
CoddyTech

Fonksiyon İşaretçileri için Typedef

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 35 / 61.

Gördüğünüz gibi, işlev işaretçisi bildirimlerini okumak zor olabilir. Aynı işlev işaretçisi türünü birden fazla yerde kullanmanız gerektiğinde söz dizimi tekrarlı ve hataya açık hâle gelir. İşte bu noktada typedef imdadınıza yetişir.

typedef anahtar sözcüğü, işaretçi işlevler de dâhil olmak üzere herhangi bir tür için bir alias oluşturmanıza olanak tanır. Her seferinde tam bildirimi yazmak yerine türü bir kez tanımlar ve alias'ı kodunuzun tamamında kullanırsınız.

Bir işaretçi işlev bildirimini typedef'e şu şekilde dönüştürebilirsiniz:

// typedef olmadan (dağınık):
int (*operation)(int, int);

// typedef ile (temiz):
typedef int (*Operation)(int, int);

Operation op;  // Çok daha temiz!

Sözdizimi normal bir işaretçi fonksiyonu bildirimini andırır, ancak başında typedef bulunur. Seçtiğin ad (burada Operation), “iki int alan ve bir int döndüren bir fonksiyona işaretçi”yi temsil eden yeni bir tür olur.

Artık bu türü istediğiniz yerde kullanabilirsiniz:

typedef int (*Operation)(int, int);

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    Operation op1 = add;
    Operation op2 = multiply;
    
    printf("%d\n", op1(3, 4));  // Çıktı: 7
    printf("%d\n", op2(3, 4));  // Çıktı: 12
    return 0;
}

Bu yaklaşım, işaretçilerini parametre olarak geçirirken veya bunları struct'larda saklarken özellikle değerlidir: polimorfizme doğru ilerlerken sıkça karşılaşacağınız durumlar.

challenge icon

Görev

Kolay

Bir karşılaştırma işaretçisi türü için temiz bir takma ad oluşturmak üzere typedef kullanımını pratik edelim. İki tam sayıyı karşılaştıran bir işlevi temsil eden bir tür tanımlayacak, ardından bu türü değişken bildirmek ve farklı karşılaştırma işlevlerini çağırmak için kullanacaksın.

Şunları yapan bir program yaz:

  1. Şunları yapan bir işlev işaretçisi türü için typedef adlı bir Comparator oluştur:
    • İki int parametresi alır
    • Bir int döndürür (ilk değer küçükse negatif, eşitse sıfır, ilk değer büyükse pozitif)
  2. İki karşılaştırma işlevi tanımla:
    • ascending: artan sırayı belirten bir değer döndürür (first - second)
    • descending: azalan sırayı belirten bir değer döndürür (second - first)
  3. main içinde, bir Comparator değişkeni bildir (ham işlev işaretçisi söz dizimi yerine kendi typedef tanımını kullanarak)
  4. Üç girdi oku: iki tam sayı ve bir sıra kodu (artan için 1, azalan için 2)
  5. Sıra koduna göre uygun işlevi Comparator değişkenine ata
  6. Karşılaştırıcıyı iki sayıyla çağır ve sonucu yazdır; ardından hangi değerin önce gelmesi gerektiğini belirten bir mesaj yazdır

Üç girdi alacaksın: ilk sayı, ikinci sayı ve sıra kodu (1 veya 2).

Çıktın karşılaştırma sonucunu göstermeli, ardından sonucun işaretine göre hangi sayının önce geldiğini belirtmelidir:

Result: -5
First: 3

3, 8, 1 girdileriyle (artan sıra) bu örnekte karşılaştırma 3 - 8 = -5 sonucunu verir (negatif olması, artan sırada ilk sayının önce geldiği anlamına gelir), bu nedenle First: 3 yazdırılır.

"First" satırı için:

  • Sonuç negatif veya sıfırsa, ilk girdi sayısını yazdır
  • Sonuç pozitifse, ikinci girdi sayısını yazdır

Buradaki temel pratik, tam işlev işaretçisi söz dizimini yazmak yerine değişkeni temiz bir şekilde bildirmek için Comparator typedef tanımını kullanmaktır.

Kendin dene

#include <stdio.h>

// TODO: 'Comparator' adında bir fonksiyon işaretçisi türü için typedef oluştur
// iki int parametre alan ve bir int döndüren


// TODO: 'ascending' karşılaştırma fonksiyonunu tanımla
// (first - second) döndürmeli


// TODO: 'descending' karşılaştırma fonksiyonunu tanımla
// (second - first) döndürmeli


int main() {
    // Girdiyi oku
    int num1, num2, orderCode;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &orderCode);
    
    // TODO: typedef'ini kullanarak bir Comparator değişkeni bildir
    
    
    // TODO: orderCode'a göre uygun fonksiyonu ata
    // (1 ascending için, 2 descending için)
    
    
    // TODO: Karşılaştırıcıyı çağır ve sonucu sakla
    int result;
    
    
    // Sonucu yazdır
    printf("Result: %d\n", result);
    
    // TODO: Sonuca göre hangi sayının önce geldiğini yazdır
    // Eğer sonuç negatif veya sıfırsa, ilk sayıyı yazdır
    // Eğer sonuç pozitifse, ikinci sayıyı yazdır
    printf("First: %d\n", /* mantığınız buraya */ 0);
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi