رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

جستجو در تالارهای گفتگو

در حال نمایش نتایج برای برچسب های 'cpp'.



تنظیمات بیشتر جستجو

  • جستجو بر اساس برچسب

    برچسب ها را با , از یکدیگر جدا نمایید.
  • جستجو بر اساس نویسنده

نوع محتوا


وبلاگ‌ها

چیزی برای نمایش وجود ندارد

چیزی برای نمایش وجود ندارد

تالارهای گفتگو

  • انجمن‌های آی او استریم
    • اخبار و اعلامیه‌های سایت
    • اسناد و قوانین مرجع
    • رویداد‌ها و جلسات
    • معرفی محصولات نوشته شده‌ بومی
    • مرکز نظرسنجی جامعه‌ی برنامه‌نویسان
    • مقالات و اسناد مشاوره‌ای
    • مرکز چالش برانگیز برنامه‌نویسان
    • رمز‌های موفقیت
    • ابزار‌ها و نرم‌افزارهای کاربردی برنامه‌نویسان حرفه‌ای
  • استارتاپی و کسب‌و‌کار
    • استارتاپ‌ها
    • سرمایه گذاری
    • شتاب دهنده‌ها
    • پارک‌های علم و فناوری و مراکز رشد
    • مصاحبه با استارت‌آپ‌ها
    • قوانین حقوقی
    • داستان‌های موفقیت
    • کارآفرینان و متخصصین
    • مشاوره اجرای کسب‌وکار
    • اخبار حوزه‌ی استارتا‌پی
    • آگهی‌های استخدامی
  • زبان‌های برنامه نویسی
    • برنامه نویسی در C و ‏++C
    • برنامه نویسی با Java
    • برنامه نویسی با JavaScript
    • برنامه نویسی با Go
    • برنامه نویسی با Python
    • برنامه نویسی با Delphi
    • برنامه نویسی با Ruby
    • برنامه نویسی با VB6
  • طراحی و توسعه وب
    • برنامه نویسی در PHP
    • برنامه نویسی با Node.JS
    • برنامه نویسی با Django
  • طراحی و توسعه وب اپلیکیشن‌ها
    • طراحی و توسعه در Angular
    • طراحی و توسعه در React.JS
    • طراحی و توسعه در Vue.JS
  • طراحی و توسعه موبایل و اِمبِد‌ها و تلوزیون‌ها
    • برنامه نویسی تحت محصولات اپل
    • برنامه نویسی تحت محصولات گوگل
    • طراحی و توسعه تحت محصولات دیگر
  • برنامه‌نویسی سطح پایین و سیستم عامل‌ها
    • سیستم عامل‌های آزاد
    • سیستم عامل‌های تجاری
    • مباحث آموزشی مرتبط با سیستم‌عامل
  • شبکه و اینترنت
  • بانک‌های اطلاعاتی
  • برنامه نویسی تحت محصولات اپل
  • برنامه نویسی تحت محصولات مایکروسافت
  • طراحی و توسعه تجربه کاربری (UX) و رابط کاربری (UI)
  • درخواست انجام پروژه (ویژه)
  • سوالات و مباحث عامیانه
  • سطل آشغال

Product Groups

  • کتاب‌ها و مقالات آموزشی

دسته ها

  • علمی
  • استارتاپی
  • برنامه‌نویسی
    • زبان‌های برنامه نویسی
    • معماری‌ها
  • کامپایلر و مفسر
  • محیط‌های توسعه
  • طراحی و توسعه‌ی وب
  • مجوز‌های نرم‌افزاری
  • فناوری‌ها
    • پردازش تصویر
    • اینترنت اشیاء
    • پردازش ابری (Cloud Computing)
    • چند سکویی (Cross-Platform)
    • بیگ دیتا (Big Data)
    • هوش مصنوعی (AI)
    • سخت افزار
    • نرم‌افزار و اپلیکیشن
    • اینترنت و شبکه
    • رمزنگاری
    • امبد‌ها (Embedded)
  • طراحی
    • تجربه کاربری
    • رابط کاربری

دسته ها

  • عمومی
  • گرافیکی
  • شبکه و ارتباطات

دسته ها

  • کامپایلر‌ها
  • محیط‌های توسعه
  • کتابخانه‌ها
  • ماژول‌ها و پلاگین‌ها
  • محصولات بومی
  • کتاب‌ها و مقالات
  • زبان‌ها و ابزار‌ها
  • طراحی و گرافیک

جستجو در ...

نمایش نتایجی که شامل ...


تاریخ ایجاد

  • شروع

    پایان


آخرین بروزرسانی

  • شروع

    پایان


فیلتر بر اساس تعداد ...

تاریخ عضویت

  • شروع

    پایان


گروه


درباره من


شماره تلفن همراه


شناسه گیت‌هاب


شناسه لینکدین


شناسه پیام رسان


شهر


آدرس پستی

