جستجو در تالارهای گفتگو
در حال نمایش نتایج برای برچسب های 'library'.
8 نتیجه پیدا شد
-
سلام. اگر بخوایم برای ضرب دو عدد با طول بی نهایت در یک ماشین حساب که در محیط QT ساخته شده است به شرطی که نتیجه ضرب را نشان دهد و overflow رخ ندهد، از چه کتاب خانه ای می توان استفاده کرد؟
-
کتابخانهٔ SIGIL مخفف Sound, Input, and Graphics Integration Library که یک کتابخانهٔ یکپارچه برای صدا ، ورودی ، و گرافیک است که یک کتابخانهٔ سبک و ساده است برای کارهایی ماننده ساخت بازی 2 بعدی و یا در مقابل پخش صدا که شاید جایگزین خوبی در مقابل با کتابخانههای پیچده باشد که روند کار در آن کتابخانهها به مراتب سختتر است ، SIGIL برای کارهای گرافیکی و رسانه ( فقط پخش صدا ) کاربرد دارد و یک کتابخانهٔ فرعی است ، توابعی سادهتر و قابل درک دارد که به راحتی میتوانید کارهای گرافیکی و یا رسانهای خود را با این توابع انجام دهید . این کتابخانه کراس پلتفرم است و مستقل از سیستم عامل است ، یعنی اینکه میتوانید این کتابخانه را در هر سیستم عاملی با هر IDE و متناسب با کامپایلرها و رایانههایی که به آنها رزیبری پای میگویند که در ادامه به معرفی و پشتیبانی از این کتابخانه هستند میپردازم ، استفاده کنید . نکته نرم افزارها و یا سیستمیهایی که نیاز حتمی به بعضی از کتابخانهها دارند و در واقع وابسته به کتابخانه برای اجرا هستند ، کتابخانهٔ اصلی و در غیر اینصورت اگر بدون کتابخانهای هم قابل اجرا باشند ، کتابخانهٔ فرعی گفته میشود . لیست کامپایلرها که از این کتابخانه پشتیبانی میکنند به شرح زیر است : MinGw32 مخفف Minimalist GNU for Windows که به صورت Native هستند ، یعنی وقتی کدی را ترجمه کردند و آن را به باینری تبدیل کردند ، برنامه فقط در همان سیستم عامل قابل اجراست و در سیستم عاملهای دیگر باید از کامپایلرهای دیگر استفاده کرد . MSVC مخفف ++Microsoft Visual C یک IDE برای زبانهای برنامه نویسی C و++ C است ، این ابزار برای نوشتن و اشکالزدایی کدهای C , ++C و# C میباشد و تاکنون نسخههای مختلفی از آن انتشار داده شده است . فرقی هم نمیکند پردازنده در این مورد 32 بیت باشد یا 64 بیت . دقت کنید عزیزان که منظور از 64 بیتی و 32 بیتی بودن این است که در نسخههایی از ویژال استودیو که خود مرجع این کتابخانه معرفی کرده است به این نکته هم اشاره کرده که کتابخانهٔ شما در این نسخههای ویژال استودیو فرقی نمیکند که 32 بیتی و یا 64 بیتی کامپایل شود اما در نسخههای جدید حتما باید 64 بیتی کامپایل شود در غیر اینصورت با خطا مواجه میشوید . Linux GCC که مخفف GNU Compiler Collection است ، مجموعهای از کامپایلرهای هستند برای زبانهای برنامه نویسی مختلف که توسط پروژه گِنو به وجود آمدند . رایانهٔ Raspberry Pi Raspberry Pi که یک قطعهٔ کوچک از یک رایانهٔ تک برد است که توسط بنیاد رزیبری پای ساخته شده است تا آموزش علوم رایانه را در مدارس و در کشورهای در حال توسعه گسترش دهد .باید توجه کنید که این یک رایانه است ، کتابخانهٔ SIGIL میتواند در این رایانه هم استفاد شود و کامپایلر نیست . پس متناسب با کامپایلر خود و یا حتی اگر رایانه مبتنی بر Raspberry Pi دارید ، میتوایند از این کتابخانه استفاده کنید . برای دانلود این کتابخانه ابتدا به این صحفه وارد شوید و در پایان قطعه کدی که مشاهده میکنید با توجه به سیستمعامل و کامپایلر IDE خودتان نسخهٔ موجود را دانلود کنید. همچنین اگر مشتاق توسعه این کتابخانه باشید ، سورس کد آن در سرویس گیتلب موجود میباشد و میتواند در توسعه آن همکاری کنید . در پایان پس از دانلود کتابخانه ، روش اضافه کرد کتابخانه به ویژال استودیو که اکثرا از این IDE استفاده میکنند شرح میدهیم که مرجع این کتابخانه یک IDE دیگر را هم ذکر کرده است و اگر شما عزیزان در IDE دیگری مشغول کدنویسی هستید میتوانید بعد از پایان این جلسه از آموزش در قسمت نظرات IDE خود را معرفی کنید تا روش اضافه کردن این کتابخانه را معرفی کنیم . اضافه کردن کتابخانه به ویژال استودیو بعد از اینکه کتابخانه را دانلود کردید ، به ترتیب تصاویر زیر کتابخانه را به ویژال استودیو اضافه کنید : در قسمت جستجو و با توجه به پارامترهایی که این IDE در اختیار شما گذاشته است میتوانید سریعتر نوع پروژهای که قصد ساختن آن را دارید مشخص کنید و از اتلاف وقت برای جستجو در بین نوعهای مختلف پروژه برای پیدا کردن نوع پروژه خود جلوگیری کنید ، در مرحله بعد به شکل زیر عمل کنید : برا برایی دسترسی داشتن به سولوشن از نوار منوی بالا روی view کلیک کنید و Solution Explorer را انتخاب کنید ، میبینید که پروژهای که ساختید در سمت راست در قالب یک پنجره نمایان میشود در اینجا بر روی پوشهٔ Source کلیک راست کرده و گزینه Add را انتخاب کنید و درنهایت در زیر منویی که برای شما باز میشود گزینهٔ New Item را انتخاب کنید یک پنجره برای شما باز میشود که باید C++ File را انتخاب و در زیر پنجره یک کادر متن دیده میشود که باید در آن نام فایل سورسکد خود را انتخاب کنید ، دقت داشته باشید که پسوند Cpp را در انتهای نام فایل فراموش نکنید ، طبق تصویر بالا باید یک فایل جدید به پوشهٔ Source شما اضافه شده باشد ، روی فایل دابل کلیک کرده تا محتویات این فایل در پنجرهای که مشاهده میکنید ، نمایش داده شود که در حاضر فایل ما خالی است . در قدم بعدی باید کتابخانه را اضافه کنیم ، پس مطابق تصویر پایین عمل کنید : در اینجا باید حال را روی اجرا بر روی 64 بیتی و همچنین روی حالت دیباگ برای اشکال زدایی در طی برنامهٔ نوشته شده قرار دهید ، البته اگر به مرجع خود این کتابخانه بروید ، میبینید که از نسخه های قبلتر چه 32 بیت و چه 64 بیت میتوانید استفاده کنید! اما در اینجا نسخهٔ ویژال استودیو بنده 2019 هستش و در این نسخه باید حالت بر روی 64 بیت باشد ، در غیر اینصورت برای اجرای کتابخانه دچار خطا و مشکل میشوید ، پس این مورد را هم فراموش نکنید ، در قدم بعدی به شکل زیر عمل میکنیم : در اینجا از از نوار منوی بالا رو Project کلیک کرده و در زیر منویی که باز میشود ، آخرین گزینه یعنی Properties را انتخاب کنید و در پنجرهای که برای شما باز میشود طبق شکل روی یک مثلث کوچک که در کنار هر کدام ویژگیهای مربوطه قرار گرفته کلیک کنید و قدم بعدی که تصویر زیر باشد را انجام دهید : بخشی را در سمت راست مشاهده میکنید ، همانطور که در تصویر بالا هم آمده است ، بر روی Additional Include Directories کلیک کنید و یک متن با عنوان Edit برای شما نمایش داده میشود که روی آن کلیک کرده تا مطابق تصویر یک پنجره برای شما باز شود ، بر روی پوشهای که در تصویر مشاهده میکنید کلیک کرده تا کادر به همراه یک دکمه در سمت راست کادر برای شما نمایش داده شود ، روی دکمه کلیک کرده و مطابق شکل زیر پیش بروید : در اینحا تنها کاری که لازم است انجام دهید به این صورت است که پوشهٔ include را اانتخاب و روی Select Folder کلیک کنید تا به پروژه اضافه شود ، دقت کنید که اگر پروژه را که قصد ساختن آن را با این کتابخانه دارید میخواهید برای کسی بفرستید یا به اشتراک بگذارید باید این دو پوشه و فایلهای dll که حاصل از استخراج کتابخانه است که دانلود کردید ، باید تمام فایلها و پوشهها را در پوشهٔ پروژه کپی کنید ، پس به این نکته هم دقت داشته باشید . در قدم بعدی طبق تصویر زیر پیش بروید : وقتی که پوشهٔ مورد نظر را انتخاب کردید ، باید در قدم نهایی بر روی Ok طبق تصویر بالا کلیک کنید و به مرحلهٔ بعد که در تصویر زیر است بروید : در اینجا و در قدم نهایی برای اضافه کردن کتابخانه ما به سراغ سربرگ Linker میرویم و گزینه Input را انتخاب میکنیم ، همانطور که مشاهده میکنید در سمت راست باید وابستگیها را اضافه کنیم ، پس بر روی Additional Dependencies کلیک کنید و گزینهای با عنوان Edit برای شما نمایان میشود که روی آن کلیک کنید تا پنجرهای در تصویر زیر برای شما نمایش داده شود : در کادری که مشخص شده است باید فایلی با پسوند lib را که پروژه برای استفاده از کتابخانه به آن وابسته است و حتما باید اضافه شود را وارد کنید که نام این فایل sigil.lib در پوشهٔ lib است و اگر تمام فایلها و پوشهها را داخل پوشهٔ پروژه کپی کنیم باید به این شکل این فایب را اضافه کنیم ، در غیر اینصورت باید آدرس کامل به همراه نام فایل مشخص شده را وارد کنید . بعد از اضافه کردن فایل ذکر شده روی Ok کلیک کنید و در قدم بعدی مطابق تصویر زیر عمل کنید : در تصویر بالا ابتدا بر روی Apply کلیک کنید و سپس روی Ok کلیک کنید تا کتابخانه اضافه شود ، دقت داشته باشید اگر فراموش کرده باشید که حالت را روی 64 بیت را دراین نسحه روی نگذارید ، باید تمام مراحل را از اول انجام دهید . و در نهایت کد زیر را برای آزمایش صحیح اضافه کردن کتابخانه بنویسید و اجرا کنید : #include "sl.h" #include <Windows.h> int main() { ShowWindow(GetConsoleWindow(), false); slWindow(600, 500, "Welcome to Sigil", false); while (!slShouldClose() && !slGetKey(SL_KEY_ESCAPE)) { slRender(); } slClose(); return 0; } نتیجهٔ اجرای کد بالا ایجاد و نمایش یک پنجره با ابعاد مشخص است که میتوانید در تصویر زیر مشاهده کنید : خب عزیزان به پایان این جلسه از آموزش رسیدیم ، در جلسات بعد به معرفی توابع و کاربرد هر کدام میپردازیم و در آخر و پایان آموزشها یک پروژه عملی ساخت یک بازی دو بعدی را پیش میبریم . موفق و سربلند باشید .
- 1 پاسخ
-
- library
- cross-platform
-
(و 3 مورد دیگر)
برچسب زده شده با :
-
چندی پیش یکی از دوستان درمورد کتابخانهٔ zlib از من سوأل پرسیده بود که جالب شد برایم تا نگاهی بکنم. zlib یک کتابخانهٔ فشردهسازی بر اساس الگوریتم DEFLATE هست که خود این الگوریتم تلفیقی از LZ77 و الگوریتم Huffman هست و عمل فشردهسازیدرحافظه را انجام میدهد، اطلاعات بیشتر درمورد اینا خواستید از اینجا استفاده کنید. این کتابخانه یک قسمت مهم از پلتفرمهای معروفی همچون GNU/Linux , iOS و.. هست. تستی که با این کتابخانه انجام دادم واقعاً برایم جالب بود، یک فایل متنی ۶۰۰ مگابایتی را به ۱۲۱ مگابایت رسوند در مدّت زمان خیلی کوتاهی با یک پردازندهٔ Intel(R) Core(TM) i7 CPU M 620. خب بریم یک تست بکنیم. اوّل سورس برنامه را از این قسمت بارگیری کنید : https://www.zlib.net/ توضیحات مفصل را میخواید میتوانید از اینقسمت استفاده کنید. امّا من از یکمثال استفاده میکنم، بعد از اینکه سورسکد را دانلود کردید کافیه که از حالت فشرده خارجش کنید و وارد دایرکتوری مربوطهاش بشید. برای کامپایل شما نیاز به : GCC GNU Make دارید، اگر نمیدانید GNU Make چی هست، میتوانید در اینقسمت با GNU Make آشنا بشید. خب اگر ابتدا برنامهٔ make را داخل دایرکتوری فراخوانی کنید پیغام زیر را نمایش میدهد : Please use ./configure first. Thank you. که مؤدبانه خواهش میکند اوّل اسکریپت configure را اجرا کنیم، بعد از اجرای این اسکریپت چکهای لازم انجام میشود و بعد میتوانید make را اجرا کنید تا کتابخانههای مورد نظر ساخته بشود. بعد اتمام کار، ما فقط نیاز به Shared lib ها و Header File مربوطه داریم. (درصورتیکه نمیدانید Shared Lib چیست، میتوانید در اینقسمت با نحوهٔکار/ساخت آن آشنا شوید). پس بهتر است یک دایرکتوری به اسم lib در ساختار دایرکتوری پروژهٔ خودمان درست کنیم و به اینصورت عمل کنیم : zlib-1.2.11$> mkdir ../zlibTEST/lib zlib-1.2.11$> mv libz*so* ../zlibTEST/lib renamed 'libz.so' -> '../zlibTEST/lib/libz.so' renamed 'libz.so.1' -> '../zlibTEST/lib/libz.so.1' renamed 'libz.so.1.2.11' -> '../zlibTEST/lib/libz.so.1.2.11' zlib-1.2.11$> mv zlib.h ../zlibTEST/header renamed 'zlib.h' -> '../zlibTEST/header/zlib.h' در این قسمت، اوّل ما خارجاز دایرکتوری zlib داخل یک دایرکتوری دیگر که پروژهٔ ما درآن قرار دارد یک دایرکتوری به اسم lib ساختیم که shared lib و header file مربوطه را درآن قرار دهیم. سپس تمام فایلهایی که به اسم 'libz*so*' هستند را به آن دایرکتوری انتقال دادیم؛ سه فایل قرار دارد که دو تا از آنها به libz.so.1.2.11 لینک شدهاند. خب بریم سروقت تست خودمان. اوّل از همه نیاز به هدرفایلهای مربوطه داریم : #include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h" کتابخانهٔ zlib از ثابت CHUNK برای مقداردهی Buffer خودش استفاده میکنه، و ما نیاز داریم که این ثابت را تعریف کنیم : #define CHUNK 251904 هرچی مقدار بیشتر باشه سیستم کارآمد تر هست، داخل خود اسناد گفته که بهتره از 256k استفاده کنیم درصورتیکه مقدار حافظهٔ موردنیاز رو داریم. حالا باید تابع Compressing خودمان را با استفاده از کتابخانهٔ zlib پیاده کنیم. ما اسم این تابع را compressing میزاریم، این تابع دو stream دریافت میکند که یکی ورودی و یکی خروجی میباشد. یک ورودی دیگر تابع سطح فشردهسازی هست که در ادامه بحث میکنیم : int compressing (FILE *source, FILE *dest, int level); خروجیه تابع میتواند این موارد باشد : - Z_OK = 0 - Z_STREAM_END = 1 - Z_NEED_DICT = 2 - Z_ERRNO = -1 - Z_STREAM_ERROR = -2 - Z_DATA_ERROR = -3 - Z_MEM_ERROR = -4 - Z_BUF_ERROR = -5 - Z_VERSION_ERROR = -6 از اسامی تقریباً مشخص هست که چه مفهومی دارند و نیازی به توضیح نیست. حال نیاز هست که یک سری متغیرهایمحلی که فقط مورد استفادهٔ خود تابع هست را داخل تابع تعریف کنیم : int return_; int flush; int have; z_stream stream; unsigned char input[CHUNK]; unsigned char output[CHUNK]; متغیر اوّل که از اسمش مشخص هست، برای مشخص کردن مقداربازگشتی از تابع هست، و متغیر دوّم برای مشخص کردن وضعیّت flushing برای یکی از توابع zlib هست. متغیر سوّم مقدار اطلاعاتی هست که از یکی از توابع zlib به اسم deflate() بر میگردد. متغیر چهارم هم از نوع یک ساختار داخلیه zlib میباشد : typedef struct z_stream_s { z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte will go here */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total number of bytes output so far */ z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text for deflate, or the decoding state for inflate */ uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; توضیحاتَش داده شده داخل خودzlib.h که این ساختار به چه شکلی هست و هر مقدار برای چه کاری هست. و دو متغیر بعدی بافرهای ورودی و خروجیما میباشد. کتابخانهٔ zlib از روش تخصیصحافظهٔ به خصوص خود استفاده میکند، از این رو باید ساختاری که ساختهایم را با استفاده از تابع deflateInit() مقداردهی کنیم، قبل از مقداردهی باید یکسری مقادیر را طبق گفتهٔ مستندات برابر Z_NULL قرار بدهیم : stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; return_ = deflateInit(&stream, *level); if (return_ != Z_OK) return return_; در اینجا مقدار level میتواند چیزی بین -1 تا 9 باشد، هرچه مقدار کمتر باشد سرعت فشردهسازی بالاتر است و مقدارفشردهسازی کمتر. مقدار صفر هیچ فشردهسازیای انجام نمیشود و صرفاً یک فایل با فرمت zlib درست میشود. ماکروی Z_DEFAULT_COMPRESSION برابر با -1 هست که سرعت و فشرهسازی خوبی را فراهم کند. در تست قبلی خودم مقدار را برابر Z_DEFAULT_COMPRESSION گذاشتم و اینبار میخواهم برابر ۹ بگذارم. خب حالا باید بریم سراغ فشردهسازی، در این قسمت ما یکdo-while مینویسیم که جریانورودی را تا EOF (انتهای فایل) بخواند : do{ stream.avail_in = fread(input, 1, CHUNK, source); if (ferror(source)){ deflateEnd(&stream); return Z_ERRNO; } flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; stream.next_in = input; * خب برای دوستانی که با توابع کار با Streamها در سی آشنا هستند، پیشنهاد میکنم که این قسمت رو یهکمی ازش گذر کنند. اوّل ما از تابع fread استفاده کردیم، این تابع به اینصورت در فایل stdio.h تعریف شده است : size_t fread( void *restrict buffer, size_t size, size_t count, FILE *restrict stream ); و کاری که میکند این است که اوّل یک اشارهگر به جایی که باید دادههای خوانده شده ذخیره بشوند میگیرید که اینجا ما آرایهٔ input را میدهیم، سپس اندازهٔ هر دادهای که قرار است خوانده بشود را دریافت میکند که یک بایت است هر کاراکتر، آرگومان بعدی مقداری است که باید از Stream خوانده شود که ما به اندازهٔ CHUNKتا میخواهیم :). آرگومان آخری نیز که مشخصهست. جریانی است که باید دادهها خوانده شود. این تابع مقدار دادههایی را که با موفقیت خواندهاست را برمیگرداند. که ما آن را در stream.avail_in نگهداری میکنیم. سپس باید Stream را چک کنیم که خطایی رخ نداده باشد. درصورتیکه این تابع مقداری غیراز صفر برگرداند مشخص است که خطایی رخ نداده. و درصورتیکه خطایی رخ دادهباشد با استفاده از delfateEnd() جریان را پایان میدهیم. و در انتها باید بررسی کنیم که آیا جریانما به EOF (پایان فایل) رسیدهاست یا خیر. که اینکار با استفاده از تابع feof() در هدرفایل stdio.h صورت میگیرد. درصورتیکه پایانفایل رسیده باشد مقداری غیر از صفر این تابع بر میگرداند. در انتها طبق گفتهٔ مستندات باید اشارهگری به دادههای خوانده شده در next_in قرار بگیرد. که ما اینکار را در خط آخر انجام دادهایم. خب در اینقسمت که ما دادهها را از جریان ورودی خواندیم نیاز هست که با استفاده از تابع deflate() عمل فشردهسازی را انجام دهیم. این تابع داخل یک حلقهٔ do-while دیگر فراخوانی میشود. و تا انتهای دادههای خوانده شده ادامه میدهیم : do{ stream.avail_out = CHUNK; stream.next_out = output; مقدار فضای outputما که برای deflate() تهیه شده است توسط avail_out به بایت مشخص میشود و next_out اشارهگری به آن جریان خروجی میباشد که در اینجا آرایهٔ output میباشد. خب حالا ما باید تابع فشردهسازی deflate() را فراخوانی کنیم. این تابع به اندازهٔ avail_in بایت از next_in پردازش میکند و به اندازهٔ avail_out بایت در next_out مینویسد. که اینجا مقادیر avail_out/in ما برابر با CHUNK میباشد و next_out/in ما به آرایههای input و output اشاره میکند. این حلقهٔ داخلیکه درست کردیم تضمین میکند که تمام دادههای خواندهشده پردازش و نوشته میشوند. ورودیهای تابع deflate() یک اشارهگر به ساختار z_stream میباشد (همان متغیر stream خودمان) و یک ورودی دیگر که مشخص میکند وضعیت و چگونگی flush کردن دادهها در output. تابع deflate() تا زمانیکه مقدار ورودی flush state برابر Z_NO_FLUSH باشد ادامه میدهد و وقتیکه مقدار flush state برابر Z_FINISH تابع deflate() کار را تمام میکند. این قسمت برای افرادی هست که میخواهند کارهای خاصی با این تابع انجام دهند که بدین منظور بهتر است مستندات فنی کتابخانه را مطالعه کنند. return_ = deflate(&stream, flush); assert(return_ != Z_STREAM_ERROR); در اینجا ما با استفاده از ماکروی assert که در هدرفایل assert.h تعریف شده است یک شرط میگذاریم که درصورتیکه آن شرط حاصلش برابر صفر باشد مقادیری را در stderr چاپ و با استفاده از abort() برنامه را خاتمه میدهد. خب حالا باید مشخص کنیم که تابع deflate() در آخرین فراخوانی چه مقدار خروجی تولید کردهاست و چه مقدار باقیمانده است. و مقادیر تولید شده را داخل جریان خروجی مینویسیم : have = CHUNK - stream.avail_out; if (fwrite(output, 1, have, dest) != have || ferror(dest)) { deflateEnd (&stream); return Z_ERRNO; } در اینجا ما با استفاده از تابع fwrite (که ورودیهای آن مشابه fread میباشند) مقدار تولید شده را داخل جریان خروجی مینویسیم. این تابع باید تعداد مقادیری که با موفقیت نوشته شدهاند را به بایت بر گرداند. پس بررسی میکنیم که اگر برابر با have نبود یا اینکه برای جریان dest خطایی رخ داده است. برنامه را خاتمه دهد. تابع deflate() تا جایی که بتواند به کارخود ادامه میدهد و زمانی که دیگر دادهای برای پردازش نداشتهباشد مقدار avail_out برابر صفر قرار میگیرد و مقدار Z_BUF_ERROR را بر میگرداند. و ما میتوانیم از حلقهٔ داخلی خارج شویم : } while (stream.avail_out == 0); assert(stream.avail_in == 0); خب ما با بررسی متغیر flsuh میتوانیم وضعیت پایان فایل را متوجه بشویم، درصورتیکه مقدار این متغیر برابر Z_FINISH باشد کار ما تمام شدهاست و میتوانیم از حلقه خارج شویم : } while (flush != Z_FINISH); assert(return_ == Z_STREAM_END); و در انتها کافی است که حافظهای که دریافت شده آزاد شود، و مقدار Z_OK از تابع برگرداننده شود : deflateEnd(&stream); return Z_OK; } خب تابع compress ما به اتمام رسید، حال باید بریم سروقت تابع decompress، این تابع شباهت بسیار زیادی به تابع قبلی دارد : int decompress (FILE *source, FILE *dest); و حالا متغیرهایمحلی را دوباره تعریف میکنم، اینجا دیگر نیازی به متغیر flush نیست چرا که خود توابع zlib پایان کار را مشخص میکنند : { int return_; unsigned have; z_stream stream; unsigned char input[CHUNK]; unsigned char output[CHUNK]; و حال نیاز هست که زمینهٔ تخصیص حافظه را فراهم کنیم : stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = 0; stream.next_in = Z_NULL; return_ = inflateInit(&stream); if (return_ != Z_OK) return return_; اینجا مقدار avail_in برابر صفر و مقدار next_in برابر Z_NULL قرار میگیرد تا مشخص شود که هیچ ورودی فراهم نشده است. حالا باید حلقهٔ معروف خودمان را درست کنیم و با استفاده از تابع inflate() اقدام به Decompressing کنیم : do { stream.avail_in = fread(input, 1, CHUNK, source); if (ferror(source)){ inflateEnd(&stream); return Z_ERRNO; } if (stream.avail_in == 0) break; stream.next_in = input; خب با توجه به توضیحات تابع قبلی این دستورات نیز عملکردشان مشخص است. حال باید حلقهٔداخلی را بنویسیم : do { stream.avail_out = CHUNK; stream.next_out = output; حال باید تابع inflate() را برای عمل Decompressing فراخوانی کنیم، دیگر اینجا نیازی به مشخص کردن flush state نداریم چرا که خود zlib به طور خودکار مدیریت میکند. تنها چیزی که مهم است، خروجی تابع inflate() میباشد که درصورتیکه برابر Z_DATA_ERROR باشد به معنی ایناست که در دادههای فشردهشده مشکلی وجود دارد. و خروجی دیگر Z_MEM_ERROR میباشد که مشخصکنندهٔ مشکلی در زمان حافظهگیری برای inflate() میباشد : return_ = inflate(&stream, Z_NO_FLUSH); assert(return_ != Z_STREAM_ERROR); switch (return_){ case Z_NEED_DICT: return_ = Z_DATA_ERROR; case Z_DATA_ERROR: case Z_MEM_ERROR: inflateEnd(&stream); return return_; } در اینجا خروجی تابع را بررسی کرده و درصورتیکه خطایی باشد جریان برنامه را خاتمه میدهیم. و انتهای حلقه : have = CHUNK - stream.avail_out; if (fwrite(output, 1, have, dest) != have || ferror(dest)) { inflateEnd(&stream); return Z_ERRNO; } } while (stream.avail_out == 0); و زمانیکه خروجیه inflate() برابر Z_STREAM_END باشد، یعنی اینکه دیگر کار تمام شده و دادهای برای پردازش نمیباشد : } while (return_ != Z_STREAM_END); تا این قسمت دیگر کار استخراج به پایان رسیده است . و کار تابع decompress را تمام میکنیم : inflateEnd(&stream); return (return_ == Z_STREAM_END) ? Z_OK : Z_DATA_ERROR; } خب تمام شد !. ما دوتابع compress و decompress که مستقیم از zlib استفاده میکنند را به پایان رساندیم. حال بیاید از آنها استفاده کنیم. در وهلهٔ اوّل نیاز است که تابعی داشتهباشیم تا خروجی این توابع را برای ما مدیریت کنند : void zlibError(int return_) { fprintf(stderr, "ZLIB ERROR: "); switch (return_) { case Z_ERRNO: if (ferror(stdin)) fprintf(stderr, "ERROR READING stdin.\n"); if (ferror(stdout)) fprintf(stderr, "ERROR WRITING stdout.\n"); break; case Z_STREAM_ERROR: fprintf(stderr, "INVALID COMPRESSION LEVEL.\n"); break; case Z_DATA_ERROR: fprintf(stderr, "INVALID OR INCOMPLETE deflate() DATA.\n"); break; case Z_MEM_ERROR: fprintf(stderr, "OUT OF MEMORY.\n"); break; case Z_VERSION_ERROR: fprintf(stderr, "zlib VERSION MISMATCH.\n"); } } و حال تابع main برنامهٔ ما : int main(int argc, char **argv) { int return_; if (argc == 1) { return_ = compress(stdin, stdout, 9); if (return_ != Z_OK) zlibError(return_); return return_; } else if (argc == 2 && strcmp(argv[1], "-d") == 0) { return_ = decompress(stdin, stdout); if (return_ != Z_OK) zlibError(return_); return return_; } else { fprintf(stderr, "zlib Usage: PROGRAMM [-d] < SOURCE > DEST\n"); return EXIT_FAILURE; } return EXIT_FAILURE; } و برای کامپایل باید موقعیت کتابخانهٔ zlib را مشخص کنیم : $> gcc main.c -L. -lz -O3 -o zlib خب حالا بیاید با هم این برنامه را اجرا کنیم :). قبل از اجرا نیاز است که ما یک فایل حجیم داشتهباشیم، برای اینکار کافیه که به اینصورت یکی درست کنیم : $> yes "iostram.ir" > huge.file بهتر از بعد از چند ثانیه با استفاده از Ctrl + C برنامه را خاتمه دهید، برای من بعد از ۱۱ ثانیه برنامهٔ yes فایلی به اندازهٔ ۶۲۹ مگابایت، محتوی iostream.ir درست کرد. حالا بریم برای فشردهسازی : $> time ./zlib < huge.file > huge.file.comp real 0m13.560s user 0m5.785s sys 0m0.375s من این برنامه با استفاده از برنامهٔ time اجرا کردم تا زمان مصرفی را مشاهده کنم، که بعد از ۱۳ ثانیه به اتمام رسید. حال بیاید بیبنیم حجم خروجی چقدر است ! $> ls -ltrh total 631M -rw-r--r-- 1 ghasem ghasem 94K Jan 15 2017 zlib.h -rwxr-xr-x 1 ghasem ghasem 119K May 10 10:59 libz.so.1.2.11 lrwxrwxrwx 1 ghasem ghasem 14 May 10 10:59 libz.so.1 -> libz.so.1.2.11 lrwxrwxrwx 1 ghasem ghasem 14 May 10 10:59 libz.so -> libz.so.1.2.11 -rw-r--r-- 1 ghasem ghasem 3.5K May 10 14:39 main.c -rwxr-xr-x 1 ghasem ghasem 18K May 10 14:40 output -rwxr-xr-x 1 ghasem ghasem 18K May 10 14:46 zlib -rw-r--r-- 1 ghasem ghasem 629M May 10 14:46 huge.file -rw-r--r-- 1 ghasem ghasem 1.3M May 10 14:47 huge.file.comp واقعاً عالی بود. حجم فایل خروجی برابر با 1.3 مگابایت است. یعنی یک مگابایت و ۳۰۰ کیوبایت. حال بیاید از حالت فشرده خارج کنیم فایل را : $> time ./zlib -d < huge.file.comp > huge.file.dcomp real 0m12.556s user 0m0.818s sys 0m0.472s بعد از تنها ۱۳ ثانیه یک فایل ۶۲۹ مگابایتی برایمان درست کرد. که عیناً برابر فایل اوّلی میباشد. باور نمیکنید ؟ خب بیاید sha1sum آنها برررسی کنیم : $> sha1sum huge.file 3c02d5bd13b91f0e663d63d11ee33a2e71126615 huge.file $> sha1sum huge.file > huge.file.sha1 $> sha1sum huge.file.dcomp > huge.file.dcomp.sha1 $> cat huge*.sha1 3c02d5bd13b91f0e663d63d11ee33a2e71126615 huge.file.dcomp 3c02d5bd13b91f0e663d63d11ee33a2e71126615 huge.file سورس کامل برنامه را از اینقسمت میتوانید بارگیری کنید. - موفقوپیروز باشید ?
- 4 دیدگاه
-
- compressing
- decompressing
-
(و 1 مورد دیگر)
برچسب زده شده با :
-
نگارش 1.69.0
58 دریافت
کتابخانه Boost منبعی از کتابخانههای قابل حمل و آزاد ++C را فراهم میکند که از اصطلاح Peer-Reviewed پشتیبانی میکند. ما بر این تاکید میکنیم، Boost کتابخانه ای است که به خوبی با کتابخانه ی استاندارد ++C کار میکند. بوست مجموعه ای از کتابخانههای برنامه نویسی برای زبان برنامه نویسی سی پلاس پلاس است که پشتیبانی از کارهایی مانند جبر خطی، ساخت اعداد شبه تصادفی, ریسهبندی, پردازش تصویر, عبارت باقاعده و آزمایش واحد را ارائه میدهد. بیشتر این کتابخانه ها تحت پروانه نرم افزار بوست منتشر میشوند که به بوست اجازه میدهد هم در یک نرم افزار آزاد و هم در یک نرم آفزار انحصاری استفاده شود. بسیاری از پدید آورندگان بوست عضو کمیته استانداردسازی سی++ هستند و چند کتابخانه بوست برای الحاق به استانداردهای TR1 و C++11 پذیرفته شده اند.رایگان
-
در جلسه قبل کتابخانه را دانلود و نصب کردیم و برای تست کدی را اجرا کردیم که حاصل ان نمایش یک تصویر در یک پنجره بود اما درباره ی کلاس Matو همچنین توابع imread،imshow،waitKey توضیحی ندادیم کلاس Mat یک ماتریس است که تا هر چند بعد را در خود ذخیره میکند تابع imread برای بارگذاری تصویر است که تصویر را خوانده و در قالب یک ماتریس برمیگرداند که اینجا تصویر دو بعد دارد RowوColumn وقتی تصویر بارگذاری شد باید در یک ماتریس ذخیره شود پس به یک ماتریس نیاز داریم که همونطور که دیدید تعریف کردیم تابع imshow برای نمایش تصویر است ورودی اول این تابع نام پنجره است و ورودی دوم یک InputArray است که یک ورودی از ارایه از ما میخواهد در اینجا ما از هر کلاس کانتینری یا حتی ارایه معمولی هم بدهیم قبول میکند چون از ما یک ورودی ارایه میخواهد فرقی نمی کند که این ورودی چگونه و از چه نوعی باشد اما چون این یک تصویر را نمایش میدهد باید ورودی بدهیم که حاوی داده های تصویر باشد نه چیز دیگری پس به این موضوع هم دقت کنید تابع waitKey منتظر می ماند تا بعد از نمایش تصویر و فشردن کلیدی از صحفه کلید به برنامه پایان دهد. در این جلسه به کلاس Image Filtering توابع کاربری ان میپردازیم ابتدا چند تابع این کلاس را توضیح خواهم داد و سپس از هر کدام یک مثال خواهم زد. چند تابع که این کلاس دارد عبارتند از:bilateralFilter،blur،boxFilterLaplacian،medianBlur این چند تابع هر کدام فیلتری رو تصویر اعمال میکنند در هنگام دادن ورودی به توابع به ان چیزی که میخواهد توجه کنید و مقادیر صحیح را به ورودی توابع بدهید که به خطا مواجه نشوید در غیر اینصورت به مشکل برمیخورید. تابع bilateralFilter: یک محدوده ی مشخص شده توسط پارامتر سوم را با اندازه های داده شده در پارامتر های چهارم و پنجم را که مشخص کنند رنگ و فاصله هستند ترکیب میکند پارامتر سوم مشخص میکند در چه محدودهای از پیکسل های تصویر شروع به ترکیب رنگ در فاصله ی داده شده در پارامتر پنجم کند این محدوده اگر کوچکتر از پارامتر های چهارم و پنجم باشد بخشی از پیکسلها را در برمیگیرد اگر در پارامتر های چهارم و پنجم اندازه ی بیش از حد بدهیم و اندازه ی پارامتر سوم بیش از حد کوچک باشد تصویر به حالت کدر در می اید در غیر اینصورت اگر پارامتر ها بدرستی تنظیم شده باشند یک ترکیب رنگ زیبا در تصویر را خواهیم داشت این ترکیب رنگ در خود تصویر است به مثال زیر دقت کنید: #include <opencv2\opencv.hpp> #include <Windows.h> using namespace cv; int main() { Mat output_image; Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\beautiful-sunset-sunrise-photo-5.jpg", IMREAD_COLOR); bilateralFilter(image_read, output_image, 100, 300, 500); imshow("befor", image_read);//befor Filtering imshow("after", output_image);//after Filtering ShowWindow(GetConsoleWindow(), SW_HIDE); waitKey(0); } حاصل اجرای کد بالا به صورت زیر خواهد بود: تابع blur: با دریافت عرض و ارتفاع و موقعیت xوy در تصویر حالت تاری را به وجود می اورد باید دقت کنید موقعیت باید به همان اندازه مشخص شود که در عرض و ارتفاع مشخص میشود بیشتر از عرض و ارتفاع باشد برنامه متوقف خواهد شد چون نباید بزرگتر از عرض و ارتفاع باشد هر چه موقعیت بیشتر باشد تاری در ان موقعیت بیشتر میشود به مثال زیر دقت کنید: #include <opencv2\opencv.hpp> #include <Windows.h> using namespace cv; int main() { Mat output_image; Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\beautiful-sunset-sunrise-photo-5.jpg", IMREAD_COLOR); //bilateralFilter(image_read, output_image, 100, 300, 500); blur(image_read, output_image, Size(100, 100),Point(99,99)); imshow("befor", image_read);//befor Filtering imshow("after", output_image);//after Filtering ShowWindow(GetConsoleWindow(), SW_HIDE); waitKey(0); } حاصل اجرای کد بالا به صورت زیر خواهد بود: برای بهتر متوجه شدن این تابع چند بار موقعیت xوy را تغییر دهید و نتیجه را ببینید. تابع boxFilter: با مشخص کردن عمق برای تصویر و عرض و ارتفاع و موقعیت xوy ان منطقه از تصویر را با توجه به مقداری که برای عمق تصویر داده میشود تغییرمیدهد در بعضی موارد که به عنوان مثال عمق تصویر 0 باشد تصویر در همان حالت خود باقی میماند و درواقع کار تابع blur را انجام میدهد در پارامتر اخر میتوانید حالت border ان را تایین کنید که میتواند توسط خود نوع های شمارشی مورد استفاده قرار گیرد که جایی که فیلتر شده است خط مرزی ان رسم شود به مثال زیر دقت کنید: #include <opencv2\opencv.hpp> #include <Windows.h> using namespace cv; int main() { Mat output_image; Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\0.047489001316013508_pixnaz_ir.jpg", IMREAD_COLOR); //bilateralFilter(image_read, output_image, 100, 300, 500); boxFilter(image_read, output_image, 5, Size(1, 1)); imshow("befor", image_read);//befor Filtering imshow("after", output_image);//after Filtering ShowWindow(GetConsoleWindow(), SW_HIDE); waitKey(0); } حاصل اجرای کد بالا به صورت زیر خواهد بود: تابع Laplacian: با دریافت عمق سایز پیکسل مقیاس برای روشنایی و مقدار دلتا تصویر را به حالت های مختلف درمی اورد دقت داشته باشید برای دریافت نتیجه مطلوب باید مقیاس و دلتا هر دو مقداری داشته باشند نداشتن مقدار برای هر کدام تصویر را روشن و تیره میکند به مثال زیر دقت کنید: #include <opencv2\opencv.hpp> #include <Windows.h> using namespace cv; int main() { Mat output_image; Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR); //bilateralFilter(image_read, output_image, 100, 300, 500); //boxFilter(image_read, output_image, 5, Size(1, 1)); Laplacian(image_read, output_image, 0,1,10.0,100.0); imshow("befor", image_read);//befor Filtering imshow("after", output_image);//after Filtering ShowWindow(GetConsoleWindow(), SW_HIDE); waitKey(0); } حاصل اجرای کد بالا به صورت زیر خواهد بود: با تعغیر دادن مقیاس و دلتا نتایج دیگری بدست می اید همچنین عمق و سایز پیکسل با تعغیر رو تصویر تاثیر میگذارند. تابع medianBlur: با دریافت سایز در پارامتر سوم تصویر را بصورت خاصی کدر میکند که هرچه سایز بیشتر باشد تصویر کارتونی به نظر میرسد به مثال زیر دقت کنید: #include <opencv2\opencv.hpp> #include <Windows.h> using namespace cv; int main() { Mat output_image; Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR); //bilateralFilter(image_read, output_image, 100, 300, 500); //boxFilter(image_read, output_image, 5, Size(1, 1)); medianBlur(image_read, output_image, 17); imshow("befor", image_read);//befor Filtering imshow("after", output_image);//after Filtering ShowWindow(GetConsoleWindow(), SW_HIDE); waitKey(0); } حاصل اجرا کد بالا بصورت زیر خواهد بود:
- 1 پاسخ
-
- پردازش تصویر
- library
-
(و 4 مورد دیگر)
برچسب زده شده با :
-
کامبیز اسدزاده یک موضوع را ارسال کرد در <span class="ipsBadge ipsBadge_pill" style="background-color: #e62f3d; color: #ffffff;" >برنامه نویسی در C و ++C</span>
با توجه به وجود کتابخانههای متعدد در سیپلاسپلاس در این پُست قصد داریم آموزشهایی در رابطه با نحوهٔ راه اندازی انواع کتابخانهها را در سیپلاسپلاس توضیح دهیم. محیطهای توسعه جهت نصب Visual Studio و Qt Creator خواهند بود. در صورتی که نیاز است کتابخانهای را به صورت سفارشی کامپایل کنید نکاتی را باید مورد توجه قرار دهید که در ادامه آمدهاند. قبل از هر چیز نیاز است توضیحاتی در رابطه با انواع کتابخانهها داده شود. کتابخانهها برای اینکه در پروژه مورد استفاده قرار بگیرند نیاز است آنها از سمت منبع خود کامپایل و ساخته شوند. البته در این فرآیند باید توجه داشته باشید که نوع معماری در پیکربندی یک کتابخانه بسیار مهم است. برای مثال اگر قرار است کتابخانهای را بر روی یک پروژهای که تحت معماری x64 پیکربندی شده است و در وضعیت release منتشر شود، در این صورت حتماً باید کتابخانه مورد نظر تحت همین پیکربندی کامپایل شود. کتابخانهها ممکن است خودشان وابستهٔ کتابخانههای دیگری باشند. برای مثال بخشی از ماژول کتابخانه Boost و Poco وابستهٔ کتابخانهٔ OpenSSL میباشد. و یا بخشی از کتابخانهٔ MySQL وابستهٔ کتابخانهٔ Boost میباشد. بنابراین قبل از پیکربندی پروژه تحت هر کتابخانهای مطمئن شوید که پیش نیازات آن را در اختیار داشته باشید. توجه داشته باشید که حتماً راهنمای کتابخانهٔ مورد نظر خود را جهت نحوهٔ پیکربندی مطالعه نمایید، زیرا هیچ روش عامیانهای وجود ندارد که بر روی تمامی کتابخانهها صادق باشد. با توجه به نکات بالا آموزش لازم جهت پیکربندی و راه اندازی کتابخانهها را تحت دو گزینهٔ Boost و MFSL ادامه میدهیم: نسخهٔ مورد نظر کتابخانهٔ مورد نظر را از این بخش دریافت کنید. فایل دریافت شده را استخراج و در یک مسیر مشخصی مانند C://کتابخانهٔ شماکپی کنید. محیط کنسول در سیستم عامل را باز کنید، پیشنهاد میشود از Visual Studio Cross Tools Command Prompt استفاده کنید. به مسیر کتابخانه تحت دستور cd رفته و وارد آن شوید. در این مرحله نیاز است تا قبل از ساخت کتابخانه آن را پیکربندی کنید، بنابراین دستور زیر را اجرا خواهیم کرد: ./configure دقت کنید که این مرحله معمولاً در کتابخانهها متفاوت میباشد، برای مثال در کتابخانهٔ Boost فایلی به نام bootstrap.bat متخص ویندوز و فایل bootstrap.sh برای محیطهای یونیکس موجود است که وظیفهٔ پیکربندی و تولید فایل ساخت را بر عهده دارد. البته در نظر داشته باشید که این چنین پیکربندی در کتابخانههای خاص ممکن است و در بیشتر آنها باید با دستورات configure و فلگهای موجود در هر یک از آنها اقدام به پیکربندی کنید. بنابراین با توجه این مورد میتوانید آموزش لازم را در این بخش پیگیری نمایید. بعد از پیکربندی دستور make، nmake، cmake و یا qmake متناسب با نوع ابزار سازنده باید اجرا شود تا کتابخانه بر اساس پیکربندی تنظیم شده شروع به کامپایل و ساخت کند. این مرحله معمولاً بر اساس قدرت پردازشی سیستم شما زمان متغیری خواهد داشت. بعد از به اتمام رسیدن زمان کامپایل کتابخانهٔ مورد نظر فایلهای lib را تحت پسوندهای .dll در ویندوز و .lib و .so در لینوکس و یونیکس تولید خواهد کرد که بهتر است مسیر include برای هدرهای کتابخانه و lib برای فایلهای کامپایل شده مشخص شود. طبق شرایط ذکر شده برای مثال ما از کتابخانهٔ SDL در این بخش استفاده خواهیم کرد. نسخهٔ از پیش کامپایل شده مربوط به آن را از این بخش دریافت و استخراج نمایید. قست اول (نصب و راه اندازی تحت محیط Visual Studio) وارد محیط ویژوال استودیو شده و بعد از ایجاد پروژه بر روی پروژه راست کلیک و گزینهٔ Properties را انتخاب کنید، به زبانه C/C++ رفته و زبانه General گزینهٔ Additional Include Directories را انتخاب کنید. در ادامه مسیر include را از کتابخانهٔ SDL به پروژه معرفی کنید. مرحله کنونی را تایید کنید، و به زبانهٔ Linker و سپس General بروید، در این بخش گزینهٔ Additional Linker Library را انتخاب و مسیر Lib را از کتابخانهٔ SDL معرفی کنید. در این مرحله فایلهای کتابخانه معرفی شدهاند. به زبانهٔ General و Input برگشته و در بخش Additional Dependences فایلهای SDL2.lib و SDL2_image.lib و SDL2main.lib و SDL2_ttf.lib را معرفی کنید. در نهایت فایلهای dll موجود در پوشهٔ lib کتابخانه را در کنار فایل اجرایی کپی کنید. قست دوم (نصب و راه اندازی تحت محیط Qt Creator) پروژه خود را ایجاد و بر روی نام پروژه راست کلیک کنید. گزینهٔ Add Library و سپس External Library را بزنید. طبق شرایط قبل گزینههای lib را همراه با include به پروژهٔ خود اضافه نمایید. کد مربوط به فایل .pro به صورت زیر خواهد بود win32: LIBS += -L$$PWD/../../../../SDL2-2.0.8/lib/x86/ -lSDL2 -lSDL2main -lSDL2_ttf INCLUDEPATH += $$PWD/../../../../SDL2-2.0.8/lib/x86 DEPENDPATH += $$PWD/../../../../SDL2-2.0.8/lib/x86 طبق روش کامپایل برنامه را کامپایل کنید و قبل از اجرا فایلهای dll یا lib را نسبت به پلتفرم خود در کنار فایل اجرایی پروژه قرار دهید. https://iostream.ir/forums/topic/33-روش-افزودن-کتابخانههای-دیگر-به-محیط-qt-creator/ روش فوق در بیشتر کتابخانهها قابل انجام است.-
- سیپلاسپلاس
- کتابخانه
-
(و 6 مورد دیگر)
برچسب زده شده با :
-
همانطور که میدانید کتابخانهی بوست یکی از بهترین کتابخانههای Non-STL برای سیپلاسپلاس میباشد. در این پُست قصد داریم در رابطه با ساخت و استفاده کتابخانهی بوست توضیح دهیم. ابتدا کتابخانه را از اینجا دریافت کنید. فایلهای دریافتی را در یک مسیر مشخص استخراج کنید. راه اندازی در پلتفرم ویندوز برای مثال در این آموزش ما فایلهای مورد نظر خود را در مسیر C:/Boost استخراج کردهایم. در کنسول به مسیر فوق رفته و دستور زیر را اجرا کنید. bootstrap.bat این دستور تحت ابزار مخصوص بوست فایل کانفیگ ساخت آن را ارزیابی و اجرا میکند. بنابراین دستور بعدی به صورت زیر خواهد بود: b2 toolset=msvc-14.0 --build-type=complete --abbreviate-paths architecture=x86 address-model=64 install -j4 گزینهی toolset برای مشخص کردن کامپایلر و نسخهی آن میباشد که در اینجا آن را msvc-14.0 قرار داده ایم. گزینهی architecture جهت مشخص کردن معماری پردازنده است که به صورت پیش فرض بهتر است بر روی x86 تنظیم شود تا بر روی هر دو معماری ۶۴ و ۳۲ بیتی اجرا شود. گزینهی address-model جهت مشخص سازی نوع پردازندهای که پلتفرم اجرایی دارا میباشد را مشخص میسازد. برای مثال ما بر روی ویندوز ۶۴ بیتی و پردازنده ۶۴ بیتی گزینه x64 را انتخاب کرده ایم. گزینهی -j برای مشخص کردن تعداد هستههای قابل استفاده در زمان کامپایل میباشد. که به صورت پیشفرض بر روی ۴ تنظیم شده است (۴ هسته قابل اجرا به صورت هم زمان). بعد از اجرای دستور فوق چیزی حدود ۳۰ دقیقه (کمتر و یا بیشتر) متناسب با قدرت پردازشی سیستم شما نیاز خواهد بود تا کتابخانهی بوست کامپایل شود. توجه داشته باشید که بخشی از کتابخانههای موجود در بوست به صورت پیش فرض کامپایل نمیشوند و در صورت نیاز شما باید آنها را به صورت سفارشی تحت دستور --with-libraryname مشخص نمایید. کد زیر را اجرا نموده و نتیجه را مشاهده کنید: #include <boost/scoped_ptr.hpp> #include <iostream> int main() { boost::scoped_ptr<int> p{new int{1}}; std::cout << *p << '\n'; p.reset(new int{2}); std::cout << *p.get() << '\n'; p.reset(); std::cout << std::boolalpha << static_cast<bool>(p) << '\n'; } این آموزش برای پیکربندی کتابخانههای chrono, thread, filesystem, regex و...بر روی پلتفرمهای macOS و Linux ادامه خواهد داشت...
-
- بوست
- سیپلاسپلاس
- (و 10 مورد دیگر)
-