PDA

View Full Version : سوال: سوال در مورد sprintf



yashar666
دوشنبه 25 اسفند 1393, 20:56 عصر
با سلام
من میخوام نوع فرمت ورودی رو به صورت به string به بخش فرمت این تابع بدم (پارمتر دوم ) اما از اونجایی که به صورت const تعریف شده امکان پذیر نیست چه روشی رو پیشنهاد میکنید

int sprintf ( char * str, const char * format, ... );

مثلا میخوام این رو
sprintf ( buff, "P= %5d", count );

به این :
unsigned char format[]="P= %5d"
sprintf ( buff, format, count );

rahnema1
دوشنبه 25 اسفند 1393, 21:49 عصر
با سلام
من میخوام نوع فرمت ورودی رو به صورت به string به بخش فرمت این تابع بدم (پارمتر دوم ) اما از اونجایی که به صورت const تعریف شده امکان پذیر نیست چه روشی رو پیشنهاد میکنید

int sprintf ( char * str, const char * format, ... );

مثلا میخوام این رو
sprintf ( buff, "P= %5d", count );

به این :
unsigned char format[]="P= %5d"
sprintf ( buff, format, count );
مشکلی نداره نوعی که const باشه میشه به جای اون از نوع غیر const به عنوان پارامتر تابع استفاده کرد چون هر دو در کامپیوتر از لحاظ representation و alignment به یک شکل هستند
البته می تونید اینجور هم بنویسید
const char format[] = "P= %5d";

yashar666
دوشنبه 25 اسفند 1393, 21:55 عصر
خیر نمیشه وکامپایلر اجازه نمیده متغیر غیر const شده توش بزیزم دستور const char format[] = "P= %5d"; میشه ولی من این رو نمیخوام هدفم این در طول برنامه فرمت رو هی عوض کنم شما نمیتونید مقدار const char format[] رو در طول برنامه عوض کنید !

rahnema1
دوشنبه 25 اسفند 1393, 22:02 عصر
شما unsigned را بردارید درست می شه

yashar666
دوشنبه 25 اسفند 1393, 22:04 عصر
مظورتون اینه که من اینو بنویسیم درسته !

char format[]="P= %5d"

sprintf( buff, format, count );

yashar666
دوشنبه 25 اسفند 1393, 22:07 عصر
خیر الان نوشتم همون مشکل قبل (به const نبودن گیر داد )

خواستم آدرس اون متغیر const رو تو یه اشاره گر دیگه بریزم و مقدار اون رو تغییر بدم که باز اجازه نمیده ظاهرا حرف کلیدی const یه بلایی سر آدرس میاره .که قابل انتقال به جای دیگه ای که آدرس غیر const شده هست نیست .

rahnema1
دوشنبه 25 اسفند 1393, 22:19 عصر
شما از چه کامپایلری استفاده می کنید؟
هر کامپایلری که استاندارد زبان c را پشتیبانی کنه باید بتونه این عبارت را اجرا کنه

yashar666
دوشنبه 25 اسفند 1393, 23:06 عصر
حرف شما درسته
من از codevsion avr استفاده میکنیم که پشتیبانی از این حالت خاص نمیکنه ! ولی میخوام راه حلی پیدا کنم !

reza_noei
دوشنبه 25 اسفند 1393, 23:37 عصر
سلام فرض کنید امکان بالا وجود داشته باشه :

char format[]="P= %5d"

sprintf( buff, format, count );



بعد برنامه نویس به جای count1 بنویسه ++Format[5]
اونوقت چه بلایی سر برنامه میاد؟

همینه که طراح میاد از عبارت const در تعریف استفاده میکنه!
تو کامپایلر من به کد بالا تنها یک warning نشان میده اما در حقیقت خطا مناسب تر به نظر میرسه.
من فکر میکنم که شما میخواهید یک رشته را با پارامترهای آن به صورت خاصی فرمت دهی کنید و در نهایت آنرا چاپ کنید
به نظر من بهتره سراغ پیاده سازی این تابع بروید.
اگه بتونم کمکتون میکنم.

rahnema1
سه شنبه 26 اسفند 1393, 05:56 صبح
خب شما می تونید چیزهایی که تغییر می کنه را به صورت s% به تابع بدید
مثلا

sprintf ( buff, "%s%5d", "P= ", count );
sprintf ( buff, "%s%5d", "F= ", count );
sprintf ( buff, "%s%5d", "Result= ", count );

yashar666
سه شنبه 26 اسفند 1393, 19:39 عصر
سلام فرض کنید امکان بالا وجود داشته باشه :

char format[]="P= %5d"

sprintf( buff, format, count );



بعد برنامه نویس به جای count1 بنویسه ++Format[5]
اونوقت چه بلایی سر برنامه میاد؟

همینه که طراح میاد از عبارت const در تعریف استفاده میکنه!
تو کامپایلر من به کد بالا تنها یک warning نشان میده اما در حقیقت خطا مناسب تر به نظر میرسه.
من فکر میکنم که شما میخواهید یک رشته را با پارامترهای آن به صورت خاصی فرمت دهی کنید و در نهایت آنرا چاپ کنید
به نظر من بهتره سراغ پیاده سازی این تابع بروید.
اگه بتونم کمکتون میکنم.
ممنون اما من میدونم چه اتفاقی میوفته ! دلیل const بودن رو نخواستم !
شما خیالتون راحت اتفاق در کاری که من میکنم نمیوفته !
راه حل خواستم !
این میکرو طوری طراحی کردم که عددی که تولید میشه رو همیشه int یا float میده و در count می زاره اما فرمت نمایش به وسیله پورت سریال از کامپوتر به میکرو میاد

yashar666
سه شنبه 26 اسفند 1393, 19:41 عصر
خب شما می تونید چیزهایی که تغییر می کنه را به صورت s% به تابع بدید
مثلا

sprintf ( buff, "%s%5d", "P= ", count );
sprintf ( buff, "%s%5d", "F= ", count );
sprintf ( buff, "%s%5d", "Result= ", count );

راه خوبه ممنون امتحان میکنم

yashar666
سه شنبه 26 اسفند 1393, 20:47 عصر
حل شد
یه تابع نوشتم ممنوم ازتون