( تعداد نمایش : 559 )

Ellipsis – Variable Argument در VC6

داشتم فکر می کردم با چی شروع کنم که یاد (…) یا همون Ellipsis افتادم. شاید دیده باشید که ازش توی برنامه نویسی استفاده کرده باشن و شاید هم به احتمال زیاد اصلا ندیده باشید که خوب یه جورایی طبیعی هستش٬ چون کاربرد رایجی نداره و کمتر استفاده میشه.

(…) رو اصطلاحا میگن Ellipsis .

کجا ها کاربرد داره ؟

- جاهایی که نمی خوان محدودیتی در تعداد و نوع پارامترهای پاس شده باشه!

مثلا تابع printf رو در نظر بگیرید که یک رشته ورودی بهش پاس می کنید که می تونه علاوه بر این رشته٬ یک سری پارامتر دلخواه با هر نوع ممکن رو که دوست دارید در محلی که در رشته مشخص کردید چاپ بشه٬ رو هم می تونید به عنوان ورودی بهش پاس کنید یا نکنید.

شاید بگید خب که چی؟!؟!

- اگه یکم دقت کنید می بینید که توی تعریف تابع باید نام و نوع ورودی ها کاملا مشخص و معتبر باشه و تعداد نامحدود عملا نمی تونه داشته باشه!! پس چطوری تابعی مثل printf بنویسیم؟؟06 Ellipsis   Variable Argument  در VC6

اینجاست که Ellipsis ضرورت پیدا میکنه.

حالا چطوری استفاده میشه ؟

- خیلی ساده!
شکل کلی تعریف تابع با استفاده از Ellipsis به شکل زیر هستش:

void MyFunction(int x,…);

البته این یک نمونه مثال هستش. به کمک x که قبل از … اومده به آدرس اولین متغییر بعدی پاس شده به تابع بر روی stack دسترسی خواهیم داشت٬ اما این اصلا ربط مستقیم به نوع و مقدار x نداره و کامپایلر از این تنها برای دسترسی به متغییر های بعدی استفاده می کنه که اصطلاحا Variable Argument می گن.

ابتدا باید یک متغییر از نوع va_list تعریف کنید. بعد باید از تابع va_start به شکل زیر استفاده کنید:

va_list vl;

va_start( vl, &x);

حالا از طریق متغییر vl به متغییرهای پاس شده دسترسی خواهید داشت٬ مثلا به شکل زیر:

double d;

d = va_arg( vl, double );

خط بالا اولین متغییر رو که فرض کردم double هستش بر می گردونه و برای متغییرهای احتمالی بعدی به همین شکل ادامه پیدا می کنه.

در پایان استفاده باید تابع va_end رو صدا بزنید :

va_end( vl );

حالا دیگه به چه شکل دوست دارید استفاده کنید با خودتونه!

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن