ÜYE GİRİŞİ  
Kullanıcı adı :
Parola :
 
  Üye Ol!  
 
 
ANASAYFA HABERLER ASP ASP.NET PHP C/C++ C# JAVA ARAMA İLETİŞİM

ASP.NET
  Expression Web ile Site Yapimi
  Web Server Control Yazmak - 2
  Web Server Control Yazmak - 1
  Sql Cache Dependency
  Web Kontrollerini Etkin Kullanmak
  Xslt Kullanımı
  Bir Web Sayfasının Anatomisi
  Client Script Callback
  Login Kontrollerinin Kullanımı

ASP
  ASP Nesneleri
  29 Soruda ASP
  Matematiksel Uygulamalar
  Select Case Yapısı 2
  Fonksiyon(Function) Kullanımı
  IF-ELSE...
  GET Yöntemi ile İşlemler
  Asp de Tarih ve Saat fonksiyonları
  While-wend döngüsü

C Sharp (C#)
  C#'da klasör işlemleri
  C# ile diziyi tersine çevirme
  Çok Kullanılan Kontroller-1
  C# ile Kronometre Uygulaması
  Overloaded Metotların Gücü
  C# ile XMLQuery Örneği
  Rastgele Kod Üretimi
  Kontroller ile Çalışma
  Düzenli İfadeler Nedir?

DUYURULAR

F# Microsoft dil teknolojisinin en yeni üyesi.Common Lisp-Slime-Emacs tarzında etkileşimli,kıvrak,sonuçların anında görülebildiği ve yüksek performanslı bir betik dil olarak özetleyebiliriz bu yeni dili. devamı >>


Türk Telekom'dan yapılan yazılı açıklamada, Telekomünikasyon Kurumu'nun onayladığı yeni tariflerin, internet servis sağlayıcı şirketlerin maliyetlerini önemli oranlarda düşüreceği aktarıldı. devamı >>


Farklı Sayıda Argümana Sahip Olabilen Fonksiyonlar | Asundinay.Com
C/C++ İçin Eklenmiş Makale
 Makale Adı  :  Farklı Sayıda Argümana Sahip Olabilen Fonksiyonlar
 Yayın Tarihi :  12.08.2007 20:31:38 Ekleyen :  Kazım Aydın Okunma : 166

 

Fonksiyonlar, parametre parantezleri içerisinde belirtilmiş argüman sayısı kadar parametre değişkenine sahip olabilirler. Dolayısıyla biz bir fonksiyonu çağıracağımız zaman, bu fonksiyona aktaracağımız parametre değişkenlerinin sayısı bellidir. Ancak C dili, argüman sayısı değişebilen fonksiyonlar tanımlanmasına da olanak tanır. C dilinde fonksiyon tanımlamanın en genel biçimi şöyledir :

[geri_dönüş_değeri_türü] <fonksiyon_adı> ([parametre_değişkenleri])
{
        //fonksiyonun yaptığı işler
}

Fonksiyon tanımlaması sırasında, fonksiyona aktarılacak parametre değişkenlerinin sayısı da belirtilmiş olur. Örneğin :

int topla (int sayi1, int sayi2)
{
          return sayi1 + sayi2;
}

şeklinde bir fonksiyon tanımlanmışsa, çağrım sırasında fonksiyona iki tane parametre değişkeni aktarılır. Peki, öyle bir durumla karşı karşıya kalalım ki bu sayı değişebilir olsun. Bu sayı kimi durumlarda iki, kimi durumlarda üç vs şeklinde olsun. Bu durumda ne yapacağız ? Bu sorunun cevabı, bugünkü makalemizin konusunu oluşturuyor. C dilinde, parametre değişkeni sayısı değişken olan fonksiyonlar yazılabilir. Bu konuda iyi bilinen bir örnek standart printf fonksiyonudur. Ekrana kaç değer yazdırmak istersek isteyelim, her defasında printf fonksiyonu ile bunu gerçekleştirebiliyoruz.

Değişken argümana sahip fonksiyon yazarken mutlaka en az bir argüman ismi ile belirtilmelidir. Fonksiyonun tanımlanması sırasında, bu isim başlangıç noktası olarak kullanılacaktır. Argüman sayısının belirsiz olduğunu derleyiciye anlatmak için argüman listesinin sonuna üç nokta (...) operatörü yazılır. (Ellipsis operatörü) İsmi ile verilen argümanlara "isimlendirilmiş argümanlar", üç nokta ile belirtilmiş sayısı belirsiz olan argümanlara ise "isimlendirilmemiş argümanlar" denilmektedir. Bir örnekle durumu açıklayalım :

int topla (int a,...)
{
     //...
}

Bu tanımlamada, tamsayı türünde olan a argümanı isimlendirilmiş argümandır. Üç nokta ile belirtilen diğer argümanlar ise isimlendirilmemiş argümanlardır. Bu fonksiyonu çağıracağımız zaman parametre parantezi içerisine bir tane tamsayı türünde değişken ve sayısını çağırma sırasında belirleyeceğimiz kadar değişken yazabiliriz. Bu tamamen programcıya kalmıştır. Fonksiyon içerisinde belli araçlar kullanarak, fonksiyona aktarılmış tüm parametre değişkenlerine ulaşabiliriz. Bu şekilde tanımlanmış bir fonksiyon aşağıdaki şekillerde çağrılabilir :

{
   int a = 10;
   int sonuc;
   //...
   sonuc = topla(a,1,2,3);
   sonuc = topla(a,1);
   sonuc = topla(a,1,5,8,9,34);
}

Fonksiyonun tanımlanması sırasında argümanlara isimleriyle ulaşıyoruz. Peki bu isimlendirilmemiş argümanlara nasıl ulaşacağız ? Bunun için öncelikle "include" önişlemci direktifi ile "stdarg.h" başlık dosyasını kodumuza eklememiz gerekir. Bu başlık dosyası, böyle bir fonksiyonun oluşturulması için tanımlanmış özel bir tip ve üç tane makro içermektedir. Fonksiyon içerisinde bunları kullanarak isimlendirilmemiş argümanlara ulaşabileceğiz. Söz konusu özel tip, çoğu derleyicide va_list ismi ile kullanılır. Diğer üç makronun isimleri de va_arg, va_start ve va_end’dir.

 

ADI

İŞLEVİ

BİLDİRİMİ

va_list

va_list tipi, va_arg ve va_end tarafından ihtiyaç duyulan bilgileri içeren bir dizidir. Fonksiyonun başında bu tipten bir nesne tanımlanır. Bu nesneye argüman işaretçisi diyelim. typedef char *va_list

va_start

va_start makrosu ile argüman işaretçisi, fonksiyona aktarılan ilk isimlendirilmemiş argümana konumlandırılır. Dolayısıyla işleme başlarken öncelikle bu fonksiyonu çağırmamız gereklidir. Bu makro çağrıldıktan sonra, argüman işaretçisine ilk değer ataması yapılmış olur. void va_start(va_list vl, isimlendirilmis_arguman);

va_arg

va_arg makrosu ile eğer argüman işaretçisi fonksiyona aktarılan isimlendirilmemiş argümanlardan ilki üzerine konumlanmışsa, isimlendirilmemiş argüman listesindeki bir sonraki argümana ulaşım sağlanır. va_arg makrosu, argüman işaretçisinin değerini de değiştirir. Bu şekilde adım adım ilerlenerek makro her çağrıldığında, listedeki bir sonraki isimlendirilmemiş argümana ulaşılır. arguman_tipi va_arg(va_list vl, arguman_tipi);
va_end va_end makrosu ile fonksiyondan çıkılmadan önce birtakım düzenlemelerin yapılması sağlanır. Bu makro fonksiyon tanımlamasından çıkılmadan önce mutlaka bir defa çağrılmalıdır. void va_end(va_list vl);

Örnek olarak çokgenlerin çevresini hesaplayacak bir fonksiyon yazalım. Bir çokgen üç, dört, beş vb kenara sahip olabilir. Sadece bir fonksiyon yazıp, tüm çokgenler için bu fonksiyonu kullanarak işimizi halletmek istiyorsak, değişken sayıda argümana sahip olabilecek bir fonksiyon yazmak iyi bir çözüm olabilir. Fonksiyonumuzun prototip bildirimini yapalım :

double CevreBul(int kenar_sayisi,...);

Görüldüğü üzere fonksiyonumuz bir isimlendirilmiş parametreye ve isimlendirilmemiş parametrelere sahip. (En az bir tane isimlendirilmiş parametre olması gerektiğini hatırlayınız) Şimdi fonksiyonumuzun tanımına geçelim :

double CevreBul(int kenar_sayisi,...)
{
   va_list argList;
   double arg;
   double toplam = 0.0;
   int i;
va_start(argList,kenar_sayisi);
   for (i = 0; i < kenar_sayisi; ++i)
   {
      arg = va_arg(argList,double);
      toplam += arg;
   }
   va_end(argList);
   return toplam;
}

Fonksiyonun kodunu inceleyelim. İlk olarak va_list tipinden argList isimli bir nesne tanımladık. Bu nesne, argüman işaretçisi ismiyle anılır ve yukarıda bahsettiğimiz makrolarla beraber kullanılarak fonksiyona aktarılan parametre değişkenlerine ulaşmamızı sağlar. double türünde tanımladığımız arg isimli nesne, fonksiyon içerisinde sırayla ulaşacağımız parametre değişkenlerini tutacak. toplam isimli double türünden nesne ise, parametre değişkenlerinin toplam değerini tutacak. Fonksiyonun ilk parametresi, çokgenin kenar sayısı bilgisini tutuyor. İlk olarak va_start makrosunu çağırarak argüman işaretçisinin ilk isimsiz parametreye konumlanmasını sağlıyoruz. Çevre değerini hesaplarken, kenar_sayisi parametre değişkenini döngünün kaç kez döneceği bilgisi olarak kullanabiliriz. Döngü içerisindeki ilk satırda, va_arg makrosu ile sıradaki parametre değişkenine ulaşıyoruz, ve bu değeri arg nesnesinde saklıyoruz. arg nesnesinde saklanan bu değeri her adımda toplam isimli nesneye ekliyoruz. Döngüden çıkıldığında, va_end makrosunu çağırarak gerekli düzenlemelerin yapılmasını sağlıyoruz ve toplam nesnesinin değerine dönüyoruz. Artık bu fonksiyonu istediğimiz sayıda kenara sahip olan bir çokgenin çevresini bulmak için kullanabiliriz.

CevreBul(3,10.0,10.0,10.0);         //Kenar uzunlukları 10 olan üçgenin çevresi

CevreBul(4,10.0,20.0,30.0,40.0);  //Kenar uzunlukları 10, 20, 30, 40 olan çokgenin çevresi

Bu çağırmalar sonucunda ekrana sırasıyla 30.0 ve 100.0 değerleri yazacaktır. Bir sonraki makalemizde görüşmek üzere...
Kaynak kod için tıklayın.


 

Kaynak : csharpnedir.com


 

C/C++ İçin Eklenmiş Tüm Makaleler
C/C++ İçin En Son Eklenen 5 Makale
 Makale Adı  :  C ögreniyorum -8-
 Yayın Tarihi :  16.10.2008 17:20:17 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -7-
 Yayın Tarihi :  22.06.2008 15:48:18 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -6-
 Yayın Tarihi :  20.06.2008 18:15:06 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -5-
 Yayın Tarihi :  26.10.2007 10:24:15 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -4-
 Yayın Tarihi :  13.09.2007 23:36:40 Ekleyen :  özen Karaçakır Makaleyi Oku  

C/C++
  C ögreniyorum -8-
  C ögreniyorum -7-
  C ögreniyorum -6-
  C ögreniyorum -5-
  C ögreniyorum -4-
  C ögreniyorum -3-
  C ögreniyorum -2-
  C ögreniyorum -1-
  İlk C++ Programımız

JAVA
  Java ile Histogram Eşitleme
  JAVA İçinde Thread Kullanımı
  Serialization İşlemleri 2
  Serialization İşlemleri
  İlk Bakışta JSP
  Servletler ile Web Sayfaları
  Java ile Grafik Çizim
  Java, MySql Bağlantısı
  JBuilder ile Database

PHP
  php dersleri -1-
  php/access ile silme işlemi
  php ile access'e bağlanma - 2
  php ile access'e bağlanma - 1
  Döngü ve Diziler - BÖLÜM 5
  Döngü ve Diziler - BÖLÜM 4
  Döngü ve Diziler - BÖLÜM 3
  Döngü ve Diziler - BÖLÜM 2
  Döngü ve Diziler - BÖLÜM 1

İSTATİSTİKLER
  Toplam ziyaret :  24684
  Toplam üye sayısı :  1077
  Asp makale sayısı :  20
  Asp.Net makale sayısı :  54
  Php makale sayısı :  26
  C/C++ makale sayısı :  51
  C# makale sayısı :  29
  Java makale sayısı :  33
  Toplam makale saıysı :  213
Copyright asundinay® 2007 Her Hakki Saklidir
Tasarim & Programlama asundinay®