PDA

View Full Version : ParamArray



arenaw
پنج شنبه 30 شهریور 1391, 19:16 عصر
سلام دوستان
من با ویبی برنامه نویسی کردم و یه چند وقتیه دارم با سی کار میکنم هنوز راه نیفتادم
توی ویبی موقع نوشتن فانکشن میتونی آخیرین ورودی رو به صورت ParamArray بذاری که میتونه هر چند تا بخوای ورودی توش جا بگیره . مثل printf توی سی که که ورودی دومش میتونه 10 تا متغیر باشه...
میخواستم ببینیم چطور اینجوری فانکشن بنویسم؟

#target
پنج شنبه 30 شهریور 1391, 20:39 عصر
به این صورت
#include <stdarg.h>
//-----------------
void __cdecl Function (int i , ...)
{
va_list ParamArray;
va_start(ParamArray,i);
// دسترسی به آرگومان ها
int Arg2 = va_arg(ParamArray,int);
int Arg3 = va_arg(ParamArray,int);
}

mr AHR
جمعه 31 شهریور 1391, 10:48 صبح
بحث تموم شده ولی اصلا توصیه نمیشه از این روش استفاده کنید
اگر برای ورودی مثلا به جای int مثلا char بفرستن شما به هیچ وجه نمیتونی تشخیص بدی و مشکل پیش میاد ( اینجا (http://barnamenevis.org/www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/)رو مطالعه بفرمایید حتما )

arenaw
جمعه 31 شهریور 1391, 11:42 صبح
بحث تموم شده ولی اصلا توصیه نمیشه از این روش استفاده کنید
اگر برای ورودی مثلا به جای int مثلا char بفرستن شما به هیچ وجه نمیتونی تشخیص بدی و مشکل پیش میاد ( اینجا (http://barnamenevis.org/www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/)رو مطالعه بفرمایید حتما )
اتفاقا برای ورودی از رشته (char[]) استفاده کردم و مشکلی پیش نیومد.
چیزی که توی لینک شما بود و من متوجه شدم، اومده بود واسه یک paramarray از چند نوع داده استفاده کرده بود
cout << FindAverage(6, 1.0, 2, "Hello, world!", 'G', &nValue, &FindAverage) << endl;

فقط مشکلم اینه که اگه میشد تعداد آرگومان ها ذکر نشه خیلی بهتر میشد

+شما روش بهتری سراغ دارین؟

mohsen.hex
جمعه 31 شهریور 1391, 23:41 عصر
سلام
من هم دقیقا همین مشکل رو دارم !
من برنامه نویسی میکرو انجام میدم و زیاد از برنامه نویسی سر در نمیارم و میخاتم خواهش کنم که این ها رو توضیح بدین؟

va_list ParamArray;
این تعریف متغیره؟؟ چه نوعی هست؟؟
va_start(ParamArray,i);
این تابع هست؟؟ توی کامپایلر من به همین گیر میده!

IamOverlord
شنبه 01 مهر 1391, 05:52 صبح
تا جایی که من اطلاع دارم موقع فراخوانی تابع، کامپایلر آرگومان ها رو PUSH می کنه تو Stack...
شما تعداد آرگومان ها رو مشخص می کنی...
زیربرنامه ات بر اساس اون تعداد، آرگومان ها رو POP می کنه...
اون توابع و Type ها هم در این مورد تو stdarg.h تعریف شدن...
در ضمن POP و PUSH دو دستور Assembly هستن که با اولی داده ها رو به حافظه ی Stack می بری و با دومی داده ها رو می تونی خارج کنی... که یکی از کاربردهاشون ارسال آرگومان به توابع هست یا مثلا تعریف متغیر های محلی...