13 نتیجه پیدا شد

  1. هنگامیکه شما برای اولین بار از C به CPP مهاجرت می کنید، یا اصلا برنامه نویسی را قصد دارید با CPP شروع کنید، با مفاهیم متعددی روبرو خواهید شد که شاید برای شما جالب باشند که بدانید، این ایده ها چطور شکل گرفتند، چطور به CPP افزوده شدند و اهمیت آن ها در عمل (هنگام برنامه نویسی و توسعه نرم افزار) چیست. در این پست وبلاگی IOStream، به این خواهیم پرداخت که ایده Overloading و Template و Auto Deduction چطور از CPP سر در آوردند. همانطور که شما ممکن است تجربه کرده باشید، هنگامیکه برنامه نویسی و توسعه نرم افزاری را با C شروع می کنید، برنامه شما چیزی بیش از یک مجموعه بی انتها از توابع و استراکچرها و متغیرها و اشاره گرها و ... نخواهند بود. از همین روی شما مجبور هستید مبتنی بر ایده مهندسی نرم افزار و پارادیم برنامه نویسی ساخت یافته، برای هر کاری یک تابع منحصربفرد پیاده سازی کنید. این تابع باید از هر لحاظی از قبیل نام، نوع ورودی ها، نوع خروجی و حتی نوع عملکرد منحصربفرد باشد تا بتواند یک کار را به شکل صحیح کنترل کند که همین مسئله می تواند در پیاده سازی برخی نرم افزارها، انسان را در جهنم داغ و سوزان قرار بدهد. مثلا پیاده سازی یک برنامه محاسباتی مانند ماشین حساب که ممکن است با انواع داده های محاسباتی مانند عدد صحیح (Integer) و عدد اعشاری (Float) رو به رو شود. از همین روی فرض کنید، ما قرار است یک عمل محاسباتی مانند جمع از برنامه ماشین حساب را پیاده سازی کنیم. برای اینکه برنامه به شکل صحیحی کار کند، باید عمل جمع یا همان Add برای انواع داده های موجود از قبیل عدد صحیح و اعشاری پیاده سازی شود. اگر شما این کار را انجام ندهید، برنامه شما به شکل صحیحی کار نخواهد کرد (یعنی نتایج اشتباه ممکن است برای ما تولید کند). در تصویر زیر، نمونه این برنامه و توابع مرتبط با آن پیاده سازی شده است: #include <stdio.h> int AddInt(int arg_a, int arg_b) { return arg_a + arg_b; } float AddFloat(float arg_a, float arg_b) { return arg_a + arg_b; } double AddDouble(double arg_a, double arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { int result_int = AddInt(1, 2); float result_float = AddFloat(10.02f, 21.23f); double result_double = AddDouble(9.0, 24.3); printf("Result Integer: %d", result_int); printf("Result Float: %f", result_float); printf("Result Double: %lf", result_double); return 0; } به برنامه بالا دقت کنید. ما سه تا تابع Add با نام های منحصربفرد داریم که سه نوع داده مجزا را به عنوان ورودی دریافت می کنند، سه نوع نتیجه مجزا بازگشت می دهند، اگرچه پیاده سازی آن ها کاملا مشابه هم دیگر است و تفاوتی در پیاده سازی این سه تابع وجود ندارد. ولی به هر صورت، اگر به خروجی دیزاسمبلی برنامه مشاهده کنید، دلیل این مسئله را متوجه خواهید شد که چرا هنگام برنامه نویسی با زبان C، به نام های منحصربفرد نیاز است، چون اگر توابع نام های مشابه با هم داشته باشند، لینکر نمی تواند به دلیل تداخل نام (Name Conflict)، آدرس آن ها را محاسبه یا اصطلاحا Resolve کند. همانطور که در تصویر بالا خروجی دیزاسمبلی برنامه Add را مشاهده می کنید، اگر توابع نام مشابه داشتند، در هنگام فراخوانی (Call) تابع Add تداخل رخ می داد، چون دینامیک لودر سیستم عامل دقیقا نمی داند که کدام تابع را باید فراخوانی کند. برای همین نیاز است وقتی برنامه نوشته می شود، نام توابع در سطح کدهای اسمبلی و ماشین منحصر بفرد باشد. به هر صورت، به نظر شما آیا راهی وجود دارد که ما پیاده سازی این نوع توابع را ساده تر کنیم یا حداقل بار نامگذاری آن ها را از روی دوش توسعه دهنده و برنامه نویس برداریم؟ بله امکان این کار وجود دارد. مهندسان CPP با افزودن ویژگی Overloading و Name Mangling یا همان بحث Decoration مشکل برنامه نویسان در پیاده سازی توابع با نام های منحصربفرد را حل کردند (البته کاربردهای دیگر هم دارد که فعلا برای بحث ما اهمیت ندارند). ویژگی اورلودینگ در CPP به ما اجازه خواهد داد یک تابع با عنوان Add پیاده سازی کنیم که تفاوت آن ها فقط در نوع ورودی و نوع خروجی است. به عنوان مثال، در قسمت زیر، کد برنامه Add را مشاهده می کنید که با قواعد CPP بازنویسی شده است. #include <iostream> int Add(int arg_a, int arg_b) { return arg_a + arg_b; } float Add(float arg_a, float arg_b) { return arg_a + arg_b; } double Add(double arg_a, double arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { int result_int = Add(1, 2); float result_float = Add(10.02f, 21.23f); double result_double = Add(9.0, 24.3); std::cout << "Result Integer: " << result_int << std::endl; std::cout << "Result Float: " << result_float << std::endl; std::cout << "Result Double: " << result_double << std::endl; return 0; } همانطور که مشاهده می کنید، ما اکنون سه تابع با نام Add داریم. ولی شاید سوال پرسیده شود که چطور لینکر متوجه تفاوت این توابع با یکدیگر می شود درحالیکه هر سه دارای یک نام واحد هستند. اینجاست که مسئله Name Mangling یا همان Decoration نام آبجکت ها در CPP مطرح می شود. اگر شما برنامه مذکور را دیزاسمبل کنید، متوجه تفاوت کد منبع (Source-code) و کد ماشین/اسمبلی (Machine/Assembly-code) خواهید شد. همانطور که در خروجی دیزاسمبلی برنامه اکنون مشاهده می کنید، توابع اگرچه در سطح کد منبع دارای نام مشابه با یکدیگر بودند، اما بعد کامپایل نام آن ها به شکل بالا تبدیل می شود. به این شیوه نام گذاری Name Mangling یا Decoration گویند که قواعد خاصی در هر کامپایلر برای آن وجود دارد. این ویژگی موجب می شود در ادامه لینکر بتواند تمیز بین انواع توابع Add شود. به عنوان مثال، تابع نامگذاری شده با عنوان j__?Add@YAHH@Z تابعی است که به نوعی از تابع Add اشاره دارد که ورودی هایی از نوع عدد صحیح دریافت می کند. این شیوه نامگذاری خلاصه موجب خواهد شد لینکر بتواند به سادگی بین توابع تمایز قائل شود. با این حال هنوز یک مشکل باقی است، و آن هم تکرار مجدد یک پیاده سازی برای هر تابع است. به نظر شما آیا راهی وجود دارد که ما از پیاده سازی مجدد توابعی که ساختار مشابه برای انواع ورودی ها دارند، جلوگیری کنیم؟ باید بگوییم، بله. این امکان برای شما به عنوان توسعه دهنده CPP در نظر گرفته شده است. ویژگی که اکنون به عنوان Templateها در مباحث Metaprogramming یا Generic Programming استفاده می شود، ایجاد شده است تا این مشکل را اساساً برای ما رفع کند. با استفاده از این ویژگی کافی است، طرح یا الگوی یک تابع را پیاده سازی کنید، تا در ادامه خود کامپایلر مبتنی بر ورودی هایی که به الگو عبور می دهید، در Backend، یک نمونه تابع Overload شده مبتنی بر آن الگو برای نوع داده شما ایجاد کند. #include <iostream> template <typename Type> Type Add(Type arg_a, Type arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { int result_int = Add(1, 2); float result_float = Add(10.02f, 21.23f); double result_double = Add(9.0, 24.3); std::cout << "Result Integer: " << result_int << std::endl; std::cout << "Result Float: " << result_float << std::endl; std::cout << "Result Double: " << result_double << std::endl; return 0; } به عنوان مثال، در بالا تابع Add را مشاهده می کنید که نوع داده ورودی این تابع و حتی نوع خروجی آن مشخص نشده است و در قالب Typename به کامپایلر معرفی شده است. این یک الگو برای تابع Add است. کامپایلر اکنون می تواند مبتنی بر ورودی هایی که به تابع هنگام فراخوانی یا اصطلاحا Initialization عبور می دهیم، یک نمونه تابع Overload شده از آن الگو ایجاد کند و در ادامه آن را برای استفاده در محیط Runtime فراخوانی کند. حال اگر برنامه بالا را دیزاسمبل کنید، مشاهده خواهید کرد که کامپایلر از همان قاعده Overloading استفاده کرده است تا نمونه ای از تابع Add متناسب با نوع ورودی هایش ایجاد کند. هنوز می توان برنامه نویسی با CPP را جذاب تر و البته ساده تر کرد، اما چطور؟ همانطور که در قطعه کد بالا مشاهده می کنید، هنوز ما باید خود تشخیص دهیم که نوع خروجی تابع قرار است به چه شکل باشد. این مورد خیلی مواقع مشکل ساز خواهد بود. برای حل این مسئله، در CPP مبحثی در نظر گرفته شده است که آن را به عنوان Auto Deduction می شناسیم که سطح هوشمندی کامپایلر CPP را بالاتر می برد. در این ویژگی خود کامپایلر است که مشخص می کند نوع یک متغیر مبتنی بر خروجی که به آن تخصیص داده می شود، چیست. به عنوان مثال، شما می توانید برنامه بالا را به شکل زیر بازنویسی کنید: #include <iostream> template <typename Type> auto Add(Type arg_a, Type arg_b) { return arg_a + arg_b; } int main(int argc, const char* argv[]) { auto result_int = Add(1, 2); auto result_float = Add(10.02f, 21.23f); auto result_double = Add(9.0, 24.3); std::cout << "Result Integer: " << result_int << std::endl; std::cout << "Result Float: " << result_float << std::endl; std::cout << "Result Double: " << result_double << std::endl; return 0; } با استفاده از ویژگی Auto Deduction و کلیدواژه Auto در برنامه، خود کامپایلر در ادامه مشخص خواهد کرد که تابع Add چه نوع خروجی دارد و همچنین نوع متغیرها برای ذخیره سازی خروجی Add چه باید باشد. به عبارتی اکنون تابع Add هم Value و هم Data type را مشخص می کند که این موجب می شود برنامه نویسی با CPP خیلی ساده تر از گذشته شود. حال اگر به نمونه برنامه آخر نگاه کنید و آن را با نمونه C مقایسه کنید، متوجه خواهید شد که CPP چقدر کار را برای ما ساده تر کرده است. در این پست به هر صورت، قصد داشتم به شما نشان دهم که نحوه تحول CPP به صورت گام به گام چطور بوده است و البته اینکه پشت هر ویژگی در CPP چه منطق کلی وجود دارد. امیدوارم این مقاله برای شما مفید بوده باشد. نمونه انگلیسی این مقاله را می توانید در این آدرس (لینک) مطالعه کنید. میلاد کهساری الهادی
  2. با سلام وقت بخیر, در این مطلب میخواهیم در مورد روش کارکرد پیام رسان ها بیشتر بدانیم و با یکدیگر کد یک پیام رسان ساده را پیاده و بررسی کنیم. طرز کار کرد پیام رسان در نظر داشته باشید که هر پیام رسانی که بر ساختار ها پیاده شده باشد از دو قسمت تشکیل شده است. نرم افزار اصلی برای مدیریت درخواست ها (سرور) نرم افزار برای کاربران (کاربر) به نرم افزار اولی سمت SERVER خواهیم گفت و به بعدی سمت CLIENT خواهیم گفت. روم یا تالار گفتگو ما تنها یک اتاق برای گفتگو در نظر میگیریم و هر کاربری که به سرور متصل شود را در همان تالار اضافه خواهیم کرد. تالار های گفتگو صرفا برای تقکیک سازی ارسال و دریافت ها و محدود کردن بازه ی کاربران مورد نظر... (ممکن است یک کاربر در چند اتاق بطور همزمان باشد.) سیستم های پیام رسان پیشرفته تر مانند تلگرام و ... تالار های زیادی را شامل می شوند. (هر کاربر خودش در کانال و گروه های مختلفی عضو است که هر کدام از آنها یک کانال متفاوت محسوب می شوند.) * دقت شود که منظور از کانال صرفا یک اتاق یا تالار گفتگو است و منظور کانال ارتباطی و پروتکل نیست. نرم افزار اصلی نرم افزار اصلی وظیفه دارد تا تمام کاربرانی که وارد تالار شده اند را به یاد داشته باشد و هر لحظه اماده دریافت درخواست هایی از طرف کاربرانش باشد. و پیام هایی را که از کاربران دریافت می کند برای تمامی کاربران دیگر هم ارسال کند که بسته به خلاقیت و نیاز می تواند هر یک از این بخش ها متفاوت طراحی شود. نرم افزار اصلی باید از قبل اجرا شده باشد. تا کاربران دیگر با استفاده از نرم افزار مخصوص به خودشان بتوانند به سرور متصل شوند و ارسال و دریافت داشته باشند. در نظر داشته باشید که اگر در نرم افزار اصلی اختلالی پیش بیایید و متوقف بشوند. قطا برای تمام کاربران مشکل پیش می آید. مگر اینکه از پایگاه های داده ی داخلی استفاده کرده باشند. (با خلاقیت می توان به گونه های متفاوتی چنین ساختاری را پیاده کرد) نرم افزار کاربران این نرم افزار جذاب ترین بخش است چرا تمام قابلیت هایی را که در اختیار کاربر قرار می دهیم را مستقیما طراحی می کنیم. در نظر داشته باشید که هر چیزی که در این نرم افزار طراحی می شود باید در نرم افزار اصلی پشتیبانی شوند... بنابراین اگر این دو بخش توسط دو فرد یا دو گروه مجزا طراحی می شوند آنها باید توسط داکیومنت ها و جلساتی به نظرات مشابه ای رسیده باشند. (اگرچه اینها تخصص و وظیفه ی تحلیلگر سیستم است! نه بطور همزمان وظیفه توسعه دهنده و برنامه نویس نرم افزار) پیاده سازی یک نمونه اکنون در نظر داریم تا با استفاده از ساختار کتابخانه BoostAsio پروژه ای را با نام BoostAsioChat ایجاد کنیم که در آن می خواهیم یک پیام رسان با حداقل ترین امکانات پایه طراحی کنیم که بیشتر جنبه شخصی و تفریحی دارد. زیرا از ساختار های استاندارد و ایمن و کاربری کاملا بدور است! (می توانید خودتان توسعه دهید و آنرا جالب تر بسازید) ساختار نرم افزار اصلی و سرور را به این صورت تعریف می کنیم : typedef deque<message> messageQueue; class participant { public: virtual ~participant() {} virtual void deliver(const message& messageItem) = 0; }; typedef shared_ptr<participant> participantPointer; class room { public: void join(participantPointer participant); void deliver(const message& messageItem); void leave(participantPointer participant); private: messageQueue messageRecents; enum { max = 200 }; set<participantPointer> participants; }; class session : public participant, public enable_shared_from_this<session> { public: session(tcp::socket socket, room& room) : socket(move(socket)), room_(room); void start(); void deliver(const message& messageItem); private: void readHeader(); void readBody(); void write(); tcp::socket socket; room& room_; message messageItem; messageQueue Messages; }; class server { public: server(boost::asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor(io_context, endpoint); private: void do_accept(); tcp::acceptor acceptor; room room_; }; int main(int argc, char* argv[]); ساختار نرم افزار کاربر را هم به این صورت تعریف می کنیم : typedef deque<message> messageQueue; class client { public: client(boost::asio::io_context& context, const tcp::resolver::results_type& endpoints) : context(context), socket(context); void write(const message& messageItem); void close(); private: void connect(const tcp::resolver::results_type& endpoints); void readHeader(); void readBody(); void write(); boost::asio::io_context& context; tcp::socket socket; message readMessage; messageQueue writeMessage; }; int main(int argc, char* argv[]); در نظر داریم تا در این پروژه از thread ها نیز استفاده کنیم... در مورد این مفهوم ها می توانید بصورت مجزا تحقیق کنید. بنابراین روش کامپایل این پروژه به این صورت خواهد بود : $ g++ client.cpp -lpthread -o client $ g++ Server.cpp -lpthread -o server آزمایش همانطور که گفته شد در ابتدا نرم افزار اصلی و سرور باید اجرا شود. در اینجا ما تمام ارتباطات شبکه را بر روی یک سیستم در شبکه داخلی برقرار خواهیم کرد... پس نگرانی در مورد ساختار های درونی شبکه و آی پی / دی ان اس / دامین نخواهیم داشت. بنابراین ای پی را می توانید ای پی داخلی یا localhost در نظر بگیرید. برای آزمایش پورت فرضی 4000 را در نظر میگیریم و نرم افزار اصلی را روی این پورت اجرا میکنیم : $ ./server 4000 در این مرحله متوجه می شوید که نرم افزار اصلی با موفقیت اجرا شده است و همچنان اجرا مانده است. بله درست است... نرم افزار اصلی هر لحظه باید منتظر دستور کاربران باشد. اگر لحظه ای برای نرم افزار اصلی اختلالی پیش آید نخواهد توانست دستورات کاربران را انجام یا پاسخ دهد. بنابراین این پردازش را قطع نکنید و اجازه دهید تا نرم افزار اصلی اجرا بماند. در محیط دیگری نرم افزار سمت کاربر را نیز اجرا کنید. این نرم افزار را می توانید به تعداد دلخواه وارد کنید. (همانطور که ممکن است 6 نفر همزمان به سرور متصل باشند / یا ممکن است هیچ فردی به سرور متصل نشوند) ابتدا یک کاربری را به سرور با پورت 4000 و شبکه داخلی وصل می کنیم : $ ./client localhost 4000 first user: you can type message here... حال در محیط دیگری با کاربر جدیدی نیز وارد می شویم : $ ./client localhost 4000 second user: you can type message here... در این پروژه نمونه از کاربران نام کاربری یا نام نمی پرسیم.. و صرفا وقتی وارد محیط گفتگو می شوند... یا زمانی که به سرور متصل می شوند منتظر هستیم تا انها پیامی را بنویسند... هر پیامی را که بنویسند به سرور ارسال می شود و سرور وظیفه دارد تا آنرا برای تمام کاربران بفرستد. و این روند درون یک حلقه بی نهایت تکرار می شوند. پس این ارتباط دو طرفه خواهد بود و هم کاربران برای سرور اطلاعات ارسال می کنند و هم سرور برای کاربران اطلاعات ارسال خواهد کرد. در نظر داشته باشید که کاربر اول می تواند پیامی را بنویسد و به کاربران دیگر ارسال شود. ممکن است کاربر سومی اصلا تصمیمی به نوشتن پیام نداشته باشد و صرفا تمایل به خواندن پیام دیگران داشته باشند. و این کاملا اختیاری است. و ما کاربران را اجباری نمیکنیم. اگرچه شما می توانید با خلاقیت خودتان اینها را با متغییر های کمکی و دستورات شرطی پیاده کنید. کد ها برای پیام ها یک ساختار در نظر میگیریم و بصورت مشترک در هر دو نرم افزار استفاده خواهیم کرد... بنابراین اینرا در هدر پیاده خواهیم کرد. هدر پیام : (message.hpp) #ifndef message_HPP #define message_HPP #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; class message { public: enum { headerLength = 4 }; enum { maxBodyLength = 512 }; message() : bodyLength_(0) { } const char* data() const { return data_; } char* data() { return data_; } size_t length() const { return headerLength + bodyLength_; } const char* body() const { return data_ + headerLength; } char* body() { return data_ + headerLength; } size_t bodyLength() const { return bodyLength_; } void bodyLength(size_t new_length) { bodyLength_ = new_length; if(bodyLength_ > maxBodyLength) bodyLength_ = maxBodyLength; } bool decodeHeader() { char header[headerLength + 1] = ""; strncat(header, data_, headerLength); bodyLength_ = atoi(header); if(bodyLength_ > maxBodyLength) { bodyLength_ = 0; return false; } return true; } void encodeHeader() { char header[headerLength + 1] = ""; sprintf(header, "%4d", static_cast<int>(bodyLength_)); memcpy(data_, header, headerLength); } private: char data_[headerLength + maxBodyLength]; size_t bodyLength_; }; #endif نرم افزار اصلی و سرور : (server.cpp) #include <iostream> #include <cstdlib> #include <deque> #include <memory> #include <list> #include <set> #include <utility> #include <boost/asio.hpp> #include "message.hpp" using boost::asio::ip::tcp; using namespace std; typedef deque<message> messageQueue; class participant { public: virtual ~participant() {} virtual void deliver(const message& messageItem) = 0; }; typedef shared_ptr<participant> participantPointer; class room { public: void join(participantPointer participant) { participants.insert(participant); for(auto messageItem: messageRecents) participant->deliver(messageItem); } void deliver(const message& messageItem) { messageRecents.push_back(messageItem); while(messageRecents.size() > max) messageRecents.pop_front(); for(auto participant: participants) participant->deliver(messageItem); } void leave(participantPointer participant) { participants.erase(participant); } private: messageQueue messageRecents; enum { max = 200 }; set<participantPointer> participants; }; class session : public participant, public enable_shared_from_this<session> { public: session(tcp::socket socket, room& room) : socket(move(socket)), room_(room) { } void start() { room_.join(shared_from_this()); readHeader(); } void deliver(const message& messageItem) { bool write_in_progress = !Messages.empty(); Messages.push_back(messageItem); if(!write_in_progress) { write(); } } private: void readHeader() { auto self(shared_from_this()); boost::asio::async_read(socket, boost::asio::buffer(messageItem.data(), message::headerLength), [this, self](boost::system::error_code ec, size_t) { if(!ec && messageItem.decodeHeader()) { readBody(); } else { room_.leave(shared_from_this()); } }); } void readBody() { auto self(shared_from_this()); boost::asio::async_read(socket, boost::asio::buffer(messageItem.body(), messageItem.bodyLength()), [this, self](boost::system::error_code ec, size_t) { if(!ec) { room_.deliver(messageItem); readHeader(); } else { room_.leave(shared_from_this()); } }); } void write() { auto self(shared_from_this()); boost::asio::async_write(socket, boost::asio::buffer(Messages.front().data(), Messages.front().length()), [this, self](boost::system::error_code ec, size_t) { if(!ec) { Messages.pop_front(); if(!Messages.empty()) { write(); } } else { room_.leave(shared_from_this()); } }); } tcp::socket socket; room& room_; message messageItem; messageQueue Messages; }; class server { public: server(boost::asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor(io_context, endpoint) { do_accept(); } private: void do_accept() { acceptor.async_accept([this](boost::system::error_code ec, tcp::socket socket) { if(!ec) { make_shared<session>(move(socket), room_)->start(); } do_accept(); }); } tcp::acceptor acceptor; room room_; }; int main(int argc, char* argv[]) { try { if(argc < 2) { cerr << "Usage: server <port> [<port> ...]\n"; return 1; } boost::asio::io_context io_context; list<server> servers; for(int i = 1; i < argc; ++i) { tcp::endpoint endpoint(tcp::v4(), atoi(argv[i])); servers.emplace_back(io_context, endpoint); } io_context.run(); } catch (exception& e) { cerr << "Exception: " << e.what() << "\n"; } return 0; } نرم افزار دوم و سمت کاربر : (client.cpp) #include <iostream> #include <thread> #include <cstdlib> #include <deque> #include <boost/asio.hpp> #include "message.hpp" using boost::asio::ip::tcp; using namespace std; typedef deque<message> messageQueue; class client { public: client(boost::asio::io_context& context, const tcp::resolver::results_type& endpoints) : context(context), socket(context) { connect(endpoints); } void write(const message& messageItem) { boost::asio::post(context, [this, messageItem]() { bool write_in_progress = !writeMessage.empty(); writeMessage.push_back(messageItem); if(!write_in_progress) { write(); } }); } void close() { boost::asio::post(context, [this]() { socket.close(); }); } private: void connect(const tcp::resolver::results_type& endpoints) { boost::asio::async_connect(socket, endpoints, [this](boost::system::error_code ec, tcp::endpoint) { if(!ec) { readHeader(); } }); } void readHeader() { boost::asio::async_read(socket, boost::asio::buffer(readMessage.data(), message::headerLength), [this](boost::system::error_code ec, size_t) { if(!ec && readMessage.decodeHeader()) { readBody(); } else { socket.close(); } }); } void readBody() { boost::asio::async_read(socket, boost::asio::buffer(readMessage.body(), readMessage.bodyLength()), [this](boost::system::error_code ec, size_t) { if(!ec) { cout.write(readMessage.body(), readMessage.bodyLength()); cout << "\n"; readHeader(); } else { socket.close(); } }); } void write() { boost::asio::async_write(socket, boost::asio::buffer(writeMessage.front().data(), writeMessage.front().length()), [this](boost::system::error_code ec, size_t) { if(!ec) { writeMessage.pop_front(); if(!writeMessage.empty()) { write(); } } else { socket.close(); } }); } boost::asio::io_context& context; tcp::socket socket; message readMessage; messageQueue writeMessage; }; int main(int argc, char* argv[]) { try { if(argc != 3) { cerr << "Usage: client <host> <port>\n"; return 1; } boost::asio::io_context context; tcp::resolver resolver(context); auto endpoints = resolver.resolve(argv[1], argv[2]); client c(context, endpoints); thread t([&context](){ context.run(); }); char line[message::maxBodyLength + 1]; while(cin.getline(line, message::maxBodyLength + 1)) { message messageItem; messageItem.bodyLength(strlen(line)); memcpy(messageItem.body(), line, messageItem.bodyLength()); messageItem.encodeHeader(); c.write(messageItem); } c.close(); t.join(); } catch (exception& e) { cerr << "Exception: " << e.what() << "\n"; } return 0; } این پروژه آزمایشی بصورت رایگان و اوپن سورس در اینترنت بخصوص اینجا وجود دارد و می توانید آنرا مستقیما بصورت کامل دانلود کنید. با تشکر, Max Base / مکس بیس
  3. با سلام من میخوام چند فایلی که داخل فولدرم دارم رو تغییر نام بدم ، وقتی فایل ها زبانشون انگلیسی باشه مشکلی نیست قشنگ نامشون تغییر میده ولی وقتی به زبان های دیگه ای filename باشه درست تغییر نمیده ممنون میشم راهنمایی کنید . #include <iostream> #include <filesystem> #include <stdio.h> #include <windows.h> #include <thread> using namespace std; #ifdef _MSC_VER std::wstring ToUtf16(std::string str) { std::wstring ret; int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0); if (len > 0) { ret.resize(len); MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), &ret[0], len); } return ret; } #endif int main() { const std::filesystem::directory_options options = ( std::filesystem::directory_options::follow_directory_symlink | std::filesystem::directory_options::skip_permission_denied ); try { for (const auto& dirEntry : std::filesystem::recursive_directory_iterator("C:\\folder", std::filesystem::directory_options(options))) { filesystem::path myfile(dirEntry.path().u8string()); string uft8path1 = dirEntry.path().u8string(); string uft8path3 = myfile.parent_path().u8string() + "/" + "renamed-" + myfile.filename().u8string(); _wrename( ToUtf16(uft8path1).c_str() , ToUtf16(uft8path3).c_str() ); std::cout << dirEntry.path().u8string() << std::endl; } } catch (std::filesystem::filesystem_error & fse) { std::cout << fse.what() << std::endl; } system("pause"); }
  4. کامبیز اسدزاده

    آینده‌ی توسعه‌ی وب تحت فناوری WebAssembly

    با توجه به محبوبیت صنعت وِب، سال‌هاست زبان‌های برنامه‌نویسی در این زمینه پیشرفت‌ها و کاربرد‌های چشم‌گیری را داشته‌اند، از جمله جاوا‌اسکریپت (JS) به عنوان یک زبان قابل اجرا در داخل مرورگر شناخته می‌شود. هرچند بسیار محبوب و کاربردی است، اما این زبان قطعاً مشکلات خودش را دارد که برخی از آن‌ها عدم انعطاف‌پذیر بودن، سرعت پایین اجرا و همچنین انواع غیر ایمن آن است که این باعث می‌شود برای محاسبات و کارهای پیچیده جوابگو نباشد. هرچند گزینه‌هایی مانند CoffeeScript و TypeScript وجود دارند و نسبتاً ایرادات خام جاوا‌اسکریپتی را پوشش می‌دهند، اما در نهایت کد‌های نوشته شده به جاوا‌اسکریپت تبدیل می‌شود. در این میان می‌توان گفت وب‌اسمبلی (WebAssembly) برای حل و مرتب سازی مشکلات جاوا‌اسکریپت معرفی شده است و شدیداً در حال اثبات آن است که یک انقلاب در صنعت وِب را رقم می‌زند. با این تفاسیر، آیا وب‌اسمبلی زبان برنامه‌نویسی است؟ این فناوری به خودی خود، یک زبان برنامه‌نویسی نیست، در واقع برنامه‌نویسان برنامه‌های خود را توسط زبان‌های سطح‌بالا مانند C یا ++C و حتی Rust می‌نویسند و آن را کامپایل و در قالب باینری با پسوند فایل .wasm وارد می‌کنند. توجه داشته باشید که وب‌اسمبلی جایگزینی برای جاوا‌اسکریپت نیست، درواقع قرار است در کنار جاوا‌اسکریپت اجرا شود. به عنوان مثال شما می‌توانید فقط یک کد محاسباتی بالا را در WebAssembly بسازید و آن را در کنار سایر کد‌های جاوا‌اسکریپت با وزن سبک‌تر استفاده کنید. همچنین شما برای بارگذاری ماژول wasm در مرورگر به جاوا‌اسکریپت نیاز دارید. فناوری وب‌اسمبلی (WebAssembly) و یا WA چیست؟ وب‌اسمبلی یا وَسم (Wasm، اغلب به طور مخفف) استانداردی باز است که یک قالب جدید دستورالعمل‌های باینری را معرفی می‌کند. این فناوری نوید این را می‌دهد که برنامه‌ها با کارآیی (پرفرمنس) بومیِ خود در بستر وِب اجرا شوند. به عبارت ساده‌تر می‌توان گفت، این فناوری امکان این را می‌دهد که کد‌های نوشته شده با زبان‌های سطح بالا‌تر مانند C و ++C یا Rust به ماژول Wasm کامپایل شوند که مستقیماً در مرورگر‌های مدرن قابل اجرا هستند. معماری وب‌اسمبلی وب‌اسمبلی به گونه‌ای طراحی شده است که بر روی دستگاه‌های مجازی مبتنی بر پشته (stack-based) اجرا شود. بر خلاف ماشین‌های رجیستری که عملوند‌های آن‌ها بر روی پردازنده‌ی مرکزی قرار دارند و محاسبات در آن بخش اتفاق می‌افتد، در یک ماشین مبتنی بر پشته، بیشتر دستورالعمل‌ها به جای اینکه بر روی رجیستر اعمال شوند، بر روی پشته می‌نشینند. برای افزودن دو عدد بر روی ماشین مبتنی بر پشته، شماره‌های مربوطه را در پشته ارسال می‌کنید. سپس دستور ADD را فشار می‌دهید. سپس دو عملگر و دستورالعمل از بالای صفحه ظاهر می‌شود و نتیجه‌ی اضافی در جای خود قرار می‌گیرد. برخی از این نوع ماشین‌ها عبارتند از .Net، JVM Runtime و غیره. وب‌اسمبلی به معنای سنتی، پشته‌ای ندارد. درواقع هیچ مفهومی از اپراتور‌های جدید ندارد. حتی خبری از GC در آن وجود ندارد. در عوض وب‌اسمبلی دارای یک حافظه‌ی خطی است، یعنی حافظه به عنوان طیف پیوسته از بایت‌های بدون نوع نمایش داده می‌شود. در صورت نیاز به فضای بیشتر، ماژول وب‌اسمبلیِ شما می‌تواند بلوک حافظه‌ی خطی را افزایش دهد. نکته: WebAssemble فقط چهار نوع داده دارد: i32، i64، f32، f64 برای اعداد صحیح 32 و 64 بیتی و انواع شماره‌های شناور آینده‌ی توسعه‌ی وب چگونه می‌شود؟ اگرچه ممکن است وب‌اسمبلی، جاوا اسکریپت را از بین نبرد، اما قطعاً قصد این را دارد که چهره‌ی front-end توسعه‌ی وب را تغییر دهد. البته راه بسیاری در پیش است تا همه‌ی تغییرات را تجربه کنیم. اما به اندازه‌ی کافی می‌توان آینده‌ی وب را پیش‌بینی کنیم: تنوع از نظر زبانی خیلی سریع موازی تنوع زبانی این فناوری به طور چشم‌گیری تنوع در استفاده از زبان‌های برنامه‌نویسی را برای ساخت برنامه‌های تحت وب افزایش می‌دهد. در حال حاضر لیست زیر زبان‌هایی است که وب‌اسمبلی از آن‌ها پشتیبانی می‌کند: C/C++ Rust C#/.Net Java Python Elixir Go سرعت و کارآیی بسیار بالا فناوری WASM باعث می‌شود عملکرد برنامه‌ها شگفت‌انگیز شود. در این زمینه مستنداتی وجود دارد که فایرفاکس در یک سری از نمونه‌های اولیه آن را ثابت می‌کند. همچنین طبق تجزیه و تحلیل برنامه‌های کاربردی توسط فیگما منتشر شده است که نشان می‌دهد پیاده‌سازی‌های صورت گرفت در قالب asm.js که خود از سرعت بسیاربالای به خاطر پشتیبانی از سی++ دارد، با این وجود با فعال بودن ماژول WebAssembly چیزی حدود ۳ برابر بهبود زمان اجرا گرفته است. در این موارد ثابت شده است که با استفاده از ++C و کامپایلر کلنگ (LLVM) سرعت اجرای برنامه‌ها با فعال بودن وب‌اسمبلی بسیار چشم‌گیر است. موازی سازی طبیعتاً این مورد بسیار قابل بررسی و توجه است، چرا که این مبحث به طور کامل در وِب پیاده‌سازی نشده است. از آنجایی که تغییر به سمت پردازنده‌های چند هسته‌ای حدوداً از سال ۲۰۰۵ آغاز شد، این امر به طور فزاینده‌ای اتفاق می‌افتد که برای دستیابی به عملکرد بیشتر، نرم‌افزار‌ها به موازی سازی نیاز دارند. با توجه به اینکه جاوا‌اسکریپت از سیستم موازی پشتیبانی نمی‌کند، تصور کنید که با فعال‌سازی WASM امکان استفاده از تمامی هسته‌های پردازنده فراهم شود. من به عنوان نویسنده‌ی این مقاله، تصور شما را از این فناوری نمی‌دانم. اما قطعاً با این تفاسیر این فناوری به عنوان یک انقلاب بزرگ در حوزه‌ی وِب محسوب می‌شود. با توجه به ساختار برنامه‌های نوشته شده توسط زبان‌های قدرتمندی چون ++C می‌توان تصور کرد که برنامه‌های بسیار بهینه و قدرتمندی را در حوزه‌ی اجرایی مرورگر‌ها پشتیبانی کند. در حال حاضر ممکن استد شما فکر کنید که چرا کسی باید زبان ساده‌ای مثل جاوا‌اسکریپت را خدشه‌دار کند و یا به سمت زبان‌های پیچیده‌ای مانند Rust، C و ++C برود. اکنون وب‌اسمبلی کاملاً جدید است و جامعه‌ی کافی در اطراف خود ندارد. اما باید توجه داشت وقتی از طریق این فناوری می‌توان به ویدئو‌ها، تصاویر و کتابخانه‌های رمزنگاری، یا استفاده از موتور‌های گرافیکی و فیزیکی که از OpenGL استفاده می‌کنند، و یا حتی کتابخانه‌‌ها و فریم‌ورک‌های قدرتمندی مانند Qt و غیره را می‌توان در حوزه‌ی وب مورد استفاده قرار داد. بنابراین فناوری وب‌اسمبلی می‌تواند مسیری را برای رشد صنایع مختلف به خصوص شرکت‌های بازی‌سازی و غیره باز کند. افزایش کارآیی (پرفرمنس) بسیار شدید که توسط وب‌اسمبلی فراهم می‌شود، همانند اجرای برنامه‌های دسکتاپی است که می‌توان آن را بر روی وب نیز مشاهده کرد. با این روال ممکن است وب‌اسمبلی در سال‌های آینده، با نرم‌افزار‌های رومیزیِ بومی برابری کند.
  5. اولین پلتفرم آموزشی چند منظورهٔ بومی اگر شما به دنبال فراگیری مهارت خاصی در زندگی خود هستید، فانوکس بستر مناسبی برای شما است؛ نام فانوکس الهام گرفته از فانوس دریایی است که نماد پیدا کردن مسیر و نور راهنما تا رسیدن به مقصد می‌باشد. هدف : آموزش و یادگیری هوشمند در هر زمان و هر جا برای بهبود زندگی و کسب و کار این تاپیک برای این منظور ایجاد شده است که پروژه معرفی و بازخورد‌های آن در این بخش اعلام و اصلاح شوند. بنابراین تمامی دوستان و علاقه‌مندانی که بازخورد‌هایی برای آن دارند می‌توانند در این بخش آن را اعلام کنند تا به کمک هم آن را اصلاح و توسعه دهیم. نکته: نسخهٔ ریلیز شده ویژگی ثبت خطاها را دارد که به شما اجازه می‌دهد کد و پیغام خطا را کپی و در اختیار ما قرار دهید. بنابراین شرط جاری روی مُد User و فلگ‌های Info، Warning، Failed و Critical نیز تنظیم شده‌اند که می‌توانید در صورت مشاهده آن‌ها را تقسیم بندی کنید. if(DeveloperMode::IsEnable) { Logger::LoggerModel = Logger::Mode::User; Log("Log Message : " + Event , LoggerType::Info); Log("Log Message : " + Event , LoggerType::Warning); Log("Log Message : " + Event , LoggerType::Failed); Log("Log Message : " + Event , LoggerType::Critical); } پیش اطلاعات فنی انجین : سِل Cell رابط کاربری: JavaScript، QML و فناوری Qt Quick کتابخانه‌ها : STL, OpenSSL, Curl و Qt سمت سرور: Php7.2 و MySQLi MariaDB (در آینده همین بخش رو هم احتمالاً با ++C توسعه بدم). رابط‌های برنامه‌نویسی: Restful Api v.1.0 در قالب JSon نسخهٔ فعلی: ۰.۵ آلفا پلتفرم‌های پشتیبانی دسکتاپ : Windows, macOS, Linux پلتفرم‌های پشتیبانی موبایل و تبلت : iOS, Android, iPadOS معرفی در آی‌او‌استریم نسخهٔ فعلی توسعه یافته : ۰.۵.۳۴۳.۰ ریلیز شده در سه حالت Normal, OpenGLEs و Software Mode هدف از این روش ریلیز این هست که سیستم‌هایی که دارای کارت گرافیکی ضعیف‌تر و یا بدون نصب کارت گرافیک و درایور آن هستند را تحت پوشش دهیم، بنابراین نسخهٔ Software Mode تنها مناسب برای سیستم‌های اداری و مشابه آن هستند که عموماً خبری از کارت گرافیکی و یا درایور‌های نصب شده بر روی آن‌ها نیست دوستان توجه داشته باشند که برای بازخورد‌ها و اعلام نظرات توسعه حتماً از مُد اجرای برنامه‌ٔ خودشون و نوع سیستم‌عامل و شرایط سخت‌افزاریشون مطلع باشند تا بتونیم به درستی مشکلات احتمالی را حل کنیم. در ادامه بعد از نظر نسخهٔ آلفا شروع به بررسی و حل مشکلات احتمالی در مسیر توسعه خواهیم کرد.
  6. ابزار Android NDK به عنوان مجموعه‌از ابزار‌هایی است که به شما امکان آن را می‌دهد تا بخشی از برنامه‌های خود را به صورت بومی تحت زبان C و ++C توسعه دهید. بنابراین NDK از چندین کتابخانه‌ی در زمان اجرای ++C پشتیبانی می‌کند؛ در این پست در رابطه با آخرین تغییرات مرتبط با NDK اطلاع رسانی می‌شود. public class MyActivity extends Activity { /** * Native method implemented in C/C++ */ public native void computeFoo(); } بر اساس آخرین تغییرات کتابخانه‌های استاندارد libstdc++ به libc++ به‌روز رسانی و تمامی ویژگی‌های استاندارد C++17 پشتیبانی می‌شود که از نسخه‌ی R18 به بعد در دسترس قرار گرفته است. برخی از تغییرات مهم که لازم است به آن‌ها توجه شود به صورت زیر می‌باشند: تغییرات اساسی از نسخه‌ی NDK R17 آغاز شده است که در آن یکی از مهمترین و تکان‌ دهنده‌‌ترین تغیرات حذف GCC است که قرار بر این بود در نسخه‌های جدید NDK R18 پشتیبانی از GCC به صورت کامل حذف و Clang جایگزین آن شود. در نسخه‌ی R18 پشتیبانی از gnustl, gabi++و stlport حذف شده است. پشتیبانی از ICS از اندروید‌های ۱۴ و ۱۵ به بعد حذف شده است. بر اساس قوانی جدید گوگل، بار‌گذاری اپلیکیشن از تاریخ آگوست ۲۰۱۹ به بعد در فروشگاه گوگل پلی (Play Store) نیازمند نسخه‌ی معماری ۶۴ بیتی می‌باشد. پشتیبانی از C++17 در نسخه‌ی R18 به بعد تایید نهایی و قابل استفاده شده است و همچنین در نسخه‌های R19 استفاده از تمامی استاندارد‌های منسوخ شده پیشنهاد نمی‌شود. کلمات کلیدی new و delete در استاندارد جدید ++C از نسخه‌ی R18 منسوخ و در نسخه‌ی R19 به طور کامل حذف خواهند شد. پشتیبانی از مدیریت‌های استثناء (RTTI) در NDK به صورت پیش‌فرض غیر فعال می‌شود. مانند استثنائات، RTTI در libc++ پشتیبانی می‌شود، اما به صورت پیشفرض در android-build غیرفعال شده است که برای فعال‌سازی آن‌ می‌توانید از cmake و دیگر ابزار‌ها استفاده کنید. هیچ محدودیتی در رابطه با هِدر‌های سی‌پلاس‌پلاس در اندروید وجود ندارد. برای فعال سازی RTTI در برنامه‌ی شما در ndk-build کد زیر را در application.mk اضافه کنید: APP_CPPFLAGS := -frtti همچنین برای فعال سازی آن برای یک ماژول خاص در ndk-build کد دستوری زیر را استفاده کنید: LOCAL_CPP_FEATURES := rtti روش دیگر به صورت زیر است: LOCAL_CPPFLAGS := -frtti نکته: تحت این سند ویژگی‌های سیستمی STL در آینده حذف خواهند شد. توجه: libc++ یک کتابخانه‌ی سیستمی نیست. در صورتی که از libc++_shared.so استفاده می‌کنید باید آن را در داخل فایل apk خود قرار دهید. در صورتی که از Gradle استفاده می‌کنید این کار به صورت خودکار انجام می‌شود.
  7. بهنام صباغی

    QCustomPlot

    نگارش 2.0.1

    9 دریافت

    QCustomPlot یک کتابخانه ویجت کیوت سی پلاس پلاس است که هیچ پیش‌نیاز بیشتری ندارد و به خوبی مستند شده است. این کتابخانه تمرکز بر انتشار گراف و نمودارهای دو بعدی سنگین دارد و با بهره‌وری عالی خود انتخاب خوبی برای مجسم‌سازی بی‌درنگ است. نگاهی به آموزش راه اندازی و آموزش مقدماتی نمودار بندازید.

    رایگان

  8. با سلام. در حال یادگیرQt و Thread ها بودم که به مشکل دسترسی به متغیر در Thread بر خوردم. کلاس زیر از QThread مشتق شده است : #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QWidget> #include <QThread> #include <QMutex> class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); void run() override; bool Stop; signals: void NumberChanged(int); }; #endif // MYTHREAD_H #include "mythread.h" MyThread::MyThread(QObject *parent) : QThread (parent) { } void MyThread::run() { for(int i=0; i<100000000 ; ++i){ QMutex mutex; mutex.lock(); if (this->Stop) break; mutex.unlock(); emit NumberChanged(i); this->msleep(100); } } داخل فرم خودم دو QPushBotton و یک QLabel دارم. که یکی از دکمه‌ها (QPushButton) وظیفه اجرای یک QThread را دارد و یکی دیگه باعث متوقف کردن کار QThread ایجاد شده : #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog){ ui->setupUi(this); mThread = new MyThread(this); connect(mThread,SIGNAL(NumberChanged(int)),this,SLOT(onNumberChanged (int))); } Dialog::~Dialog(){ delete ui; } void Dialog::onNumberChanged(int Number){ ui->label->setText(QString::number(Number)); } void Dialog::on_pushButton_clicked(){ mThread->start(); } void Dialog::on_pushButton_2_clicked(){ mThread->Stop = false; } در کد بالا زمانی‌که on_pushButton_clicked فراخوانی شد. QThread را اجرا میکند. و در مقابل زمانی‌که on_pushButton_2_clicked فراخوانی شد. متغیر bool MyThread::Stop را برابر مقدار false میگذارد که باعث از بین رفتن عملیات QThread ایجاد شده میشود. اما در اصل هیچ تفاوتی ایجاد نمیکند ؟ و زمان بستن برنامه با خطای لاگ زیر برخورد میکنم : 21:39:20: Starting /tmp/untitled/build-untitled-Desktop_Clang_7_0_0-Debug/untitled... QThread: Destroyed while thread is still running 21:39:32: The program has unexpectedly finished. 21:39:32: The process was ended forcefully. 21:39:32: /tmp/untitled/build-untitled-Desktop_Clang_7_0_0-Debug/untitled crashed. کجای کار اشتباه شده است ؟
  9. با سلام. درحال بررسی کدهای کتابخانه‌های استاندارد سی‌پلاس‌پلاس بودم ، که متوجه موردی شدم ؛ تقریبا بیشتر توابع و کلاس‌هایی که از کتابخانه‌های استاندارد استفاده میکنیم دارای مقدار زیادی وابستگی به توابع و فایل‌های دیگر دارند. برای مثال تابع std::swap که برای جابه‌جایی دو نوع استفاده میشود به این‌صورت میباشد : template<typename _Tp, size_t _Nm> inline typename std::enable_if<__is_swappable<_Tp>::value>::type swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]) noexcept(std::__is_nothrow_swappable<_Tp>::value) { for (size_t __n = 0; __n < _Nm; ++__n) swap(__a[__n], __b[__n]); } که برای کامپایل نیاز به این موارد در دو فایل move.h و type_traits دارند : template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; constexpr operator value_type() const noexcept { return value; } #if __cplusplus > 201103L #define __cpp_lib_integral_constant_callable 201304 constexpr value_type operator()() const noexcept { return value; } #endif }; template<bool __v> using __bool_constant = integral_constant<bool, __v>; typedef integral_constant<bool, true> true_type; typedef integral_constant<bool, false> false_type; template<bool, typename _Tp = void> struct enable_if { }; namespace __swappable_details { using std::swap; struct __do_is_swappable_impl { template<typename _Tp, typename = decltype(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))> static true_type __test(int); template<typename> static false_type __test(...); }; struct __do_is_nothrow_swappable_impl { template<typename _Tp> static __bool_constant< noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>())) > __test(int); template<typename> static false_type __test(...); }; } template<typename _Tp> struct __is_swappable_impl : public __swappable_details::__do_is_swappable_impl { typedef decltype(__test<_Tp>(0)) type; }; template<typename _Tp> struct __is_swappable : public __is_swappable_impl<_Tp>::type { }; template<typename _Tp> struct __is_nothrow_swappable_impl : public __swappable_details::__do_is_nothrow_swappable_impl { typedef decltype(__test<_Tp>(0)) type; }; template<typename _Tp> struct __is_nothrow_swappable : public __is_nothrow_swappable_impl<_Tp>::type { }; خب ! سوال اول بنده اینجاس که در چنین مواردی ، بهتر نیست که تابعstd::swap را با توجه به نیازی که داریم خودمان پیاده‌سازی کنیم ؟ و اینکه آیا این حجم از کد و استفاده از template ها هزینه پِرفُورْمَنْس زیادی ندارد ؟ و سوال دوم : تمام این کدها در دو فایل move.h و type_traits قرار دارد (که مسلماً این فایل ها هم وابستگی‌های دیگری به دیگر فایل‌ها دارند). آیا ما نمی‌توانیم مثلا فقط تابع std::swap را در برنامه‌ی خود فراخوانی کنیم که این حجم از کد احتیاج به کامپایل نداشته باشد ؟ برای نمونه در زبان برنامه‌نویسی پایتون ، با استفاده از دستور import ما یک ماژول را وارد برنامه میکنیم : import time در این روش تمام ماژول time به فایل‌ما اضافه خواهند شد. درصورتی که ما فقط از ماژول time نیاز به تابع sleep داشته باشیم کافی است که از قابلت from ... import ... استفاده کنیم : from time import sleep آیا این حرکت در C++ نیز امکان‌پذیر هست ؟
  10. با سلام ! آیا برنامه ها به صورت خودکار در حالت Multi Threading اجرا میشوند ؟ بنده قطعه کد زیر را کامپایل و اجرا گرفته ام : main.cpp #include <iostream> int main(void){ constexpr double long AnotherIndex = 999999999999999999; for(double long index=0;index <= AnotherIndex;++index){ std::cout << index << std::endl; } return 0x0000; } بعد از اجرا ، خروجی برنامه ی htop به اینصورت بود : 1 [|||||||||||||||||||||| 71.9% ] Tasks: 166, 738 thr; 4 running 2 [||||||||||||||||||| 60.30%] Load average: 2.94 1.88 1.61 3 [||||||||||||||||||||||| 74.1% ] Uptime: 04:50:24 4 [|||||||||||||||||| 56.6% ] Mem[||||||||||||||||||||||||2.76G/3.71G] Swp[||| 790M/7.99G] PID USER PRI NI VIRT PES SHR S CPU% MEM% TIME+ Command 18991 ghasem 20 0 5616 1692 1544 R 89.1 0.0 1:13.01 /tmp/Opt/main یعنی زمان اجرای این برنامه هر چهار هسته ی پردازنده درگیر خواهد شد ! ... آیا کامپایلر به صورت خودکار متناسب با پردازش Multi Threading کد را کامپایل میکند ؟ یا اینکه این‌کار به عهده سیستم عامل می‌باشد ؟
  11. با سلام. بنده خروجی کد اسمبلی تولید شده Struct و Class را بررسی کردم ظاهرا که خروجی یکسانی دارند ! آیا واقعا دیگر تفاوتی بین کلمه‌کلیدی struct و class در سی‌پلاس‌پلاس نیست ؟ struct.cpp struct AnotherType{ public : int StructType; }; int main(){ AnotherType Object; return 0; } class.cpp class AnotherType{ public : int ClassType; }; int main(){ AnotherType Object; return 0; } و خروجی های اسمبلی تولید شده : struct.cpp [ghasem@clibcore test]$ g++ -S struct.cpp -o Struct && cat Struct .file "struct.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits class.cpp [ghasem@clibcore test]$ g++ -S class.cpp -o Class && cat Class .file "class.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits و برای اطمینان خروجی حاصل از دستور diff Struct Class : [ghasem@clibcore test]$ diff Struct Class 1c1 < .file "struct.cpp" --- > .file "class.cpp"
  12. کامبیز اسدزاده

    همانطور که می‌دانید کتابخانه‌ی بوست یکی از بهترین کتابخانه‌های 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 ادامه خواهد داشت...
  13. خلاصه تعریفی از زبان برنامه نویسی سی‌پلاس‌پلاس (C++) با توجه به پیشرفت و توسعه‌ی زبان‌های برنامه‌نویسی، به ویژه ظهور زبان‌های جدید که جهت حل مشکلات زبان‌های موجود و یا با هدف ایجاد انقلاب و یا سهولت برنامه‌نویسی، یکی از سوألاتی که مدام به ذهن می‌آید این است که چه زبانی را باید انتخاب کرد که از لحاظ بُعد علمی، اقتصادی و فنی بهترین انتخاب باشد تا با یک خیال راحت به یادگیری آن بپردازیم. در این مقاله به مزایای این زبان نسبت به دیگر زبان‌ها و همچنین چشم‌اندازی از آینده‌ی زبان اشاره شده است؛ سی‌پلاس‌پلاس به عنوان قدرتمند‌ترین زبان برنامه‌نویسی تا به کنون است که به جرأت می‌توان گفت به عنوان یک زبان برنامه‌نویسیِ غالب بر دیگر زبان‌های برنامه‌نویسی لقب «هیولای زبان‌های برنامه‌نویسی» را به خود اختصاص می‌دهد. با توجه به ساختار و نقشه‌ی راه توسعه‌ی خود، هنوز هم به عنوان یکی از پر طرفدار‌ترین و پر کاربرد‌ترین زبان‌های برنامه‌نویسی ساخت دست بشر به شمار می‌رود. آیا تا به حال فکر کرده‌اید که یک جهان پیشرفته‌ی متکی به فناوری امروز، وابسته‌ی چه چیز‌هایی است و موتور نامرئی آن چیست؟ اخیراً دانشمند بزرگ، همچنین سازنده‌ی زبان سی++ «بیارنه استراس تروپ» در یک سخنرانی ۱ دقیقه‌ای به معرفی موتور نامرئی جهان پرداخته است که در این لینک می‌توانید از زبان او بشنوید. سی‌پلاس‌پلاس با قابلیت‌های انواع داده ایستا، نوشتار آزاد، چندمدلی، معمولاً زبان ترجمه شده با پشتیبانی از برنامه‌نویسی ساخت‌‌یافته، برنامه‌نویسی شیءگرا، برنامه‌نویسی جنریک است. C++ به همراه جد خود C از پرطرفدارترین زبان‌های برنامه‌نویسی تجاری هستند بنا بر این در زیر فلسفه‌ای از این زبان را بیان می کنیم: زبانC++ طراحی شده‌است تا یک زبان عمومی با کنترل نوع ایستا و همانند C قابل حمل و پربازده باشد. زبانC++ طراحی شده‌است تا مستقیماً و بصورت جامع از چندین شیوه برنامه‌نویسی (برنامه‌نویسی ساخت‌یافته، برنامه‌نویسی شی‌گرا، انتزاع داده، و برنامه‌نویسی جنریک) زبانC++ طراحی شده‌ است تا به برنامه‌نویس امکان انتخاب دهد حتی اگر این انتخاب اشتباه باشد. زبانC++ طراحی شده‌ است تا حداکثر تطابق با C وجود داشته باشد و یک انتقال راحت از C را ممکن سازد. زبانC++ از بکاربردن ویژگی‌های خاص که مانع از عمومی شدن است خودداری می‌نماید. زبانC++ از ویژگی‌هایی که بکار برده نمی‌شوند استفاده نمی‌کند. زبانC++ طراحی شده‌است تا بدون یک محیط پیچیده عمل نماید. کتابخانه‌ها چه چیزی هستند و در این زبان چگونه است؟ به مجموعه‌های یکپارچه‌ای از کلاس‌های پیاده سازی شده (به صورت فایل‌های سرآیند با پیاده سازی‌های کد یا اشیای زبان ماشین) که برای برنامه‌نویسی به کار می‌روند، یک کتابخانه C++ گفته می‌شود و یکی از ویژگی‌های بارز آن تولید و دسترسی به کتابخانه‌های بی‌شمار است. لیستی از این کتابخانه‌های همراه با توضیحات در لینک زیر آمده است : A list of open source C++ libraries - cppreference.com لیست کامل انواع کامپایلر‌ها : List of compilers - Wikipedia ویژگی‌های جدید در ویرایش ۱۱، ۱۴، ۱۷ و ۲۰ چیست؟ زبان C++11 (معروف به C++0x) یک نسخه استاندارد از زبانC++ است که در ۱۲ آگوست ۲۰۱۱ منتشر و توسط ISO جایگزین C++03 شد این نسخه دارای نشان ISO/IEC 14882:2011 می باشد و در تاریخ ۱۸ آگوست ۲۰۱۴ نسخه جدید آن یعنی C++14 منتشر و جایگزین C++11 شد. امکانات اضافه شده به هسته C++ : یکی از وظایف کمیته استاندارد سازی توسعه هسته زبان است.در توسعه فعلی چندین بخش از زبان بهبود یافته که شامل چندنخی (multithreading) ، پشتیبانی از برنامه‌نویسی عمومی، مقدار دهی اولیه یکنواخت و پیشرفت عملکرد میباشد. ویژگی‌های هسته زبان و تغییرات آن به چهار بخش کلی دسته بندی شداند : 1. پیشرفت در عملکرد زمان اجرا (Run-Time) 2. پیشرفت در عملکرد زمان ساخت (Build-Time) 3. پیشرفت در ویژگی ها (قابلیت استفاده) 4. و قابلیت های جدید ویرایش C++‎‎‎‎‎‎‎‎‎‎‎ 14 بر روی اشکال‌زدائی و بهبودهای جزیی استاندارد قبلی یعنی C++‎‎‎‎‎‎‎‎‎‎‎11 تمرکز کرده است؛ این زبان در تاریخ ۱۵ می ۲۰۱۳ منتشر و در ۱۵ آگوست ۲۰۱۴ بعد از رای گیری و انجام تغییراتی جزئی استاندارد این زبان منتشر شد. بدلیل این که عموماً تاریخ انتشار این زبان بطور قابل ملاحظه‌ای دیر هنگام بوده است به C++‎‎‎‎‎‎‎‎‎‎‎14 گاهی C++‎‎‎‎‎‎‎‎‎‎‎1y نیز گفته می‌شود. همانند استاندارد C++‎‎‎‎‎‎‎‎‎‎‎11 که به آن C++‎‎‎‎‎‎‎‎‎‎‎0x گفته می‌شده و قرار بر این بوده که قبل از ۲۰۱۰ منتشر شود (البته تا سال ۲۰۱۱ انتشار به تعویق افتاد). گرچه تمامی کامپایلر‌ها درحال کاربروی C++‎‎‎‎‎‎‎‎‎‎‎14 هستند اما هنوز تمامی آن ها ازC++‎‎‎‎‎‎‎‎‎‎‎ 14 پشتیبانی نمی‌کنند. در C++‎‎‎‎‎‎‎‎‎‎‎11 و C++‎‎‎‎‎‎‎‎‎‎‎14 توابع جدیدی به هسته اصلی زبان و کتابخانه استاندارد آن اضافه شده است که شامل بسیاری از کتابخانه‌های C++‎‎‎‎‎‎‎‎‎‎‎TR1 به استثنای کتابخانه‌ی توابع ریاضی ویژه می‌باشد. ویژگی‌های اضافه شده کتابخانه در ویرایش ۱۱ std::move std::forward std::to_string type traits smart pointers std::chrono tuples std::tie std::array unordered containers std::make_shared memory model ویژگی‌های اضافه شده به زبان در ویرایش ۱۱ move semantics variadic templates rvalue references initializer lists static assertions auto lambda expressions decltype template aliases nullptr strongly-typed enums attributes constexpr delegating constructors user-defined literals explicit virtual overrides final specifier default functions deleted functions range-based for loops special member functions for move semantics converting constructors explicit conversion functions inline-namespaces non-static data member initializers right angle brackets ویژگی‌های اضافه شده به کتابخانه در ویرایش ۱۴ user-defined literals for standard library types compile-time integer sequences std::make_unique ویژگی‌های اضافه شده به زبان در ویرایش ۱۴ binary literals generic lambda expressions lambda capture initializers return type deduction decltype(auto) relaxing constraints on constexpr functions variable templates ویژکی‌های اضافه شده به کتابخانه در ویرایش ۱۷ std::variant std::optional std::any std::string_view std::invoke std::apply splicing for maps and sets ویژگی‌های اضافه شده به زبان در ویرایش ۱۷ template argument deduction for class templates declaring non-type template parameters with auto folding expressions new rules for auto deduction from braced-init-list constexpr lambda lambda capture this by value inline variables nested namespaces structured bindings selection statements with initializer constexpr if utf-8 character literals direct-list-initialization of enums ویژگی‌های اضافه شده به زبان در ویرایش ۲۰ concepts designated initializers (based on the C99 feature) [=, this] as a lambda capture template parameter lists on lambdas three-way comparison using the "spaceship operator", operator <=> initialization of an additional variable within a range-based for statement lambdas in unevaluated contexts default constructible and assignable stateless lambdas allow pack expansions in lambda init-capture string literals as template parameters atomic smart pointers (such as std::atomic<shared_ptr<T>> and std::atomic<weak_ptr<T>>) removing the need for typename in certain circumstances new standard attributes [[no_unique_address]] [[likely]] and [[unlikely]] calendar and time-zone additions to <chrono> std::span, providing a view to a contiguous array (analogous to std::string_view but span can mutate the referenced sequence) <version> header feature test macros bit-casting of object representations, with less verbosity than memcpy() and more ability to exploit compiler internals conditional explicit, allowing the explicit modifier to be contingent on a boolean expression constexpr virtual functions ranges (The One Ranges Proposal) concept terse syntax constexpr union, try and catch dynamic_cast and typeid, std::pointer_traits various constexpr library bits immediate functions using the new consteval keyword signed integers are now defined to be represented using two's complement (signed integer overflow remains undefined behavior) a revised memory model coroutines – already experimentally supported in Clang 5 modules – experimentally supported in Clang 5 and Visual Studio 2015 Update 1 as well as GCC various improvements to structured bindings (interaction with lambda captures, static and thread_local storage duration) contracts have been removed (see list of features deferred to a later standard) use of comma operator in subscript expressions has been deprecated constexpr additions (trivial default initialization, unevaluated inline-assembly) using scoped enums various changes to the spaceship-operator DR: minor changes to modules constinit keyword changes to concepts (removal of -> Type return-type-requirements) (most of) volatile has been deprecated DR: [[nodiscard]] effects on constructors The new standard library concepts will not use PascalCase (rather standard_case, as rest of standard library) text formatting (chrono integration, corner case fixes) bit operations constexpr INVOKE math constants consistency additions to atomics (std::atomic_ref<T>, std::atomic<std::shared_ptr<T>>) add the spaceship (<=>) operator to the standard library header units for the standard library synchronization facilities (merged from: Efficient atomic waiting and semaphores, latches and barriers, Improving atomic_flag, Don't Make C++ Unimplementable On Small CPUs) std::source_location constexpr containers (std::string, std::vector) std::stop_token and joining thread (std::jthread) Many new keywords added (and the new "spaceship operator", operator <=>), such as concept, constinit, consteval, co_await, co_return, co_yield, requires (plus changed meaning for export), and char8_t. And explicit can take an expression since C++20. (Most of) the use for the volatile keyword has been deprecated. C++ has added a number of attributes over the years, including new in C++20, [[likely]] and [[unlikely]]; and [[no_unique_address]]. etc... کتابخانه‌های استاندارد چیست و در نسخه‌های جدید چگونه در دسترس هستند؟ در زبان برنامه‌نویسیC++ کتابخانه‌ی استاندارد سی++ مجموعه‌ای از کلاس‌ها و رویه‌ها است که در هسته زبان نوشته شده‌اند و قسمتی از استاندارد ISO سی++ می‌باشند. در سال ۱۹۹۸ استانداردC++ شامل دو بخش هسته زبان و کتابخانه استاندارد C++ است. این کتابخانه شامل بیشتر بخش‌های STL و کتابخانه استاندارد C است. بیشتر کتابخانه‌هایC++ در استاندارد وجود ندارند و یا استفاده از تعریف قابلیت پیوند کتابخانه‌ها را می‌توان در زبان‌هایی مانند فرترن، C، پاسکال، بیسیک نوشته شوند. البته با توجه به ویژگی‌های کامپایلر مشخص خواهد شد که کدام زبان را می‌توان استفاده نمود. کتابخانه‌ی استانداردC++ شامل کتابخانه استاندارد C با یک سری تغییرات برای بهبود عملکرد است. بخش بزرگ بعدی این کتابخانه STL است. STL شامل ابزار بسیار قدرتمندی مانند نگه‌دارنده‌ها (مانند vector و list)، تکرارکننده‌ها (اشاره‌گرهای عمومی شده) برای شبیه‌سازی دسترسی مانند آرایه الگوریتم‌هایی برای جستجو و مرتب‌سازی در آنها وجود دارند. نقشه‌ها (نقشه‌های چندگانه) (آرایه شرکت‌پذیر) و مجموعه‌ها (مجموعه‌های چندگانه) واسط‌های عمومی فراهم می‌سازند. در نتیجه با استفاده از قالب تابع، الگوریتم‌های جنریک با هر نگه‌دارنده و دارای تکرارکننده عمل نماید. همانند C ویژگی‌های کتابخانه را می‌توان با استفاده از شبه دستور include# شامل یک سرآیند استاندارد اضافه نمود. C دارای ۶۹ کتابخانه استاندارد است که ۱۹ تا از آنها نامناسب تشخیص داده شده‌اند. استفاده از کتابخانه‌ی استاندارد - مانند std::vector یا std::string به جای آرایه‌های C موجب ایجاد برنامه‌های مطمئن‌ تر شده‌ است. STL در آغاز محصولی جداگانه از HP و سپس SGL پیش از ادغام در کتابخانه استانداردC++ بوده‌است. استاندارد عبارت STL را بکار نمی‌برد بلکه آن را بخشی از کتابخانه می‌داند اما مردم هنوز هم آن را برای جداسازی بخش‌های مختلف کتابخانه با این نام بکار می‌برند. (جریان‌های ورودی/خروجی، جهانی‌سازی، تشخیص، زیرمجموعه کتابخانه C) بیشتر کامپایلرها کتابخانه استاندارد و STL را پیاده‌سازی می‌نماید. پیاده‌سازی‌های مستقلی نیز همانند STLport نیر وجود دارند. پروژه‌های دیگر نیز پیاده‌سازی‌های خود را از STL با توجه به اهداف خود بوجود می‌آورند. روش جدیدی جناب بیجارن در نظر گرفته که کتابخانه های استانداردC++ علاوه بر اینکه توسط خود کامپایلرها در دسترس و قابل استفاده هستش بلکه توسط کتابخانه STL و Boost نیز می توان دسترسی به مجموع عظیمی از کتابخانه ها استاندارد ISO داشت. ساختار فایل‌ها در این زبان چگونه است؟ در رابطه با ساختار برنامه های نوشته شده توسطC++ بدانید که منظور از ساختار در اینجا انواع فایل های موجود در زبان C++ است، در این رابطه باید اینگونه اشاره کنیم که در این زبان ما می توانیم از فایل های زیر برای برنامه نویسی استفاده کنیم. فایل با پسوند .c این فایل منبعی برای کد هایی از نوع زبان C هستند. فایل با پسوند .c++ منبعی برای کد هایی از نوع زبان C وC++ هستند ضعف این نوع فایل در قابل حمل نبودن و عدم شناسایی توسط فایل سیستم ها می باشد. فایل با پسوند .cxx منبعی برای کد هایی از نوع زبان C وC++ هستند با تفاوت اینکه نسبت به فایل .c++ قابل حمل تر است. فایل با پسوند .cpp منبعی برای کد هایی از نوع زبان C وC++ هستند یعنی در هر دو نیز قابل استفاده می باشند. این پسوند با تمامی سیستم ها سازگاری دارد و بسیار رایج است. فایل با پسوند .hxx معمولا فایل با عنوان (هدر/سرصفحه) یاد می شوند و معمولا فقط حاوی اعلان ها می‌باشند. فایل با پسوند .hpp معمولا فایل با عنوان (هدر/سرصفحه) یاد می شوند و معمولا فقط حاوی اعلان ها می‌باشند. این فرمت توسط مارس دیجیتال استفاده می شود. همچنین بورلند و دیگر کامپایلر های سی++ از آن پشتیبانی می‌کنند. ممکن است در این فایل متغیر ها، ثوابت و توایعی که در فایل سورس اصلی به آن ها اشاره شده است اعلام شود. فایل با پسوند .h معمولا فایل با عنوان (هدر / سر صفحه) یاد می‌شوند و معمولا فقط حاوی اعلان ها می‌باشند این نوع بسیار رایج است و تقریبا با تمامی سیستم ها سازگاری دارد. فایل با پسوند .hh در این زبان : فایل با عنوان (هدر / سر صفحه) یاد می شوند و معمولا فقط حاوی اعلان ها می‌باشند. فایل با پسوند .h++ در این زبان : این نوع فایل ها معمولا فایل با عنوان (هدر/ سرصفحه) یاد می شوند و معمولاً فقط حاوی اعلان ها میباشند. ضعف این نوع فایل در قابل حمل نبودن و عدم شناسایی توسط فایل سیستم ها می‌باشد. یک فایل سرآیند با پسوند (.h, .hpp و ...) می‌تواند شامل محتوای زیر باشد: تعریف کلاس تعریف توابع درون خطی (Inline) اعلام تابع اعلام شیء مثال: #ifndef CPPFILES_H #define CPPFILES_H extern int status; class CPPFiles { public: CPPFiles(); void myFunction(); inline int safe(int i); }; #endif // CPPFILES_H یک فایل منبع - سورس با پسوند (.c, .hpp، .cxx و ...) می‌تواند شامل محتوای زیر باشد: تعریف کلاس تعریف توابع اعلام شیء مثال : #include "cppfiles.h" int status = 1; CPPFiles::CPPFiles() { } void CPPFiles::myFunction() { //Do somthing... } int CPPFiles::safe(/*@Param*/) { return /*Somthing...*/; } انواع فایل هایی که به آنها اشاره شد بسیار است ولی متناسب با محبویت و پشتیبانی کامپایلر ها از این فایل ها در این زبان برای انتخاب آنها مهم است بنا بر این در طی آموزش و تمامی مراحل ما فقط از فایل های .h برای هدر و فایل های .cpp برای منابع استفاده خواهیم کرد. چرا و چه زمانی باید از فایل های hpp. و چه زمانی از فایل های cpp. استفاده کنیم؟ توجه داشته باشید که سی‌پلاس‌پلاس از تمامی پسوند فایل‌های مذکور پشتیبانی می‌کند، معمولاً استفاده از فایل‌های hpp و h جهت اعلان و تعریف‌های اولیه‌ی کد‌ها مناسب است و در زمان تعریف کامل عملکرد کد مورد نظر فایل با پسوند cpp پیشنهاد می‌شود. هرچند استفاده‌ی غیر استاندارد نیز پشتیبانی می‌شود اما باید توجه داشت جهت حفظ ساختار استاندارد روش‌های اصولی منطقی و صحیح هستند. کاربرد این زبان در کجاست؟ معمولاً تمامی برنامه‌ها و نرم‌افزار‌هایی که به صورت روزمره در زندگی مدرن امروزی مشاهده می‌کنیم بدون شک توسط زبان های اساسی نوشته شده‌اند. به عنوان مثال انواع صنایع موجود در کشور‌ها از قبیل صنعت خودرو‌سازی، صنعت فضایی، سیستم‌های معماری و بانکی ، تجهیزات مدرن و سخت‌افزار‌های رباتیک، سیستم‌های کامپیوتری و یا کنسول های‌بازی ، سیستم‌های خانگی و یا هوش‌ مصنوعی‌، تجهیزات مجهز به انواع حسگر‌ها، پزشکی، فضایی، زبان‌های برنامه‌نویسی، سیستم‌عامل‌ها و بسیاری از موارد دیگری که می‌توان نام برد بدون شک توسط این زبان پیاده‌ سازی شده‌اند. چگونه C++ می‌تواند در لایه های زیرین و بالا مورد استفاده قرار بگیرد؟ پاسخ این سوال بسیار واضح است، زیرا این زبان به عنوان سطح بالا اما با قابلیت مانور در سطوح پایین نیز مورد استفاده قرار بگیرد. به عنوان مثال حتی می‌توان توسط آن کد‌های اسمبلی نوشت و دستورات C که معمولا در لایه‌های زیرین به صورت سیستمی مورد نیاز هستند استفاده کرد. آیا سیستم عامل ها و نرم افزار های مطرح دنیا توسط این زبان نوشته شده اند؟ دلیل آن چیست؟ همانگونه که مشخص است بسیاری از سیستم عامل ها از ابتدا توسط خانواده اسمبل ، C نوشته شده اند که به صورت زیر به تعدادی از آن ها اشاره می‌کنیم : DragonFlyBSD,FreeBSD,OpenBSD,NetBSD HP-UX Centos,Debian,Fedora,OpenSUSE,RedHat,Ubuntu OSX,iOS,Darwin OracleSolaris,OpenIndiana Cygwin Android Windows Phone BlackBerry WindowsXP,Vista,7,8,10 دلیل آن که از زبان هایی مانند C وC++ برای نوشتن سیستم‌عامل استفاده می‌شود قابلیت های مهم آن است به عنوان مثال: کارآیی بالا ، مستقل از سکو‌، زبان پاسه و غالب بودن و عدم وابستگی آن به زبان های دیگر، ارتباط با سخت‌افزار و تمامی دیوایس‌ها، مدیریت هوشمندانه و همچنین برنامه‌نویسی آزادانه ، دسترسی به لیست عظیمی از کتابخانه‌ها که می‌توان توسط آن ها هر چیزی را که در رویاهای خود به آن فکر می‌کنید در واقعیت خلق کنید. انواع سخت افزارهایی که این زبان پشتیبانی می‌کند: زبان برنامه‌نویسی سی‌پلاس‌پلاس با استفاده از کامپایلر‌های قدرتمندی چون GCC، Clang و غیره، طیف گسترده‌ای از سخت‌افزار‌ها و معماری‌ها را پشتیبانی می‌کند. مدل ماشین هایی که پشتیبانی می‌شود : PowerPC , Oracle,Fujitsu,Sun, IBM,Freescale , AMD,Intel مدل پردازنده ها : Athlon,Atom,Core,Core2,Corei3/i5/i7,Opteron,Pentium,Phenom,Sempron,Turion,etc Itanium,Itanium2,Itanium29000/9100/9300,etc PowerPC,POWER1/2/3/4/5/6/7,G1,G2,G3,G4,G5,etc UltraSPARCI/II/III/IV/T1/T2,SPARCT3/T4,etc کاربرد این زبان در زمینه وب چگونه است‌؟ در این زمینه معمولاً به دلیل وجود چهارچوب‌ها و زبان‌های ساده‌تری نسبت به سی‌++ در حوزه‌ی وب مانند Php و غیره...، معمولاً فرصت نشده است تا به شناخت کتابخانه‌ها و مزایای این زبان در این حوزه پرداخته شود. با توجه به توسعه‌های اخیر صنعت وب دانشمندان به این نتیجه رسیده‌اند که جهت افزایش کارایی در زمینه‌ی وب و از بین بردن محدودیت‌های وابسته به مرورگر‌های اینترنتی، از فناوری‌های بهتری مانند wasm نیز پرده برداری شود که در این فناوری سی‌++ گزینه‌ی پشت پرده‌ای از این فناوری محسوب می‌شود که اجازه می‌دهد با اجرای کد‌ها و دسترسی به رابط‌های برنامه‌نویسی پیشرفته یک دنیای جدیدی از فناوری وب را ارائه کند. این فناوری با عنوان Web Assembly شناخته می‌شود که اجازه می‌دهد برنامه‌های نوشته شده توسط سی‌++ در مرورگر به عنوان یک پلتفرم جدید اجرا شوند. البته این تنها روش نیست، سی++ به لطف کتابخانه‌های عظیم خودش قادر است هر چیزی را در اختیار برنامه‌نویس قرار دهد. به عنوان مثال دسترسی به کتابخانه‌های عظیم Qt، Wt این امکان را فراهم می‌کنند که به راحتی یک سیستم ابر پیشرفته‌ی تحت وب را به کمک این زبان پیاده سازی کنید که هیچ نوع سیستم موجود در وب قابل رقابت و مقایسه با ویژگی‌ها و نتایج خارق‌العاده‌ی آن نخواهد داشت. در مثال زیر یک سیستم مدیریت محتوا به صورت آزمایشی پیاده سازی شده است که می‌توانید نتایج خارق‌العاده‌ی آن را مشاهده کنید. همچنین توجه کنید که این تنها کاربرد سی++ در وب نیست، حقیقت آن است که وب‌سایت‌های بزرگی همچون فیس‌بوک، گوگل و غیره هسته‌ی وب‌سایت‌های خود را توسط این زبان توسعه داده‌اند که دلایل آن‌ها مصرف بهینه‌ی تجهیزان سخت‌افزاری و دسترسی به ویژگی‌های سیستمی بسیار زیاد و امنیت بسیار بالا است. احتمالاً در رابطه با موتور قدرتمند v8 Engine شنیده‌اید، این یک موتور اساسی برای محصولات گوگل است که کاملاً تحت سی++ توسعه یافته است. برخی از محیط‌های برنامه‌نویسی مانند Node.JS تحت آن قدرت گرفته‌اند. برخی از محصولات اساسی و معروف که بخش عمده و یا به صورت کامل توسط سی‌پلاس‌پلاس نوشته شده‌اند (این لیست تنها شامل برجسته‌ترین محصولات است) : سیستم‌عامل‌ها ویندوز مکینتاش لینوکس آی‌او‌اس اندروید مرورگر‌ها اُپرا فایرفاکس گوگل کروم مایکروسافت اِدج اپل سافاری نرم‌افزار‌های کاربردی و مهندسی تمامی محصولات قدرتمند Adobe مانند فوتوشاپ، افتر‌افکت و غیره... تمامی محصولات Autodesk مانند Maya، 3dsMax و Autocad مجازی‌ساز‌ها مانند Virtual Box و VMware محصولات مایکروسافت مانند Visual Studio و Office محصولات اپل مانند iTunes، Xcode و غیره... بازی‌ها و صنایع مرتبط توسعه‌ی کنسول‌های بازی Playstation و Xbox اکثر بازی‌های خارق‌العاده در سطح AAA پیام‌رسان‌ها تلگرام اسکایپ موتور‌های دیتابیس مانند MySQL و غیره... کتابخانه‌ها و ابزار‌های پیشرفته‌ی توسعه ابزار‌های مرتبط با فناوری‌های روز مانند Blockchain و غیره... زبان‌های برنامه‌نویسی مانند Swift و غیره... راه‌انداز‌ها و ابزار‌های قدرتمند AMD، Intel و NVIDIA Geforce و پلتفرم‌هایی مانند Cuda. و هزاران و میلیون‌ها ابزار و برنامه‌هایی که در زندگی روزمره با آن‌ها سرو کار داریم. اشاره ای بر انواع موتور های دیتابیس که توسطC++ پشتیبانی می‌شوند : SQL NoSQL SQLite MySQL Sybase Adaptive Server SQL Server Oracle PostgreSQL IBASE : Borland IBM DB2 متأسفانه به دلیل عدم اطلاع و شناخت کافی از حقایق این زبان، توصیه برای یادگیری زبان‌هایی مانند Java و #C و مشابه آن‌ها ممکن است بر اساس علاقه‌های فردی و تعصب باشد. بنابراین توصیه می‌شود حتماً در مورد تفاوت‌های ساختاری و مزایای زبان‌ها حتماً تحقیق شود. چگونه باید طراحی رابط کاربری را انجام دهیم؟ برای طراحی رابط گرافیکی ابتدا باید ذهن خود را از محیط VS و همچنین کنسول کنار بکشید لذا برای این کار کتابخانه های مخصوصی در نظر گرفته شده است به صورت زیر : FLTK nana WxWidgets OWLNext GTK+ glibmm gtkmm goocanvasmm libglademm libgnomecanvasmm webkitgtk flowcanvas evince Qt libdbusmenu-qt توسط این کتابخانه های می‌توان محیط‌های کاربری را فراهم ساخت. در این میان دو کتابخانه‌ی wxWidgets و Qt بسیار قدرتمند عمل کرده‌اند که بین این دو نیز Qt با قدرت بسیار زیادی از رقیب خود یعنی wxWidgets پیشی گرفته است و معمولاً پروژه‌هایی که در آن رابط‌کاربری خلاقانه (Creative) و مدرن مطرح است حرف از Qt به گوش می‌رسد (کیوت یک چهارچوب جامع جهت طراحی رابط‌های کاربری قدرتمند است). پیشنهادات ما استفاده از مقالات خارجی و منابع رسمی می‌باشد: http://en.cppreference.com/w Learn C++ https://www.learn-cpp.org Learn C++ (Introduction and Tutorials to C++ Programming) http://www.cplusplus.com نگاهی به کاربرد این زبان در بین فناوری‌های جدید! سی‌پلاس‌پلاس همچنین به عنوان یکی از قدرتمند‌ترین و محبوب‌ترین زبان‌های برنامه‌نویسی در دنیای فناوری شناخته می‌شود و در صنعت بلاک‌چین نیز یک قدرت غالب است. زبان شیء‌گرایی برای توسعه بلاک‌چین مناسب است، زیرا از همان اصول کپسوله‌سازی، انتزاع، چند‌ریختی و مخفی کردن داده‌ها استفاده می‌کند. به عنوان مثال بلاک‌چین از ویرایش‌های ناخواسته از داده‌ها جولوگیری می‌کند که به عنوان یکی از چهار زبان برنامه‌نویسی آینده دار می‌توان به آن اشاره کرد. همچنین توجه داشته باشید که فناوری‌های دیگری مانند مباحث Cross-Platform و رشد بسیار شدید فناوری IoT این زبان به عنوان یک زبان پیش‌تاز در این حوزه است که در کنار بسیاری از کاربرد‌های اساسی خود می‌توان به عنوان یک ابزار اساسی و کاربردی به آن در آینده‌ای که از همین حالا شروع شده است اشاره داشت. آیا با C++ می‌توان برنامه‌های موبایلی مانند Android , iOS و غیره را تولید کرد‌؟ پاسخ، بله! متأسفانه این مورد هم مانند حوزه‌ی وب به خاطر عدم شناخت و تبلیغات کافی از ذهن بسیاری از افراد به یک گزینه‌ی بی اهمیت تبدیل شده است، اما با توجه به رشد روز افزون و ایجاد ابزار‌های ضعیف، نیاز به شناخت این زبان و ابزار‌های واقعی و قدرتمند آن الزامی شده است. برای مثال در حوزه‌ی موبایل ابزار‌هایی مانند Xamarin و یا Flutter این روز‌ها سرو صدای بسیاری کرده‌اند، اما واقعیت این است، آن‌ها هیچگاه نتیجه‌ی واقعی و مشابه به زبان‌های پیشفرض پلتفرم‌های توسعه را ندارند و نخواهند داشت. فناوری چند-سکویی به معنای واقعی تنها در ابزار‌هایی مانند Qt Framework و سی++ خلاصه می‌شود که به شما اجازه‌ی تولید و توسعه‌ی کد‌های خود را به صورت بومی در پلتفرم هدف فراهم می‌کند. پیشنهاد ما در رابطه نحوه شروع برای یادگیری و آشنایی با زبان و انواع کتابخانه ها به صورت زیر است: قبل از هر چیز هدف خود را در رابطه با منابع مشخص نمایید، اگر زبان انگلیسی شما خوب است می‌توانید در همین قدم اول از منابع رسمی و استاندارد که بی نقص هستند استفاده کنید. سعی کنید اگر قرار است این زبان را یاد بگیرید عملا با آن درگیر شوید. از مقدمات برنامه نویسی شروع کنید و حتما در رابطه با تاریخچه زبان و اهداف آن تحقیق کنید. شرکت و سازمان های بزرگ و موفق را الگو قرار دهید. اگر هدف شما سریع رسیدن به پول بدون در نظر داشتن کیفیت و اهداف بزرگ از پروژه هستش به هیچ عنوان سراغ این زبان نروید زیرا C++‎‎‎‎‎‎‎‎‎‎‎ برنامه نویس مشتاق به حرفه‌ای شدن را می‌طلبد نه برنامه‌نویس راحت طلب. حتماً سی‌پلاس‌پلاس مدرن را بی‌آموزید. استاندارد‌های مدرن شامل نسخه‌های ۱۱، ۱۴، ۱۷ و ۲۰ هستند. برای استفاده و کار با کتابخانه‌های این زبان بهتر است کتابخانه‌های پیش‌فرض STL را به خوبی یاد بگیرید. برای توسعه هرچه بیشتر پروژه و استفاده از انواع قابلیت‌ها توسط این زبان می‌بایست از کتابخانه‌های دیگر استفاده کنیم که در این میان در رابطه با بخش طراحی و رابط کاربریQt، GTK, MFC, SDL , wxWidgetsمناسب است که پیشنهاد ما در میان این لیست (Qt) خواهد بود که تحت آن میتوان مدرنترین طراحی ها را خلق نمود. برای کار با شبکه کتابخانه‌های Curl, Poco, Qt, RakNet, ReplicaNet, SDL موجود هستند و در بین اینها Curl بهترین گزینه می‌تواند باشد. برای کار با 3D بعدی کتابخانه مخصوص OpenGL یا باز همان Qt را که بر پایه موتور OpenGL است پیشنهاد میکنیم و یا می‌توانید از کتابخانه های مخصوص DirectX و OpenGL و حتی نسخه‌های توسعه‌یافته به نام Vulkan را به صورت تخصصی استفاده یاد بگیرید. در رابطه با 2D نیز از OpenGL، Direct2D, GDI و GDI+ می‌توان استفاده کرد. در مورد Sound از کتابخانه های مطرح OpenAL, Fmod و Bass استفاده کنید. در مورد بحث فیزیک کتابخانه های Nvidia Physix, Nvidia Apex, Bullet, Box2D, ODE, Open Dynamics در رابطه با هوش مصنوعی کتابخانه های OpenAI, FEAR, OpenSteer, PathLib مطرح هستند. برای کار با پردازش تصویری OpenCV, OpenNI پیشنهاد میشود. برای کار با پردازش موازی OpenCL, OpenML, CUDA مناسب است. برای اسکریپت نویسی Lua, LuaPlus, Phyton برای کار با ورودی ها از OpenInput, Qt, SDL, SFML می‌توان استفاده کرد. برای بازی سازی کتابخانه های Unreal Engine, OGRE, Irrlicht, KGE مناسب هستند که در بین اینها Unreal Engine بسیار قدرتمند عمل می‌کند. برای طراحی و اجرای وب سایت کتابخانه های WebKit, ClearSilver, Teng مناسب هستند. برای توسعه‌ی ابزار‌های مرتبط با فناوری بلاک‌چین، می‌توان به کتابخانه‌های قدرتمند و خارق‌العاده‌ای به نام EOS اشاره کرد. لازم بذکر است این‌ها نمونه‌ای از کتابخانه‌های بی‌شمار سی‌++ هستند و می‌توان به کتابخانه‌های بسیاری اشاره کرد که خارج از گنجایش این مقاله است. منابع فارسی برای یادگیری سی‌پلاس‌پلاس مدرن چیست؟ متأسفانه منابع فارسی برای این زبان معمولاً متعلق به مباحث دانشگاهی و مفاهیم مرتبط به سی‌پلاس‌پلاس سنتی است (مربوط به ۳۰ سال پیش)! یاد گیری این مباحث هیچ مزیتی برای شما نخواهد داشت و به شدت پیشنهاد می‌شود جهت یادگیری این زبان حتماً به سراغ آموزش‌های مدرن بروید. تنها بستر‌های آموزشی مدرن مرتبط به سی‌++ در ایران (به زبان فارسی) مرجع آی‌او‌استریم و همچنین بستر فانوکس (که خود با سی‌++ توسعه یافته است) دارای بسته‌های آموزشی (در مرحله‌ی برنامه‌ریزی جهت ساخت و تولید محتوا است) که می‌توانید در آن عضو و به یادگیری مدرن این زبان بپردازید.
×
×
  • جدید...