Fonksiyonları Argüman Olarak Geçirme
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 36 / 61.
Fonksiyon işaretçilerinin en güçlü kullanım alanlarından biri, onları diğer fonksiyonlara argüman olarak geçirmektir. Bu, bir fonksiyonun kodunu değiştirmeden içine özel davranışlar enjekte etmenize olanak tanır — bazen callback (geri çağırma) olarak adlandırılan bir teknik.
İki sayı üzerinde hesaplama yapan bir fonksiyon düşünün. İşlemi doğrudan kodlamak yerine, hangi işlemin yapılacağını tanımlayan bir fonksiyon göstericisi kabul edebilirsiniz:
typedef int (*Operation)(int, int);
int compute(int a, int b, Operation op) {
return op(a, b);
}compute fonksiyonu toplama mı, çıkarma mı yoksa tamamen başka bir şey mi yaptığını bilmez. Sadece kendisine aktarılan fonksiyonu çağırır:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // Çıktı: 8
printf("%d\n", compute(5, 3, multiply)); // Çıktı: 15
return 0;
}Aynı compute fonksiyonunun, hangi fonksiyonu geçirdiğimize bağlı olarak nasıl farklı sonuçlar ürettiğine dikkat edin. Bu desen, esnek ve yeniden kullanılabilir kod yazmanın temelidir — yapıyı bir kez yazarsınız ve fonksiyonunuzu kullananlar ihtiyaç duydukları özel mantığı sağlarlar.
Görev
Kolayİki tam sayı ve bir işlem kodu alan, işlemi sayılara sırayla iki kez uygulayan ve nihai sonucu döndüren bir apply_twice fonksiyonu yazın.
Fonksiyonunuz, hangi işlemin kullanılacağını belirleyen bir işlem kodu alacaktır. İşlem fonksiyonlarını çözümünüzün içinde tanımlamalı ve bunları bir fonksiyon göstericisi (function pointer) kabul eden yardımcı bir compute fonksiyonuna iletmelisiniz.
Gerekli yapı:
- İki
intparametresi alan ve birintdöndüren bir fonksiyon göstericisi içinOperationadında birtypedeftanımlayın - İki işlem fonksiyonu tanımlayın:
add(a + b döndürür) vemultiply(a * b döndürür) - İki tam sayı ve bir
Operationfonksiyon göstericisi alan, ardından işlemi çağırmanın sonucunu döndüren bircomputefonksiyonu tanımlayın apply_twiceiçinde, koda göre uygun işlemi seçin, ardındancomputefonksiyonunu iki kez kullanın: önce orijinal sayılarla, sonra sonuç ve ikinci sayı ile tekrar
Mantık:
op_codedeğerine göre işlem fonksiyonunu seçin (1 = add, 2 = multiply)- Ara bir sonuç elde etmek için
compute(a, b, operation)fonksiyonunu çağırın - Nihai sonucu elde etmek için
compute(intermediate, b, operation)fonksiyonunu çağırın - Nihai sonucu döndürün
Parametreler:
a(int): Birinci sayıb(int): İkinci sayıop_code(int): İşlem kodu (add için 1, multiply için 2)
Döndürdüğü Değer: İşlemin sırayla iki kez uygulanmasından sonraki sonuç (int)
Örnek: a = 5, b = 3, op_code = 1 (add) ile:
- Birinci hesaplama: 5 + 3 = 8
- İkinci hesaplama: 8 + 3 = 11
- Dönüş: 11
a = 2, b = 4, op_code = 2 (multiply) ile:
- Birinci hesaplama: 2 × 4 = 8
- İkinci hesaplama: 8 × 4 = 32
- Dönüş: 32
Kopya kağıdı
Fonksiyon işaretçileri, diğer fonksiyonlara argüman olarak aktarılabilir; bu da fonksiyonun kodunu değiştirmeden özel davranışlar eklemenin bir yolu olan geri çağırmaları (callbacks) mümkün kılar.
typedef kullanarak bir fonksiyon işaretçisi türü tanımlayın:
typedef int (*Operation)(int, int);Parametre olarak bir fonksiyon işaretçisi kabul eden bir fonksiyon oluşturun:
int compute(int a, int b, Operation op) {
return op(a, b);
}Farklı davranışlar elde etmek için farklı fonksiyonlar aktarın:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // Çıktı: 8
printf("%d\n", compute(5, 3, multiply)); // Çıktı: 15
return 0;
}Bu desen, yapının bir kez tanımlandığı ve kullanıcıların ihtiyaç duydukları özel mantığı sağladığı esnek ve yeniden kullanılabilir kodlar yazmanıza olanak tanır.
Kendin dene
int apply_twice(int a, int b, int op_code) {
// Kodu buraya yazın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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şisi