PDA

View Full Version : va_start



meysam_meysam74
یک شنبه 25 فروردین 1387, 00:21 صبح
سلام .

pArgList = (char *) &szFormat + sizeof (szFormat) ;
کسی می دونه تویه این یه خط کد دقیقا چه اتفاقی افتاده !
یکم توضیع .

Nima_NF
یک شنبه 25 فروردین 1387, 15:16 عصر
این کدی هست که ماکرو va_start انجام می دهد ، یعنی دسترسی به آرگومان های تابع شما.

از آنجایی که تعداد پارامترهای تابع نامشخص هست، لذا از طریق کد فوق به اولین آنها بعد از ... دسترسی پیدا خواهیم کرد، یعنی کد فوق آدرس رشته آخر (و مشخص) قبل از ... را می گیرد و به علاوه اندازه اش می کند تا به مکان اولین پارامتر بعد از آن دسترسی بیاید.

meysam_meysam74
یک شنبه 25 فروردین 1387, 22:49 عصر
ممنون فکر کنم متوجه شدم .
در واقع ادرس متغیری رو که ما در اینجا ... میدیم رو به ما بر میگردونه درسته ؟
بعد اگه متغیر ها ثابت نباشن و نوع متغیر رو چه جوری ما می تونیم متوجه بشیم مثلا اولی int دومی char خوب اینا هر کدوم یه فضایه مشخصی رو اشغال می کنن ما چه جوری می تونیم نوع متغیر رو پیدا کنیم و پارامتر هایه بعدی چی اصلا این کار کاره ما است یا اینکه این اشاره گر فقط قابل استفاده در تابع های دیگه هست ؟

Nima_NF
دوشنبه 26 فروردین 1387, 16:21 عصر
شما باید خودتان در تابع یک قانونی وضع کنید تا ترتیب مشخص شود و معلوم شود در آرگومان چندم مثلا از نوع int هست، بعد به راحتی با استفاده از ماکرو va_arg می توانید با مشخص کردن نوع داده ای در آرگومان دومش معلوم کنید نوع داده ای شما چند بایت می باشد و خودش اشاره گری بر میگرداند از نوع داده ای مشخص شده خودمان.

در مثال زیر از عدد ورودی پارامتر اول برای تشخیص نوع داده ای استفاده می کنیم :



void YourFunction ( int i, ...)
{
va_list argptr;
va_start(argptr, i);

if ( i == 0 )
{
// i=0 --> int
int n1 = va_arg( argptr, int );

} else
{
// i=1 --> double
double n2 = va_arg( argptr, double );

} esle
{
char *n3 = va_arg( argptr, char*);
// i>1 --> char
}
}

int main()
{
YourFunction ( 0, 125 );
YourFunction ( 1, 125.674 );
YourFunction ( 6, 'A' );
// Do something
return 0;
}

meysam_meysam74
دوشنبه 26 فروردین 1387, 19:00 عصر
درسته ممنون متوجه شدم