Fonksiyonlara Parametre Geçirmek

Yazar : zafer 12. Ekim 2009 18:47

C dilinde fonksiyonlar, ana programın yaptığı işleri paylaşan alt programlar olarak düşünülebilir. Bu sebeple C dilinde fonksiyonlar çok önemli değere sahiptir. Fonksiyonlar yaptıkları işe bağlı olarak bazen ihtiyaç duyduğu bir takım bilgileri de çağrıcıdan talep ederler. Böyle durumlarda çağrıcı bu fonksiyonlara ihtiyacı olan bilgileri parametreler yardımıyla iletirler.

Fonksiyonların ihtiyaç duyduğu bu bilgileri iletmenin iki farklı yöntemi vardır. Bu yöntemlerden birincisine değer ile geçirme, ikincisine ise referans ile geçirme adı verilir. Bu iki yöntemi izah ederken gelin bir örnek üzerinde bu yöntemleri anlamaya çalışalım.

Öncelikle son zamanlarda karşılaştığım bir bilgiden bahsedeyim. “Yerinde Servis” denen bu uygulama ile aldığınız ürün arıza yapınca bu ürünü teknik servise götürmek yerine teknik servise haber veriyorsunuz ve teknik arkadaşlar gelip sorunu ürünün bulunduğu yerde çözmeye çalışıyorlar. Bu yöntem müşteri olarak benim çok hoşuma gitti. Ne kadar kullanılıyor bilmiyorum ama güzel bir gelişme olduğunu söylemeliyim.

Konumuza geri dönersek, şimdi sizin bilgisayarınızın arızalandığını düşünelim. Sizde doğal olarak teknik servisi arıyorsunuz ve arızayı bildiriyorsunuz. Onlarda bilgisayarı servisimize getirin ve tamiratını yapalım diyorlar. (Bu her zaman bu kadar kolay olmaz tabi J) Bunun üzerine sizde bilgisayarınızı koltuğunuzun altına alıp servisin yolunu tutuyorsunuz. Gerekli tamirat yapılıyor ve teslim alıp eve geri dönüyorsunuz.

Gelin şimdi bu senaryoyu bir bilgisayar programı olarak modelleyelim. Siz evinizde oturuyorsunuz yani ana program bellekte oturuyor ve bir ihtiyaç çıkıyor. (Bilgisayar tamiri) Siz bunun için teknik servisi aradınız ama programın böyle bir şansı yok tabi ama o da bir fonksiyona çağrıda bulunabilir ve o da öyle yapıyor. Siz arızayı bildirdiniz onlarda size bilgisayarı oraya götürmenizi söyledi. Dolayısıyla fonksiyonumuzda ana programdan bilgisayarı istemeli, o vakit fonksiyonumuz şöyle olmalı

Bilgisayar TeknikServis(Bilgisayar nesne);

Burada fonksiyonumuz çağrıcıdan Bilgisayar tipinde bir nesne istiyor. Yani bilgisayar nesnesini kendi bulunduğu konuma göndermesini istiyor. Teknik servisin sizden istediği gibi, tamir yapılıyor ve bilgisayar geri alınıyor. İşte bu şekilde fonksiyonun istediği bilginin fonksiyona gönderilmek suretiyle fonksiyonun işletilmesine değer ile çağırma diyoruz.

Şimdi ise bu senaryomuzu yukarıdaki “Yerinde Servis” bilgisinden faydalanarak tekrar düzenlemeye çalışalım. Siz yine arıza için teknik servisi aradınız, bilgisayarı götürmek istemiyorsunuz ve çok meşgulsünüz, bu sefer diyorsunuz ki ben yerinde servis istiyorum. Bu sefer teknik servis yetkilileri sizden bilgisayarı değil bilgisayarın bulunduğu adresi isteyeceklerdir. Bu durumda teknik servis yetilileri sizin adresinize gelecek ve arızayı düzelteceklerdir. Bunun gibi ana program da fonksiyonu çağırdığında fonksiyon ondan Bilgisayar nesnesi değil, onun bulunduğu adresi isteyecektir. Buna göre yazılmış temsili fonksiyonda şöyle olmalı

void TeknikServis(Bilgisayar * nesne);

Burada “*” işaretiyle fonksiyona bir bilgisayar değil bir bilgisayarın bulunduğu konumun adresini gönderdiğimizi belirtiyoruz. Ardından fonksiyon bu adrese ulaşarak gerekli işlemleri yerine getiriyor. İşte bu şekilde fonksiyona istediği bilginin adresini göndermek suretiyle fonksiyonun işletilmesine referans ile çağırma diyoruz.

Tabi gerçek hayat senaryomuzla bilgisayar sistemi birebir örtüşmüyor. Yani siz bilgisayarın kendisini alıp götürürken, ana programın gönderdiği nesnenin bir kopyası oluşturuluyor ve fonksiyon bunun üzerinde çalışıyor, bundan dolayı ana programdaki nesnede bir değişiklik olmuyor. Diğer taraftan referansla çağırma örneğimizdeki durum birebir geçerlidir.

Şimdi size bana bu iki çağırma yöntemi arasındaki farkı açıkça ortaya koyan güzel bir örnekten bahsetmek istiyorum. 10 MB büyüklüğündeki renkli resim dosyanızı bir resim programı ile siyah-beyaza çevirmek istediğinizi düşünelim. Bunun için program içindi resim dosyanızı açtıktan sonra (yeni belleğe yükledikten sonra) program içinde siyah-beyaza çevir komutu verdiniz. Bu esnada ana programın bu işlem için siyahbeyaza_cevir isminde bir fonksiyona çağrıda bulunduğunu düşünelim. Eğer bu fonksiyonu değere göre çağırırsak doğal olarak bu fonksiyon bizden çevireceği resim dosyasını isteyecektir. Fonksiyon resim dosyasının bir kopyası ile çalışacağı için resim dosyasının bir kopyası oluşturulacak ve bellekte 10 MB asıl + 10 MB kopya olmaz üzere 20 MB alan bu dosya için tahsis edilecektir. Oysa referansa göre çağırmış olsaydık fonksiyona sadece resim dosyasının adresini geçirmek yeterli olacaktı.

Referansa göre geçirme özellikle büyük boyutlu dosyalarla çalışırken kullanılabilecek oldukça etkili bir tekniktir. Programcı olarak bizlerin bilmesi gereken bu teknikleri doğru yerde ve doğru zamanda kullanarak etkili programlar geliştirmektir. Programlama sanatında ortaya güzel eserler çıkarmak isteyenler için bu detaylar vazgeçilmez öneme sahiptir.

Tags: ,

C Notları

Yorum ekle




  Country flag
biuquote
  • Yorum
  • Canlı önizleme
Loading


Zafer Günlükleri © 2008 - 2012 Zafer'in kişisel paylaşım sitesi.
BlogEngine.NET 2.0.0.36 | Tema : Mads Kristensen | Düzenleyen : Zafer Çelenk
Oturum Aç | APML ile filtrele

Anket

D dilini duydunuz mu?




Sonuçlar

Projeler

Galeri

Takvim

<<  Şubat 2012  >>
PaSaÇaPeCuCuPa
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

Yazıları takvimde göster

Satranç

I play chess at Chess.com!

Son Yorumlar

Comment RSS

Yasal Uyarı

Bu site görüşlerin paylaşıldığı kişisel bir blogdur. Site içeriğinden meydana gelebilecek sorunlardan site sahibi sorumlu değildir. Yorumlar site sahibi tarafından onaylandıktan sonra yayınlanacaktır.