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.
Görev
KolayBir 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:
- Şunları yapan bir işlev işaretçisi türü için
typedefadlı birComparatoroluştur:- İki
intparametresi alır - Bir
intdöndürür (ilk değer küçükse negatif, eşitse sıfır, ilk değer büyükse pozitif)
- İki
- İ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)
mainiçinde, birComparatordeğişkeni bildir (ham işlev işaretçisi söz dizimi yerine kendi typedef tanımını kullanarak)- Üç girdi oku: iki tam sayı ve bir sıra kodu (artan için 1, azalan için 2)
- Sıra koduna göre uygun işlevi
Comparatordeğişkenine ata - 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: 33, 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;
}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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu7Fonksiyon İşaretçileri
Fonksiyon İşaretçilerini TanımlamaFonksiyon İşaretçilerini ÇağırmaFonksiyon İşaretçileri için TypedefFonksiyonları Argüman Olarak GeçirmeÖzet: Hesap Makinesi Yönlendirme2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi