PDA

View Full Version : برنامه نویسی cross platform در C++



chikar
سه شنبه 04 فروردین 1394, 18:31 عصر
سلام می خواستم بدونم تمام هدر فایل های استاندارد C++‎‎‎‎‎‎‎‎‎ در این لینک (http://en.cppreference.com/w/cpp/header)مستقل از پلتفرم هستند؟
اگه بخواهیم بفهمیم کدی که نوشتیم نه صرفاً هدری که داریم، cross platform هست یا نه چه راهی رو پیشنهاد می کنید؟چون فکر می کنم حتی شیوه برنامه نویسی کردن هم روی قابلیت حمل اون تاثیر می گذاره.

rahnema1
سه شنبه 04 فروردین 1394, 20:30 عصر
stl یا کتابخانه استاندارد جزء استاندارد زبان ++c هست یعنی یک کامپایلر که بخواهد کامپایلر زبان ++c باشه این کتابخانه ها را پیاده سازی می کنه مثل gcc یا clang
یا کامپایلرهای دیگه
اگه بخواهیم بفهمیم یک کتابخانه cross platform هست باید به مستندات اون کتابخانه مراجعه کنیم
برنامه ای که خودمون نوشتیم هم لازمه مطابق استاندارد نوشته بشه که نقطه مشترک کامپایلرها هست اگرچه بعضی قسمتهای استاندارد ممکنه توسط یک کامپایلر هنوز پیاده سازی نشده باشه یا اینکه در بعضی نکات که استاندارد در خصوص نحوه پیاده سازی اونها صرفا دستورالعمل کلی داده باشه یا واگذار به تصمیم خود سازندگان کامپایلرها کرده باشه نحوه پیاده سازی کمی متفاوته (مثلا در سرعت اجرا یا مثلا اندازه نوع هایی مثل longو byte و .. یا نحوه پیاده سازی double و ...)
در کل رعایت اصول استاندارد جهت cross platform بودن کافیه
ضمن اینکه مثلا اگه بخواهید یک کتابخانه گرافیکی را خودتون پیاده سازی کنید چون مثلا در لینوکس و ویندوز api متفاوت وجود داره لازمه یه برنامه
کلی بنویسید که نحوه استفاده از تابعهای گرافیک برنامه تون برای کاربر ویندوز و لینوکس یکی باشه اما در سطوح زیرین باید
واسه ویندوز یک جور و مثلا واسه لینوکس یه جور دیگه بنویسید مثل کتابخانه هایی مثل Qt یا wx که به همین شکل هستند
همین کتابخانه استاندارد هم نحوه پیاده سازیش در ویندوز و لینوکس متفاوته

chikar
چهارشنبه 05 فروردین 1394, 17:51 عصر
.

اگه ما به جای استفاده از یک کاراکتر از کد اسکی اون استفاده کنیم

char char_str = 'K';


یعنی به این شکل بنویسیم


char char_str = 75;

کد گذاری فکر می کنم تو برخی سیتم ها متفاوت باشه، ولی جاهایی نیاز هست که مثلا از کد اسکی یک کاراکتر استفاده بشه، و اگر ما این مساله رو ندونیم ممکنه کل نتایجمون رو تحت تاثیر بگذاره
می خوام بدونم نرم افزاری، روشی چیزی هست که بشه این نکات ریز رو شناسایی کنه؟ یا همون مساله ای که اشاره کردید "برنامه ای که خودمون نوشتیم هم لازمه مطابق استاندارد نوشته بشه"، یعنی تشخیص بدیم آیا این استاندارد هست یا نه؟

rahnema1
چهارشنبه 05 فروردین 1394, 21:24 عصر
والا کدهای اسکی تا جای که می دونم در همه جا یکسانه

chikar
چهارشنبه 05 فروردین 1394, 23:08 عصر
والا کدهای اسکی تا جای که می دونم در همه جا یکسانه

بهتر بود اول منبع رو ذکر می کردم،
دایتل: برای استاندارد سازی عرضه کاراکترها، اکثر سازندگان کامپیوتر، بر اساس یکی از دو طرح کد گذاری EBCODIC یا ASCII کامپیوتر های خود را می سازند. البته طرح های کد گذاری دیگری هم وجود دارد اما این دو طرح از محبوبیت بیشتری برخوردار هستند.ص 299 این pdf (http://s5.picofile.com/file/8115423718/C_.pdf.html)
مثال فوق هم از کتاب دایتل /ویرایش پنجم/ جلد اول/ ترجمه قلزم/ ص 485، بخش اشاره گر و رشته های مبتنی بر اشاره گر نقل شده است.این یکی لینکش رو ندارم متاسفانه
لطفا این pdf (http://www.think400.dk/files/Whats_with_these_ASCII_EBCDIC_Unicode_CCSIDs.pdf) رو مطالعه بفرمایید (What's With These ASCII, EBCDIC, Unicode
CCSIDs)
...........................
فکر کنم یه کم از بحث دور شدیم

amirtork
پنج شنبه 06 فروردین 1394, 03:13 صبح
سلام،
با توجه به ارائه ی جدول کد های اسکی ثابت توسط سایت http://asciitable.com ، این کد ها باید ثابت باشند و در همه ی سیستم هایی که از کد های اسکی استفاده میکنند، یکسان هستند.
اگر میخواید به صورت cross-platform برنامه های سی پلاس پلاس رو بنویسید،
1- پیشنهاد من استفاده از یکی از کتابخانه های cross-platform مثل Qt هست.
2- استفاده از کتابخانه های استاندارد، و عدم نوشتن توابعی وابسته به نوع سیستم عامل، (مثل استفاده نکردن از توابع system در برنامه ها)
هرچند فکر نمیکنم درست سوال شما رو فهمیده باشم، به خاطر همین فکر نمیکنم تونسته باشم کمکی کنم. :( شرمنده.

rahnema1
پنج شنبه 06 فروردین 1394, 06:56 صبح
بهتر بود اول منبع رو ذکر می کردم،
دایتل: برای استاندارد سازی عرضه کاراکترها، اکثر سازندگان کامپیوتر، بر اساس یکی از دو طرح کد گذاری EBCODIC یا ASCII کامپیوتر های خود را می سازند. البته طرح های کد گذاری دیگری هم وجود دارد اما این دو طرح از محبوبیت بیشتری برخوردار هستند.ص 299 این pdf (http://s5.picofile.com/file/8115423718/C_.pdf.html)
مثال فوق هم از کتاب دایتل /ویرایش پنجم/ جلد اول/ ترجمه قلزم/ ص 485، بخش اشاره گر و رشته های مبتنی بر اشاره گر نقل شده است.این یکی لینکش رو ندارم متاسفانه
لطفا این pdf (http://www.think400.dk/files/Whats_with_these_ASCII_EBCDIC_Unicode_CCSIDs.pdf) رو مطالعه بفرمایید (What's With These ASCII, EBCDIC, Unicode
CCSIDs)
...........................
فکر کنم یه کم از بحث دور شدیم

درسته. توی استاندارد هم نگاه کردم که در اونجا ذکر نشده که دقیقا مقدار عددی یک کاراکتر چی میتونه باشه و واگذار کرده به پیاده سازی .
با این حساب این جور نوشتن مثلا char a =23 در واقع cross platform نیست
حالا اگه مثلا بخوایم کد اسکی یه حرف را در بیاریم باید یه جدول تهیه کنیم تا معادل EBCDIC را برای اسکی پیدا کنیم یا ممکنه تابع آماده هم باشه
ولی معمولا به کد عددی نیازی نیست و با همون کاراکتر ها مثل 'a' میشه کارها راه انداخت
همچنین تقریبا در انتهای کتاب استاندارد ++c مواردی که implementation-defined هست را ذکر کرده که کسی بخواد cross platform بنویسه لازمه از اینها اطلاع داشته باشه
ممنون بابت نکته ای که اشاره کردید

chikar
پنج شنبه 06 فروردین 1394, 13:31 عصر
هرچند فکر نمیکنم درست سوال شما رو فهمیده باشم، به خاطر همین فکر نمیکنم تونسته باشم کمکی کنم. :( شرمنده.
همین که خواستید کمک کنید برای من قابل تحسین است

chikar
پنج شنبه 06 فروردین 1394, 13:37 عصر
درسته. توی استاندارد هم نگاه کردم که در اونجا ذکر نشده که دقیقا مقدار عددی یک کاراکتر چی میتونه باشه و واگذار کرده به پیاده سازی .


بله همین طور است که اشاره کردید، با این اوصاف فکر می کنم تنها برنامه نویسی استاندارد کافی نباشه و تنها راهش این هست که تجربیات رو افزایش داد تا این نکات ظریف رو شناسایی کرد، نکات ریز این چنینی که روی قابلیت حمل برنامه تاثیر می گذاره در کتاب دایتل متعدد ذکر شده ولی بعید می دونه کامل باشه
مرسی از پاسخ های خوبتون

negative60
پنج شنبه 06 فروردین 1394, 15:38 عصر
اگه ما به جای استفاده از یک کاراکتر از کد اسکی اون استفاده کنیم
char char_str = 'K';


یعنی به این شکل بنویسیم

char char_str = 75;

کد گذاری فکر می کنم تو برخی سیتم ها متفاوت باشه، ولی جاهایی نیاز هست که مثلا از کد اسکی یک کاراکتر استفاده بشه، و اگر ما این مساله رو ندونیم ممکنه کل نتایجمون رو تحت تاثیر بگذاره
می خوام بدونم نرم افزاری، روشی چیزی هست که بشه این نکات ریز رو شناسایی کنه؟ یا همون مساله ای که اشاره کردید "برنامه ای که خودمون نوشتیم هم لازمه مطابق استاندارد نوشته بشه"، یعنی تشخیص بدیم آیا این استاندارد هست یا نه؟

تو سيستم عامل های windows و خانوده unix کد اسکی کاراکترهای لاتين و شماره ها و علائم ثابت هستند (http://www.cplusplus.com/doc/ascii/)

اگر ميخواهيد برنامه که ميسازيد کراس پلتفرم باشه بايد طبق يکی از استاندارد های ++c و کاملاً اصولی کار کنيد و جاهايی که ميخواهيد از توابع سيستم عامل استفاده کنيد ميبايست درون کدتون سيستم عامل رو شناسايی کنيد و از معادل همون توابع در سيستم های مخلتف استفاده کنيد.


مثلاً:

#ifdef _WIN32
//Win32
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DoWork, NULL, 0, NULL);
#else
//unixbase
pthread_t thr1;
int ret = pthread_create(&thr1, NULL, DoWork, NULL);
pthread_join( thr1, NULL );
#endif


در اين صورت برنامه من بدون تغيير ميتونه از ترد در اندرويد و IOS و مک و توزيع های مختلف لينوکس استفاده کنه

rahnema1
پنج شنبه 06 فروردین 1394, 17:06 عصر
بله همین طور است که اشاره کردید، با این اوصاف فکر می کنم تنها برنامه نویسی استاندارد کافی نباشه و تنها راهش این هست که تجربیات رو افزایش داد تا این نکات ظریف رو شناسایی کرد، نکات ریز این چنینی که روی قابلیت حمل برنامه تاثیر می گذاره در کتاب دایتل متعدد ذکر شده ولی بعید می دونه کامل باشه
مرسی از پاسخ های خوبتون

کاملش همون طور که گفتم در کتاب استاندارد (http://www.open-std.org/jtc1/sc22/open/n3242/n3242.pdf) ذکر شده