سلام .
pArgList = (char *) &szFormat + sizeof (szFormat) ;
کسی می دونه تویه این یه خط کد دقیقا چه اتفاقی افتاده !
یکم توضیع .
سلام .
pArgList = (char *) &szFormat + sizeof (szFormat) ;
کسی می دونه تویه این یه خط کد دقیقا چه اتفاقی افتاده !
یکم توضیع .
این کدی هست که ماکرو va_start انجام می دهد ، یعنی دسترسی به آرگومان های تابع شما.
از آنجایی که تعداد پارامترهای تابع نامشخص هست، لذا از طریق کد فوق به اولین آنها بعد از ... دسترسی پیدا خواهیم کرد، یعنی کد فوق آدرس رشته آخر (و مشخص) قبل از ... را می گیرد و به علاوه اندازه اش می کند تا به مکان اولین پارامتر بعد از آن دسترسی بیاید.
ممنون فکر کنم متوجه شدم .
در واقع ادرس متغیری رو که ما در اینجا ... میدیم رو به ما بر میگردونه درسته ؟
بعد اگه متغیر ها ثابت نباشن و نوع متغیر رو چه جوری ما می تونیم متوجه بشیم مثلا اولی int دومی char خوب اینا هر کدوم یه فضایه مشخصی رو اشغال می کنن ما چه جوری می تونیم نوع متغیر رو پیدا کنیم و پارامتر هایه بعدی چی اصلا این کار کاره ما است یا اینکه این اشاره گر فقط قابل استفاده در تابع های دیگه هست ؟
شما باید خودتان در تابع یک قانونی وضع کنید تا ترتیب مشخص شود و معلوم شود در آرگومان چندم مثلا از نوع 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;
}