Variable Argument Lists

Kategori: C , 29 Haziran 2019 , JanFranco


Bir fonksiyonun parametreleri bellidir. Fonksiyon yazılırken tanımlanmıştır. 2 parametre alan bir fonksiyona 3 parametre veya 1 parametre gönderilemez. Ancak variable argument listler ile sınırsız parametreli fonksiyonlar tanımlayabiliriz:


<return type> <function name>(<first parameter>, ...);
Burada 3 nokta, sayısı belirli olmayan parametreleri temsil eder. Bu şekilde bir fonksiyon tanımlayacaksak, 3 noktadan önce en az bir parametre yazmak zorundayız. Burada kullanıcı aşağıdaki şekillerde fonksiyonu çağırabilir:

float average(x, 1, 2, 3, 4, 5, 6);
float average(x, "Hello", 12, 56.12);
Gönderilen parametreleri alabilmek için variable argument list denilen bir yapıyı kullanacağız. Bu yapıyı kullanabilmek için aşağıdaki kütüphaneyi dahil etmeliyiz:

#include <stdarg.h>
Dahil ettikten sonra bir va_list tanımlamalıyız:

va_list args;
Burada va_list bir değişken tipi, args ise bir isimdir. Parametreleri bu listede şu şekilde depolayacağız:

va_start(args, count);
İlk parametre, gelen parametreleri hangi listeye atacağımızı belirler. İkinci parametre, gelen parametrelerin sayısıdır. Parametrelere de şu şekilde erişiriz:

va_arg(args, <type>);
İlk parametre hangi listenin elemanlarını alacağımızı belirler. İkinci parametre, hangi tipte parametreyi alacağımızı belirler. va_arg listedeki bir sonraki elemanı alır. 3 kez ard arda kullandığımızı düşünelim. Bize 3 parametreyi sırayla gönderir. Son olarak va_list'i sonlandırmamız gerekir:

va_end(args);
Parametre olarak hangi listeyi sonlandırıcağımızı alır. Bir örnek yapalım:

#include <stdio.h>
#include <stdarg.h>

float average(int count, ...){
    float result = 0;
    int i;
    va_list args;
    va_start(args, count);

    for(i=0; i<count; i++){
        result += va_arg(args, int);
    }

    return result / count;
}

int main(){
    printf("Result is %f", average(3, 4, 5, 6));
    return 0;
}
average adında sınırsız parametre alabilen bir fonksiyon tanımladık. va_list args diyerek args adında bir liste tanımladık. va_start diyerek parametreleri bu listede depoladık. for döngüsü ile va_arg kullanarak aldığımız int tipindeki parametreleri result'ın üstüne ekledik. Son olarak result'ın değerini gönderilen parametre sayısına bölerek averaj hesabını yaptık.


Sonraki Yazı: FILE Keyword
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın