কম্পিউটার টিউটোরিয়াল

সি ভাষায় ভেরিয়েবল লেন্থ আর্গুমেন্ট (Variadic Functions): stdarg.h ব্যবহার

সি-এ ফাংশনকে ফিক্সড সংখ্যক প্যারামিটার ছাড়া ভেরিয়েবল সংখ্যক আর্গুমেন্ট নেওয়ার জন্য <stdarg.h> হেডার ব্যবহার করা হয়। এর উদাহরণ হলো printf(), scanf()।

সিনট্যাক্স ও ধাপ

double average(int num, ...) { // num = আর্গুমেন্ট কাউন্ট
    va_list valist;            // ১. va_list ভেরিয়েবল ডিক্লেয়ার
    va_start(valist, num);     // ২. ইনিশিয়ালাইজ (লাস্ট ফিক্সড প্যারামিটার দিয়ে)
    for (int i = 0; i < num; i++)
        sum += va_arg(valist, int); // ৩. প্রতিটি আর্গুমেন্ট এক্সেস (টাইপ জানতে হবে)
    va_end(valist);            // ৪. ক্লিনআপ
    return sum / num;
}

ম্যাক্রো/ফাংশন রেফারেন্স

ম্যাক্রো/ফাংশনব্যবহার
va_listআর্গুমেন্ট লিস্ট ট্র্যাক করার টাইপ
va_start(va_list, last_fixed_param)লিস্ট শুরু করুন
va_arg(va_list, type)পরবর্তী আর্গুমেন্ট টাইপ অনুযায়ী এক্সেস করুন
va_end(va_list)ক্লিনআপ (বাধ্যতামূলক)
va_copy(dest, src)C99: লিস্ট কপি করুন (রিইউজের জন্য)

পূর্ণ উদাহরণ: গড় বের করা

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

double average(int num, ...) {
    va_list valist;
    double sum = 0.0;
    va_start(valist, num);
    for (int i = 0; i < num; i++)
        sum += va_arg(valist, int);
    va_end(valist);
    return sum / num;
}

int main() {
    printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
    printf("Average of 5, 10, 15 = %f\n", average(3, 5, 10, 15));
    return 0;
}

আউটপুট

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000

গুরুত্বপূর্ণ সতর্কতা ⚠️

  • টাইপ সেফটি নেই — কলার সঠিক টাইপ পাস করবে তা গ্যারান্টি নেই
  • আর্গুমেন্ট কাউন্ট আলাদা পাস করতে হয় (যেমন printf-এ ফরম্যাট স্ট্রিং থেকে বুঝা যায়)
  • ডিফল্ট আর্গুমেন্ট প্রোমোশন হয়: float → double, char/short → int — তাই va_arg(valist, float) লিখলে ভুল হবে, double লিখতে হবে
  • va_start-এর দ্বিতীয় আর্গুমেন্ট অবশ্যই লাস্ট ফিক্সড প্যারামিটার হতে হবে

আধুনিক C++ বিকল্প (C++11+)

// Variadic templates — টাইপ সেফ, কম্পাইল-টাইম
template<typename... Args>
double average(Args... args) {
    return (args + ...) / sizeof...(args); // Fold expression (C++17)
}

// বা initializer_list (হোমোজেনাস টাইপের জন্য)
double avg(std::initializer_list<int> list) {
    return std::accumulate(list.begin(), list.end(), 0.0) / list.size();
}
  1. C ভাষায় ভেরিয়েবল বাইন্ডিং (Binding) ব্যাখ্যা

  2. সি ভাষায় পুরো স্ট্রাকচার ফাংশন আর্গুমেন্ট হিসেবে পাস করা

  3. সি ও সি++-এ ভেরিয়েবল লেন্থ অ্যারে (VLA)

  4. C প্রোগ্রামে বিজোড় দৈর্ঘ্যের স্ট্রিংকে X ফরম্যাটে প্রিন্ট করা