printf cout gibi fonksiyonlar hakkında

Başlatan mcan, 25 Mart 2007, 19:30:46

mcan

printf gibi bir fonksiyonu nasıl oluşturabiliriz? merak ettin özellik şu ;printf nasıl oluyorda içine sabit olmayacak şekilde virgül kabul ediyor? örneğin bir fonksiyon oluştursam aşşağı yukarı şu şekilde olur ;int printf(string ,int x ,int y,...){} .buarada herbir değişkeni virgül ile ayırdım ve kullanmam gerektiğinde her biri için bir değişken atamalıyım atamassam hata verir,eğer fazla değişken atarsam da yine hata verir.bu tip fonksiyonlar nasıl oluşturulur?

Klein

int printf( const char _far *format, ... )
{
   int *arg;   /* argument              */
   int total;   /*            */
   int i;

   total = 0;   /*           */

   /* argument              */
   arg = (int *)&format;
   arg += (sizeof(const char _far *) / sizeof(int));

   while ( *format ) {
      if ( *format == '%' ) {
         format++;
         if ( *format == '%' ) {
            if( putchar('%') == EOF )
               return EOF;
            format++;
            total++;
         } else if(!(format = _print(_pc, format, &arg, &total)))
            return EOF;
      } else {
         if( putchar( *format ) == EOF )
            return EOF;
         format++;
         total++;
      }
   }
   return total;
}

vsalma

Fonksiyon aşırıyükleme(Function overloading) ile..

Aynı isimli fonksiyonlar oluşturuluyor. Parametre tipleri veya sayıları farklı.

mesela
int deneme(int a, int b)
{
.
.
}

int deneme(int a)
{
.
.
}

Parametre nasıl geliyorsa ona göre işlem yapılıyor.
Aşırı yüklenmiş metodlar diye aratarak kaynaklar bulabilirsiniz sanıyorum.

d_yol

Klein yazmış:

int printf( const char _far *format, ... )

burada en sonundaki ... dikkat et. Bu c ve c++ 'da değişken sayıda parametre demek. C de va_start, va_next ve va_end diye başlıyan sistemrutinler var.
Bunlarla bu tür parametrelere ulaşabiliniyor. Printf ama parametre sayısını ve tipini nerden anlıyor ? Çok basit, format string tarıyor ve % ile başlayan parametre tanımlarını tespit ediyor.
Cout ama farklı çalışıyor. C++ operator overloading var. C++ daki operatörlere yeni işlem tanımlayabiliyorsun yani << ve >> cout ve cin de veri alma/verme fonksyonu verilmiş.

BioOriented

Alıntı yapılan: "vsalma"Fonksiyon aşırıyükleme(Function overloading) ile..

Aynı isimli fonksiyonlar oluşturuluyor. Parametre tipleri veya sayıları farklı.


Parametre nasıl geliyorsa ona göre işlem yapılıyor.
Aşırı yüklenmiş metodlar diye aratarak kaynaklar bulabilirsiniz sanıyorum.

Aşırı yüklenmiş parametreler ile değişken sayıda parametre kullanımı farklı şeylerdir.
MSDN'de Calls with a Variable Number of Arguments diye aratırsanız detaylı bilgiye ulaşabilirsiniz.

Örnek fonksiyon
void mirErrorMessage(LPCTSTR lpszFormat,...)
{
	ASSERT(AfxIsValidString(lpszFormat));

	va_list argList;
	va_start(argList, lpszFormat);
	CString str;
	str.FormatV(lpszFormat, argList);
	va_end(argList);
	if (str.Right(1) != "\n") str = str + "\n";
	mirDump << str;
	gstrError = gstrError + str;
	
}

mcan

cevaplar çok yardımcı oldu sağolun.printf in tırnaklar içinde kalan karakter katarının (elde edebileceğimiz) adresi varmıdır?disassembler ile baktığımda sanki bana her ayrı printf ayrı ayrı derleniyormuş gibi geldi.aslında karakter katarlarını tektek-komple hafızaya alıp ana döngüye alıyor sanıyordum.ama denediğim kadarıyla böyle değil. zaten tırnak işareti olan yer yerine değişken string atanmasına da müsade etmiyor

Klein

Alıntı yapılan: "mcan"zaten tırnak işareti olan yer yerine değişken string atanmasına da müsade etmiyor

Printf fonksiyonunun nasıl derlendiğini hiç incelemedim. Ama format metnini dışarıdan başka bir değişkenden alabiliyorsunuz. hatta parametre listesini de başka bir değişkenden alabiliyorsunuz.

Klein

Şimdi hatırladım
Printf fonksiyonunu ilk kullandığımızda 2-8 K (işlemciye ve derleyiciye göre değişiyor) arasında bir kod alanı kaplıyor. Sonraki her kullanışımızda 15-500 byte civarında kod alanı kullanıyor. Aynı şekilde scanf fonksiyonu da printf ile bazı ortak fanksiyonları kullanıyor.