رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

کامبیز اسدزاده

بنیـــان گذار
  • تعداد ارسال ها

    505
  • تاریخ عضویت

  • روز های برد

    266

تمامی مطالب نوشته شده توسط کامبیز اسدزاده

  1. کامبیز اسدزاده

    در پاسخ قبلی به این لینک اشاره کردم : https://doc.qt.io/qt-5/qtqml-cppintegration-topic.html نمونه کد‌های مشخصی داره، کافیه کلاس رو از نوع QObject مشتق کنید و سپس به یکی از روش‌های موجود، تابع خودتون رو پیاده سازی کرده و در نهایت برای QML رجیسترش کنید. برای مثال می‌تونید از روش‌های qmlRegisterType و rootContext استفاده کنید که روش‌های متفاوتی هستند. همچنین این مستندات رو می‌تونید بررسی کنید : https://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html
  2. کامبیز اسدزاده

    سلام، این بستگی به این داره که چطور داده‌ای رو بخواهید بخونید و در چه قالبی تحتِ چه کنترلی نمایشش بدین. برای کار با باینری در مورد کلاس‌های QFile و QDataStream تحقیق کنید. در مورد نحوهٔ نمایش دادن هم باید کلاس‌های سمت ++C را در قالب مشتق شدهٔ QObject و در صورت نیاز به یک سری ویژگی‌های انتزاعی تحتِ یک سری کلاس‌های دیگر پیاده‌سازی کنید. نمونه مستندات. بهتر بود مثالی می‌زدین و کدی که نوشتین رو ارائه می‌کردین تا بررسی و راهکار مناسبی ارائه بشه.
  3. کامبیز اسدزاده

    سلام، در کیوت سعی کنید از مکانیزم سیگنال و اسلات (Signal/Slot) برای این کار پیروی کنید، تابع یا توابع شما می‌توانند از این مکانیزم برای اجرا بر اساس درخواست به کار گرفته شوند. برای مثال صدا زده شدن یک شیء یا اجرا شدن آن در مقابل یک درخواست یا سیگنالِ مشخص تحتِ این مکانیزم بسیار کاربری است. هرچند نوع عملکرد تابع شما نیز در عملکرد آن موثر خواهد بود. public slots: void showProccessing(); void hideProccessing(); private signals: void statusChanged();
  4. پادکستِ مربوط به شفاف‌سازی تقریبی از مسیرِ توسعه‌دهندگی تحت سی++ و ساخت محصولِ هدفمند زمان مورد نیاز : ۲۰ دقیقه و ۱۱ ثانیه Podcast-03.mp3
  5. پادکستِ مربوط به اهمیت شکست و تجربه زمان مورد نیاز : ۳ دقیقه و ۸ ثانیه. Podcast-02.mp3
  6. پادکستِ مربوط به نحوهٔ قیمت‌گذاری بر روی پروژه زمان مورد نیاز : ۱۰ دقیقه و ۴۹ ثانیه. Pricing-Podcast.mp3
  7. فایل صوتیِ مربوط به نحوهٔ آموزش‌ صحیح و روش یادگیری اصولی. زمان اختصاص یافته شده : ۲۶ دقیقه. Teaching-Learning.mp3
  8. کامبیز اسدزاده

    درود، در فایل pro. کد زیر رو اضافه کنید. CONFIG += console در این حالت محیط ترمینال یا کنسول به جای خروجی پیش‌فرض کیوت‌کریتور اجرا می‌شه که می‌تونید ورودی رو بهش ارسال کنید. ممکنه که بعضی اوقات نیاز باشه تنظیمات را بررسی کنید، در این صورت به بخش تنظیمات و گزینهٔ Build & Run بروید و از زبانهٔ General گزینهٔ Default in tun terminal را فعال کنید.
  9. کامبیز اسدزاده

    حل مشکل مربوط به Google Play Protect

    همانطور که می‌دانید امضاء و انتشار اپلیکیشن‌های اندرویدی در قالب فایل apk به شما اجازه می‌دهد تا مستقل از فروشگاه گوگل، نرم‌افزار مورد نظر خودتان را در اختیار مشتریان خود قرار دهید؛ از طرفی ارسال آن برای فروشگاه‌های داخلی مانند کافه‌بازار نیز مراحلی را دربر دارد که یکی از آن‌ها بررسی مشکل مربوط به Google Play Protect است. با توجه به تجربیات من، خیلی از مشتری‌ها و کاربران علم کافی در توجه به پیام مربوط به آن را ندارند و نمی‌دانند با رد کردن پیغام می‌توانند نرم‌افزار را با پذیرش ریسک نصب کنند. اما این روش می‌تواند فرصتی برای کسانی باشد که به فکر سو‌ء استفاده از شرایط هستند. طبق گزارشاتی که دریافت کرده‌ایم، مشاهدهٔ پیام مربوط به عدم قابل اعتماد بودن نرم‌افزار شما و خطای نصبی بیشتر از قبل به چشم می‌خورد! برای اینکه ثابت کنید اپلیکیشن شما یک محصول قابل اعتماد است، تنها باید آن را به روش قانونیِ خودِ گوگل حل کنید که چندان سخت نیست ? توجه داشته باشید که، این پیام در شرایط متعددی می‌تواند رخ دهد. برای مثال، شما از خدماتی که مورد نیاز نیستند به اجبار در نرم‌افزار استفاده می‌کنید. اما حتی با اعمال تنظیمات مربوطه به نظر می‌رسد زمانی که شما یک برنامهٔ جدیدی را ایجاد و برای نشر ارسال می‌کنید باید ابتدا نسخهٔ مربوطه، به بانک اطلاعاتی موجود در Google Play Protection ارسال شود و سپس برای نصب آماده شود. بنابراین، خطای مربوط به آن را به روشی که در ادامه توضیح می‌دهیم می‌توانید حل کنید. قبل از هر چیز دقت کنید که نرم‌افزار شما امضاء شده باشد، در واقع از نوع نسخهٔ signed ریلیز شود. برای این کار باید حتماً یک گواهی مشخصی بسازید که همراه رمز عبور و اطلاعات توسعه‌دهنده به صورت اختصاصی برای هر محصول قابل ساخت است. در ادامه مهمترین موردی که باید در نظر گرفته شود این است که فایل مربوطه را باید قبل از نشر در کافه‌بازار یا تحویل آن به مشتری خود، به مرکز Play Protect Appeals ارسال کنید تا برای بررسی جهتِ تجدید نظر شدن از لحاظ گیر دادن‌های بی‌خودی به برنامه‌ٔ شما مورد بررسی قرار گیرد. معمولاً این کار خارج از ایران ساده‌تر است، چرا که بحث تحریم و شناسایی شناسه‌های ایرانی برای کارشناسان راحت‌تر بوده و به آن حساسیت نشان می‌دهند که ممکن است پیام زیر را دریافت کنید: بنابراین، توصیه می‌کنیم از روش‌های مطمئن‌تری برای ارسال فایل استفاده کنید. توصیهٔ ما استفاده از خدماتِ دراپ‌باکس خواهد بود که با ارسال فایل به آن و ساخت یک لینک اشتراکی می‌توانید مطمئن شوید که دسترسی به فایل شما در سراسر جهان میسر خواهد شد. اما توجه داشته باشید که لینک آن را برای سهولت در بررسی و ارسال در فیلد فرمِ آن، از طریق سایت http://bit.ly کوتاه سازید. دقت کنید که لینک دریافتی از دراپ‌باکس باید شامل قالبی به صورت زیر است: https://www.dropbox.com/s/example/app.apk?dl=0 آدرس زیر را بعد از پارامتر dl=0 به dl=1 تغییر دهید و سپس لینک مربوطه را کوتاه کرده و آن را در فرم ثبت اطلاعات نرم‌افزار برای گوگل در این لینک ارسال کنید. در فرم مربوطه فیلد‌های مورد نظر باید دقیقاً شامل واقعیت باشند، به عنوان مثال نام و نام‌خانوادگی توسعه‌دهنده، آدرس پست‌الکترونیکی، نام بستهٔ اپلیکیشن و لینک کوتاه شدهٔ قابل دریافت؛ در نهایت می‌توانید توضیحاتی برای آن در نظر بگیرید. اگر همه چیز به خوبی پیش رفته باشد پیامی مانند زیر را به همان آدرس پست‌الکترونیکی خود دریافت خواهید کرد. در نظر داشته باشید که این فرایند ممکن است زمان متغیری را در صف بررسی باشد که در حالت عادی و خاص ۱ الی ۳۰ روز زمان خواهد برد که من به شخصه بین حدقل ۲۴ تا ۴۸ ساعت نتیجهٔ مثبت گرفتم. صرفاً دقت کنید که در صورت بررسی و تأیید شدن برنامهٔ شما، هیچ پیام خاصی ارسال نخواهد شد، بنابراین تنها با بررسی و نصب برنامه می‌توانید متوجه آن شوید که برنامهٔ ارسال شدهٔ شما در لیست بانک اطلاعاتی امنیتی اپلیکیشن‌های گوگل قرار گرفته است یا خیر. امیدوارم که این تجربهٔ پیشنهادی برای شما نیز مفید واقع شود ?
  10. کامبیز اسدزاده

    رونمایی از رابط‌کاربری جدید سونی پلی‌استیشن ۵

    همانطور که می‌دانید پلی‌استیشن ۵ به عنوان یک نسل جدیدی از کنسول بازی سونی معرفی شده است که رابط‌کاربری آن به شدت تغییر و بهبود یافته است. هر چیزی که در این محیط از پلی‌استیشن ۵ دیده می‌شود خط به خط و ریز به ریز آن، به لُطفِ کامپایلر Clang که اتفاقاً امروز هم نسخهٔ ۱۱ اون منتشر شد، و استاندارد ۱۷ از سی++ و به خصوص بحث نرم‌افزاری آن بر پایهٔ سیستم‌عامل FreeBSD ارائه شده است که متخصص‌ها در این باره خوب می‌دانند فری‌بی‌اِس‌دی به عنوان سریع‌ترین و پایدارترین نوع سیستم‌عامل‌های یونیکسی مطرح هستند. اگه شما کاربر عادی هستید، مثالی بزنیم تا بیشتر در جریان باشید: - سیستم‌عامل macOS و iOS بر پایهٔ سیستم‌عامل یونیکس (داروین) ساخته شده‌اند. - سیستم‌عامل اندروید بر پایهٔ لینوکس ساخته شده‌اند. از طرفی سیستم‌عامل کنسول مایکروسافت اِکس‌باکس بر پایهٔ هستهٔ ویندوز ۱۰ طراحی شده و در مقابل سیستم‌عامل پلی‌استیشن ۴ و همچنین ۵ از هستهٔ یونیکس فری‌بی‌اِس‌دی استفاده کرده که حرف‌های زیادی برای گفتن دارند. در بحث طراحی نسبت به نسخه‌های پیشین یک بهبود اساسی داشته چون تغییرات رابط‌کاربری در زمان PS4 نسبت به PS3 چنان چشم‌گیر نبوده است! اما الآن دیگر سونی واقعاً بر روی آن کار کرده است و دیگر خبری از آن ظاهر تکراری و حوصله بر وجود ندارد! پلی‌استیشن ۵ رابط کاربری کاملاً بازسازی شده‌ای نسبت به پلی‌استیشن ۴ دارد که با هدف دسترسی آسان به اطلاعات طراحی شده. یکی از ویژگی‌های این رابط کاربری گرفتن آپدیت‌های زنده است که کاربران مجبور به جستجو و صبر کردن برای مشاهده فعالیت‌های دوستان خود و مشاهده فعالیت‌های در دسترس در بازی‌ها نباشند. مارک سرنی دربارهٔ این موضوع گفته‌است «ما نمی‌خواهیم یک کاربر بازی را باز کند، ببیند که چه‌خبراست، و دوباره بازی را باز کند که ببیند چه خبر است!»! این ویژگی در همان داشبورد رابط کاربری اصلی پلی‌استیشن فراهم شده است و نیازی به ورود به داخل بازی جهت بررسی خبر‌های اخیر از آن ندارد! همچنین دیگر مواردی مانند پشتیبانی از ویژگی عقب‌گرد (یعنی پشتیبانی از اجرای بازی‌های پی‌اس ۴) در این سیستم ارائه شده است. رابط کاربری پلی استیشن 5 همواره با وضوح تصویر 4K واقعی و پشتیبانی کامل از HDR به نمایش درمی‌آید. سونی تلاش زیادی کرده است که بازیکنان در کمترین زمان ممکن بتوانند برنامه یا بازی مورد نظر خود را در رابط کاربری بیابند و اجرا کنند. همه‌ی برنامه‌ها نیز حالا بخشی از UI هستند و دیگر مثلا موقع وارد شدن به پلی استیشن استور احساس نمی‌کنید که تازه یک برنامه‌ی جدید باید از ابتدا اجرا شود. از طرفی SSD بسیار سریع و پردازندهٔ مرکزی دستگاه کاری می‌کنند که رابط کاربری همواره با سرعت قابل ‌توجه و به شکل روان مقابل بازیکن قرار بگیرد.
  11. همانطور که می‌دانید در زبان‌های برنامه‌نویسی از نوع کامپایلری، گزینه‌ها و تنظیماتی وجود دارند که به شما امکان این را می‌دهد تا رفتار کامپایلر (هم‌گردان) را تا حدی سفارشی سازی کنید. این امکان به کمک تنظیمات پرچم‌ها (فلگ‌ها) و برخی از گزینه‌ها قابل انجام است و انتخاب پرچم‌های مناسب برای کامپایلر می‌تواند مورد توجه قرار بگیرد. با توجه به دو مقاله‌ای که با عناوین زیر ارائه شده است، در این مقاله به جزئیات بیشتری نسبت به تنظیمات کامپایلر (هم‌گردان یا مترجم) می‌پردازیم که البته توصیه می‌کنم در صورت عدم آشنایی با تعاریف مربوطه و به خصوص روند ترجمهٔ کد‌ها و ساختار برنامه‌های نوشته شده توسط سی‌پلاس‌پلاس، بهتر است آن‌ها را بررسی کنید. در مثال زیر، نسخهٔ کامپایلر همراه با اطلاعات مربوط به آن، توسط گزینهٔ option در خط فرمان قابل دریافت است: gcc --version خروجی مربوطه می‌تواند نسبت به نسخهٔ کامپایلر به صورت زیر باشد: gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. در حالت پیش‌فرض تنظیمات کامپایلر به صورت خودکار انجام می‌شود. اما در صورتی که نیاز باشد برخی از درخواست‌ها توسط کامپایلر مورد توجه قرار بگیرد و یا برای دیگران آن را گوشزد کند، از این ویژگی‌ها استفاده می‌شود. در چنین شرایطی می‌تواند به کامپایلر بگوید که کاربر می‌خواهد کد را برای اشکال‌زدائی بهینه کند یا اینکه کاربر نمی‌خواهد هیچ بهینه‌سازی خاصی برای آن فعال شود. این عمل معمولاً در سراسر خط فرمان قابل استفاده است و به عنوان مکانیزمی برای دستورالعمل‌ برنامه برای انجام عملیاتی یا رفتاری به روش خاص عمل می‌کند. به طورکلی، گزینهٔ کامپایلر به عنوان یک عبارت بسیار حساس، برای خط فرمان است که برای تغییر عملکرد پیشفرض کامپایلر استفاده می‌شود. در اصل این گزینه‌ها برای کامپایل برنامهٔ شما اجبار نیستند، اما برای کمک به کنترل نبه‌های مختلف برنامه بسیار مفید خواهند بود. از جمله: تولید کد بهینه‌سازی فایل خروجی (نوع، نام، مکان) خواص پیوند‌-دهنده اندازه فایل اجرائی سرعت اجرایی اینکه نیاز باشد کدی را بهینه‌سازی کنید، و یا مسائلی را برای دیگران گوشزد کنید کاملاً سلیقه‌‌ای است و شما در روند توسعهٔ حرفه‌ای خود می‌توانید از این تکنیک استفاده کنید. ساده‌ترین کاربرد این تکنیک می‌تواند وادار کردن استفادهٔ کامپایلر از یک استاندارد مشخص شده باشد که در صورت پشتیبانی از آن چه به صورت عقب‌گرد و چه به صورت سوئیچ به استاندارد‌های اخیر کاربرد خواهد داشت. برای مثال، پرچم std نسخه یا استاندارد ایزو از سی‌پلاس‌پلاس را کامپایلر‌های رایجی مانند Clang و GCC مشخص می‌کند که به صورت زیر تعریف می‌شوند: -std=c++11 (ISO C++11) -std=c++14 (ISO C++14) -std=c++1z (ISO C++17) -std=c++20 (C++20 experimental) -std=gnu++ (ISO C++ with GNU extensions) معادل پرچم استاندارد در کامپایلر MSVC به صورت زیر است: /std:c++14 /std:c++17 /std:c++latest /std:c11 /std:c17 نکته، گزینهٔ /std از نسخهٔ ۲۰۱۷ به بعد از کامپایلر مایکروسافت در دسترس است. به صورت پیش‌فرض در این نسخه از کامپایلر این گزینه بر روی استاندارد ۱۴ تنظیم شده است. در صورت نیاز به ارتقاء آن به نسخهٔ ۱۷ طبق نمونه عمل کنید. همچنین طبق قوائد مایکروسافت استاندارد نهایی شده از آخرین ویژگی‌ها در کامپایلر تحت /std:c++latest قابل دسترس می‌باشد که در این لحظه شامل استاندارد ۲۰ می‌شود. گزینهٔ Verbosity به عنوان اِسم یا Verbose از نوعِ صِفَت به معنای دراز‌نویسی (بهتر است به معنای ارائه‌‌کنندهٔ اطلاعات بیشتر به آن توجه شود)، با کاراکتر W که به عنوان مخففی از Warning محسوب می‌شود قابل تنظیم است. بنابراین، پرچم‌های زیر برای اهداف مشخصی در نظر گرفته می‌شوند که توضیحات هر یک را در مقابل آن آورده‌ایم: پرچم -Wall با فعال شدن، تعداد زیادی از پرچم‌های هشدار دهندهٔ کامپایلر را به طور خاص و باهم روشن می‌کند که لیست آن به صورت زیر است: -Waddress -Warray-bounds=1 (only with -O2) -Warray-parameter=2 (C and Objective-C only) -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wcatch-value (C++ and Objective-C++ only) -Wchar-subscripts -Wcomment -Wduplicate-decl-specifier (C and Objective-C only) -Wenum-compare (in C/ObjC; this is on by default in C++) -Wenum-conversion in C/ObjC; -Wformat -Wformat-overflow -Wformat-truncation -Wint-in-bool-context -Wimplicit (C and Objective-C only) -Wimplicit-int (C and Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) -Winit-self (only for C++) -Wlogical-not-parentheses -Wmain (only for C/ObjC and unless -ffreestanding) -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (only for C/C++) -Wmissing-attributes -Wmissing-braces (only for C/ObjC) -Wmultistatement-macros -Wnarrowing (only for C++) -Wnonnull -Wnonnull-compare -Wopenmp-simd -Wparentheses -Wpessimizing-move (only for C++) -Wpointer-sign -Wrange-loop-construct (only for C++) -Wreorder -Wrestrict -Wreturn-type -Wsequence-point -Wsign-compare (only in C++) -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvla-parameter (C and Objective-C only) -Wvolatile-register-var -Wzero-length-bounds برای مثال، با فعال‌سازی پرچم -Werror، هرگونه هشدار را به خطای تلفیقی تبدیل می‌کند. این کار باعث می‌شود خطاهای مربوط به کد‌های خطرناک را به گونه‌ای جلوه دهید که از کامپایل آن‌ها جلو‌گیری شود. کار‌های مشابه این مورد، به صورت پیش‌فرض در زبان‌های مانند Rust انجام می‌شود که از کد‌های دارای خطا و خطرناک برای کامپایل جلوگیری می‌کند. به کار گیری چنین پرچم‌هایی در کامپایلر سی++ می‌تواند خطاهای شامل هشدار رو به خطاهای غیر قابل کامپایل تبدیل کند. جهت تنظیم این پرچم در پروژهٔ خود کافی است در ابزار ساخت مورد نظر آن را اعمال کنید، به عنوان مثال در سی‌میک (CMake) به صورت زیر عمل کنید: SET (CMAKE_CXX_FLAGS "-Werror") و یا در QMake به شیوهٔ زیر می‌توانید این ویژگی را فعال کنید: QMAKE_CXXFLAGS += -Werror برای مثال، کد زیر در صورت فعال بودن این پرچم، کامپایل نخواهد شد. int myFunction() { //‌no return! } auto main() -> int { return 0; } خروجی این پیام به صورت زیر خواهد بود: error: no return statement in function returning non-void [-Werror=return-type] به معنای این ‌که هیچ بیانیه‌ای به عنوان عبارت بازگشتی در تابع مربوطه که از نوع غیر-باطل (non-void) است، وجود ندارد. بسیاری از این گزینه‌ها برای هدف خاصی در نظر گرفته می‌شوند که می‌توانید جزئیات بیشتر آن را در این لینک پیدا کنید. برخی از پرچم‌های رایج برای کتابخانه‌ها گزینهٔ پرچم -lm امکان کامپایل کتابخانه‌های libm نوع سوم را به همراه کتابخانه‌های ریاضیاتی که عموماً به زبان سی هستند را می‌دهد. گزینهٔ پرچم -lpthread امکان کامپایل کتابخانه‌های مشترک از استاندارد پازیکس (Posix) را ارائه می‌کند. گزینهٔ پرچم -lstdc++fs امکان کامپایل و لینک شدن به کتابخانهٔ فایل‌سیستم را در استاندارد ۱۷ به بعد می‌دهد. پرچم‌های بهینه‌سازی تحت کامپایلر‌ با فعال‌سازی و اعمال پرچم-O0 هیچ گونه بهینه‌سازی بر روی کد‌ها انجام نمی‌شود، در اصل امکان بهینه‌سازی کاملاً غیرفعال می‌شود. زمان کامپایل و همگردانی کد‌ها سریع‌تر می‌شود و برای ابزار‌های اشکال‌زدائی بهترین عملکرد را دارد. با فعال‌سازی و اعمال پرچم-O2 سطح بالا‌تری از بهینه‌سازی صورت می‌گیرد، ترکیبی از حالت بهینه‌سازی و سطح قبلی را اعمال می‌کند و طبیعتاً زمان بیشتری صرف کامپایل می‌شود و گزینهٔ بهتری برای ساخت یک محصول بهتر است. با فعال‌سازی و اعمال پرچم-O3 سطح بالا‌تری نسبت به سطح دوم از بهینه‌سازی صورت می‌گیرد، طبیعتاً زمان بیشتری صرف کامپایل می‌شود و گزینهٔ بهتری برای ساخت یک محصول بهتر است. از طرفی حجم باینری بیشتری را تولید کرده و زمان کامپایل طولانی‌تری را تحمیل می‌کند. با فعال‌سازی و اعمال پرچم-OFast سطح بالا‌تری نسبت به سطح سوم از بهینه‌سازی صورت می‌گیرد، طبیعتاً زمان بیشتری صرف کامپایل می‌شود و گزینهٔ بسیار بیشتری مانند -ffloat-store, -ffsast-math, -ffinite-math-only, -O3 را فعال می‌کند و برای ساخت یک محصول بهتر است. با فعال‌سازی و اعمال پرچم -OS امکان سطح دوم از بهینه‌سازی فعال می‌شود، با تفاوت اینکه برخی از پرچم‌ها با هدف کاهش اندازهٔ فایل کدِ شیء (object-code) غیرفعال می‌‌شوند. با فعال‌سازی و اعمال پرچم-Oz سطح بالا‌تری نسبت به سطح -OS برای کاهش اندازهٔ فایل صورت می‌گیرد. این گزینه مختصِ Clang است. توضیحات و مراجع دقیق و بیشتر در رابطه با عملیات مربوط به پرچم‌های بهینه سازی در کامپایلر‌های مختلف به صورت زیر است: کامپایلر GCC کامپایلر Clang کامپایلر MSVC دقت کنید که نوع پرچم‌ها نسبت به کامپایلر‌ها متفاوت است، برای مثال پرچم -Od به معنای غیر‌فعال‌سازی تمامی بهینه‌سازی‌ها و جمع‌آوری و کامپایل سریع کد‌ها و در نهایت اشکال‌زدائی بهتر است که در Clang و MSVC پشتیبانی می‌شود و یا پرچمِ -OS صرفاً بر روی کامپایلر کلنگ قابل استفاده است.
  12. در این مقاله نیاز است بدانید که، کتابخانهٔ توابع ویژه ریاضی در اصل بخشی از کتابخانه TR1 ISO / IEC TR 19768: 2007 بود، سپس به عنوان یک استاندارد ISO مستقل، ISO / IEC 29124: 2010 منتشر شد و در نهایت از C++ 17 به استاندارد ایزو ادغام شد. برای استفاده از توابع ریاضیاتی مانند هرمیتی، بسل و غیره کافی است فایل سرآیند <cmath> را فراخوانی کنید. به عنوان مثال توابع چند‌جمله‌ای لگر به صورت زیر می‌توانند مورد استفاده قرار گیرند: #include <cmath> #include <iostream> double L1(unsigned m, double x) { return -x + m + 1; } double L2(unsigned m, double x) { return 0.5*(x*x-2*(m+2)*x+(m+1)*(m+2)); } int main() { // spot-checks std::cout << std::assoc_laguerre(1, 10, 0.5) << '=' << L1(10, 0.5) << '\n' << std::assoc_laguerre(2, 10, 0.5) << '=' << L2(10, 0.5) << '\n'; } مثالی از کاربرد توابع چندجمله‌ای‌های لژاندر : #include <cmath> #include <iostream> double P20(double x) { return 0.5*(3*x*x-1); } double P21(double x) { return 3.0*x*std::sqrt(1-x*x); } double P22(double x) { return 3*(1-x*x); } int main() { // spot-checks std::cout << std::assoc_legendre(2, 0, 0.5) << '=' << P20(0.5) << '\n' << std::assoc_legendre(2, 1, 0.5) << '=' << P21(0.5) << '\n' << std::assoc_legendre(2, 2, 0.5) << '=' << P22(0.5) << '\n'; } نحوهٔ استفاده از توابع بتا #include <cmath> #include <string> #include <iostream> #include <iomanip> double binom(int n, int k) { return 1/((n+1)*std::beta(n-k+1,k+1)); } int main() { std::cout << "Pascal's triangle:\n"; for(int n = 1; n < 10; ++n) { std::cout << std::string(20-n*2, ' '); for(int k = 1; k < n; ++k) std::cout << std::setw(3) << binom(n,k) << ' '; std::cout << '\n'; } } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع انتگرال بیضوی نوع اول : #include <cmath> #include <iostream> int main() { double hpi = std::acos(-1)/2; std::cout << "K(0) = " << std::comp_ellint_1(0) << '\n' << "π/2 = " << hpi << '\n' << "K(0.5) = " << std::comp_ellint_1(0.5) << '\n' << "F(0.5, π/2) = " << std::ellint_1(0.5, hpi) << '\n'; std::cout << "Period of a pendulum length 1 m at 90° initial angle is " << 4*std::sqrt(1/9.80665)* std::comp_ellint_1(std::pow(std::sin(hpi/2),2)) << " s\n"; } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع انتگرال بیضوی نوع دوم : #include <cmath> #include <iostream> int main() { double hpi = std::acos(-1)/2; std::cout << "E(0) = " << std::comp_ellint_2(0) << '\n' << "π/2 = " << hpi << '\n' << "E(1) = " << std::comp_ellint_2(1) << '\n' << "E(1, π/2) = " << std::ellint_2(1, hpi) << '\n'; } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع انتگرال بیضوی نوع سوم : #include <cmath> #include <iostream> int main() { std::cout << std::fixed << "Π(0.5,0) = " << std::comp_ellint_3(0.5, 0) << '\n' << "K(0.5) = " << std::comp_ellint_1(0.5) << '\n' << "Π(0,0) = " << std::comp_ellint_3(0, 0) << '\n' << "π/2 = " << std::acos(-1)/2 << '\n' << "Π(0.5,1) = " << std::comp_ellint_3(0.5, 1) << '\n'; } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع بسل نوع اول : #include <cmath> #include <iostream> int main() { // spot check for ν == 0 double x = 1.2345; std::cout << "I_0(" << x << ") = " << std::cyl_bessel_i(0, x) << '\n'; // series expansion for I_0 double fct = 1; double sum = 0; for(int k = 0; k < 5; fct*=++k) { sum += std::pow((x/2),2*k) / std::pow(fct,2); std::cout << "sum = " << sum << '\n'; } } اطلاعات بیشتر از این تابع، در این لینک. نحوهٔ استفاده از توابع بسل نوع دوم : #include <cmath> #include <iostream> int main() { // spot check for ν == 0 double x = 1.2345; std::cout << "J_0(" << x << ") = " << std::cyl_bessel_j(0, x) << '\n'; // series expansion for J_0 double fct = 1; double sum = 0; for(int k = 0; k < 6; fct*=++k) { sum += std::pow(-1, k)*std::pow((x/2),2*k) / std::pow(fct,2); std::cout << "sum = " << sum << '\n'; } } اطلاعات بیشتر از این تابع، در این لینک. همچنین در مورد توابع دیگر مانند هرمیتی و غیره می‌توانید از مرجع آن استفاده کنید.
  13. اگرچه که زبان برنامه‌نویسی سی‌پلاس‌پلاس به عنوان یک زبان بسیار قدرتمند و قدیمی شناخته شده است، اما کتابخانهٔ استاندارد و پیشفرض آن برخی از موارد واقعاً مهم را به تازگی تعبیه کرده است. ویژگی‌هایی که در زبان‌هایی مثل جاوا و یا سی‌شارپ دات‌نت سال‌هاست وجود دارند. به هر حال این ویژگی‌ها در سی++ ۱۷ موجود شده‌اند و این یک بهبود و پیشرفت بسیار خوب است. برای مثال ما الآن فایل‌سیستم استانداردی را در اختیار داریم. این ویژگی به عنوان یک کتابخانه، امکان برای انجام عملیات بر روی سیستم‌فایل‌ها و اجزای آن‌ها مانند، مسیر‌ها، فایل‌ها و پوشه‌ها را فراهم می‌کند. کتابخانهٔ فایل‌سیستم در فایل سرآیند <filesystem> قرار گرفته است که توسط فضای نام مخصوص خود std::filesystem قابل فراخوانی است. به مثال زیر توجه کنید: namespace fs = std::filesystem; استفاده از این کتابخانه بسیار ساده و کاربردی است، بنابراین اگر بخواهیم به سادگی مسیری از یک ریشه را به دست آوریم، کد آن به صورت زیر خواهد بود: #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { fs::path p = fs::current_path(); std::cout << "The current path " << p << " decomposes into:\n" << "root name " << p.root_name() << '\n' << "root directory " << p.root_directory() << '\n' << "relative path " << p.relative_path() << '\n'; } فراخوانی کتابخانه، نمونه‌سازی از کلاس current_path و سپس چاپ نام، ریشه و مسیر مربوطهٔ آن صورت گرفته است. بنابراین این کتابخانه دارای کلاس‌های زیر است که توضیح و کاربرد هر کدام را آورده‌ایم: کلاس path، این کلاس امکان کار با مسیر‌ها را فراهم می‌کند، در واقع برای نمایش یا مشاهدهٔ یک مسیر از این کلاس استفاده خواهیم کرد. کلاس filesystem_error یک شیء استثناء در اثر سربارگذاری بیش‌از حد کتابخانهٔ فایل‌سیستم ایجاد می‌کند، در واقع برای مدیریت خطاها کاربردی خواهد بود. کلاس directory_entry برای کنترل ورودی یک مسیر استفاده می‌شود، برای مثال بررسی وجود یا عدم وجود در زیر مجموعه‌های این کلاس امکان‌پذیر است. کلاس directory_iterator یک تکرار کننده از محتوای یک مسیر (دایرکتوری) را ارائه می‌کند. کلاس recursive_directory_iterator یک تکرار کننده از محتوایت یک مسیر یا زیر مسیر‌های آن را ارائه می‌کند. کلاس file_status نوع فایل و مجوز‌های آن را ارائه می‌کند. کلاس space_info اطلاعات مربوط به فضای آزاد و موجود در سیستم‌فایل را ارائه می‌کند. کلاس file_type اطلاعات مربوط به نوع فایل را ارائه می‌کند. کلاس perms مجوز‌های سیستم‌فایل را شناسایی می‌کند. کلاس perm_options معانی هر یک از عملیات مرتبط با مجوز‌ها را ارائه می‌کند. کلاس copy_options معانی عملیات کپی را مشخص می‌کند. کلاس directory_options معانی عملیات مربوط به مسیر (دایرکتوری) را مشخص می‌کند. کلاس file_time_type مقادیر زمانی مربوط به فایل را ارائه می‌کند. هر یک از کلاس‌های فوق دارای متد‌ها و توابعی هستند که در مدیریت فایل‌سیستم بسیار کاربردی و مفید خواهد بود. در کلاس path شما می‌توانید با متد‌های مفیدی کار کنید، برای مثال کد زیر پسوند یک فایل موجود که در مسیر به آن اشاره می‌شود را، در صورت وجود ارائه خواهد کرد. fs::path("/foo/bar.txt").extension(); اگر مسیر فوق دارای فایل ذکر شده باشد، مقدار برگشتی آن .txt خواهد بود. و یا اگر نیاز باشد نام فایل را ارائه کند کافی است از متد file_name آن استفاده کنید! به مثال‌های زیر توجه کنید: #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { std::cout << fs::path("/foo/bar.txt").filename() << '\n' << fs::path("/foo/.bar").filename() << '\n' << fs::path("/foo/bar/").filename() << '\n' << fs::path("/foo/.").filename() << '\n' << fs::path("/foo/..").filename() << '\n' << fs::path(".").filename() << '\n' << fs::path("..").filename() << '\n' << fs::path("/").filename() << '\n' << fs::path("//host").filename() << '\n'; } همچنین جهت مدیریت خطا و دریافت یک کد یا پیغام خطا به کد زیر توجه کنید: try { cout << fs::file_size("path&file"); } catch (fs::filesystem_error &e) { cout << "Error Message = " << e.what() << " with Code : " << e.code(); } در صورتی که خطایی رخ دهد، کد خطا ساطع خواهد شد، جهت نمایش پیام خطا از تابع what و دریافت کد خطا از تابع code استفاده می‌شود. این مقاله ادامه دارد...
  14. کامبیز اسدزاده

    جزئیات در ۱۱ ++C و برخی بهبود‌ها در ویرایش ۱۷ جدا کننده رقم استاندارد ۱۱ تا قبل از استاندارد ۱۴ شما مجبور بودید تعداد رقم‌ها و یا صفر‌ها را بشمارید. از استاندارد ۱۴ به بعد دیگر نیازی به این کار نیست. این کار در زمان محاسبهٔ آدرس در کلمه، مرز‌های رقمی یا نیم کاراکتر‌ها مفید خواهد بود. در واقع با گروه‌بندی ارقام کد شما رسا‌تر خواهد شد. int no = 1'000'000; long addr = 0xA000'EFFF; uint32_t binary = 0b0001'0010'0111'1111; تعریف نام مستعار (Type aliases) استاندارد ۱۱ از لحاظ معنایی مشابه typedef است، هرچند نام‌های مستعار تعریف شده به این شیوه ساده‌تر بوده و تحت انواع الگو‌ها سازگار‌تر هستند. به مثال‌های زیر توجه کنید: template <typename T> using dynamicArray = std::vector<T>; dynamicArray<int> nums; // equivalent to std::vector<int> using func_ptr = int (*)(int); و یا اگر بخواهید نام مستعاری از یک نوع std::map با کلید و مقدار از نوع رشته تعریف کنید، آنگاه به صورت زیر خواهد بود: using mapString = std::map<std::string, std::string>; این روش برای موارد متنوعی مورد استفاده قرار که قبل و بعد از وجود آن را در مثال زیر می‌بینیم: // C++11 using counter = long; // C++03 equivalent: // typedef long counter; // C++11 using fmtfl = std::ios_base::fmtflags; // C++03 equivalent: // typedef std::ios_base::fmtflags fmtfl; fmtfl fl_orig = std::cout.flags(); fmtfl fl_hex = (fl_orig & ~std::cout.basefield) | std::cout.showbase | std::cout.hex; // ... std::cout.flags(fl_hex); // C++11 using func = void(*)(int); // C++03 equivalent: // typedef void (*func)(int); // func can be assigned to a function pointer value void actual_function(int arg) { /* some code */ } func fptr = &actual_function; template<typename T> using ptr = T*; // the name 'ptr<T>' is now an alias for pointer to T ptr<int> ptr_int; الفاظ رشته‌ای تعریف شده توسط کاربر (User-defined literals) استاندارد ۱۱ در مواقع نیاز شما مجبورید با اصطلاحات واضحی مثل MB, KB, GB یا km، cm و یا واحد‌های دیگری جهت تبدیلات در زمان اجرا کار‌ی انجام دهید. اکنون به عنوان کاربر می‌توانید اصلاح مورد نیاز خود را همانند انواع pt (انواع ابتدائی) دیگر انجام دهید. این شیوه برای واحد‌ها و اندازه‌گیری بسیار مناسب است. اضافه کردن constexpr اثر هزینهٔ صفر از کارایی را در زمان اجرا فراهم می‌کند. using ull = unsigned long long; constexpr ull operator"" _KB(ull no) { return no * 1024; } constexpr ull operator"" _MB(ull no) { return no * (1024_KB); } int main() { std::cout << 1_KB << std::endl; std::cout << 1_MB << std::endl; return 0; } ویژگی مقداردهی لیست اولیه (std::initializer_list) استاندارد ۱۱ std::pair<int, int> p = {1, 2}; std::tuple<int, int> t = {1, 2}; std::vector<int> v = {1, 2, 3, 4, 5}; std::set<int> s = {1, 2, 3, 4, 5}; std::list<int> l = {1, 2, 3, 4, 5}; std::deque<int> d = {1, 2, 3, 4, 5}; std::array<int, 5> a = {1, 2, 3, 4, 5}; این شیوه مشابه آرایه‌ها به سبک C مقادیر را مستقیماً با لیست مقدار دهندهٔ اولیه «std::initializer_list» اختصاص می‌دهد. همچنین به لطف استاندارد ۱۱ این مورد در مورد نگه‌دارنده‌های تو در تو هم صدق می‌کند. ویژگی auto و decltype استاندارد ۱۱، بهبود و اضافات در استاندارد ۲۰ متغیر‌های تعریف شده به وسیلهٔ کلمهٔ کلیدی auto بر اساس نوع مقدار توسط کامپایلر استنباط می‌شوند. متغیر‌های تعرف شده به کمک کلمهٔ کلیدی decltype بر اساس بررسی موجودیت یا نوع و مقادیر عبارت تعیین می‌شوند. این ویژگی‌ها به شدت برای خواندن، به ویژه انواع پیچیده مفید است. auto a = 3.14; // double اجازه دهید یک مثال با ترکیب auto و decltype داشته باشیم. به عنوان مثال، توابع می‌توانند به وسیلهٔ کلمهٔ کلیدی auto نیز نوع بازگشتی خود را استنباط کنند. در استاندارد ۱۱ نوع بازگشتی باید به طور صریح یا با استفاده از نوع decltype رمزگشایی شود، به مثال‌های عادی و الگو (template) مانند زیر توجه کنید: auto getResult(std::string var) -> decltype (var) { return var; } template <typename X, typename Y> auto add(X x, Y y) -> decltype(x + y) { return x + y; } add(1, 2); // == 3 add(1, 2.0); // == 3.0 add(1.5, 1.5); // == 3.0 ویژگی Range-based for-loops استاندارد ۱۱ به علاوهٔ اضافات و بهبود‌ها در استاندارد ۱۷ و ۲۰ یک نحوِ شیرین برای تکرار عناصر در یک نگه‌دارنده یا ظرف (container) std::vector<int> v = {0, 1, 2, 3, 4, 5}; for (const int& i : v) // access by const reference std::cout << i << ' '; std::cout << '\n'; برای بررسی برخی از ویژگی‌های مرتبط با این موضوع به مقالات زیر مراجعه کنید: اشاره‌گر‌های هوشمند استاندارد ۱۱، بهبود‌ها در استاندارد ۱۷ استاندارد ۱۱ با خود اشاره‌گر‌های هوشمند را معرفی کرده است مانند std::unique_ptr، std::shared_ptr و std::weak_ptr که سپس std::auto_ptr در استاندارد ۱۷ به عنوان منسوخ شده معرفی و حذف شده است. std::unique_ptr<int> p = std::make_unique<int>(128); برای آشنایی با این ویژگی، لازم است در رابطه با اصطلاح RAII آشنا شوید، برای این منظور مقالهٔ زیر را برای مطالعه پیشنهاد می‌کنم. صفت‌های استاندارد جدید مانند، [[fallthrough]]، [[maybe_unused]] و [[nodiscard]] استاندارد ۱۷ این بحث به خودی خود بسیار جذاب است، بنابراین برای آن یک مقالهٔ ویژه در نظر گرفته‌ام که در ادامه می‌توانید به آن مراجعه کنید. ویژگی فضاهای نام تو در تو (Nested namespace) استاندارد ۱۷ فضاهای نام یکی از کاربردی‌ترین ویژگی‌های سی++ از زمان استاندارد ۱۱ به بعد می‌باشد که نحوهٔ تعریف آن به صورت زیر است: namespace Base { namespace Person { class PersonInfo { public: std::string name = {"Kambiz"}; }; } } در ادامهٔ استاندارد ۱۷ بهبود آن به شیوهٔ تو در تو صورت گرفته است و می‌تواند به صورت زیر تعریف شود: namespace Base::Person { class PersonInfo { public: std::string name = {"Kambiz"}; }; } در نهایت دسترسی به فضای نام و اعضای آن به همان شیوهٔ ساده ممکن است: Base::Person::PersonInfo pInfo; std::cout << pInfo.name << std::endl; یک کاراکتر u8 لفظی استاندارد ۱۷ این ویژگی برای ترجمهٔ صحیح کاراکتر‌ها به اسکی (ASCII) در پلتفرم‌های مختلف استفاده می‌شود. auto c = {u8'C'}; و یا به صورت یک رشتهٔ کامل: auto str = u8"سلام"; std::cout << str << "/n"; امکان استفاده از auto در template استاندارد ۱۷ این ویژگی امکان این را می‌دهد تا نوع پارامتر‌ها را در الگو‌ها تعریف کنیم، در استاندارد ۱۴ این ویژگی به صورت زیر ممکن است: template<typename Type, Type x> constexpr auto value = x; int main() { auto x = value<int,3>; return 0; } و اینک به لطف استاندارد ۱۷ استفاده از کلمهٔ کلیدی auto نیز فراهم شده است که به طور زیر تعریف می‌شود: template<auto x> constexpr auto value = x; int main() { auto x = value<3>; return 0; } نوع متغیر x توسط کامپایلر استنباط می‌شود، البته باید در نظر داشت این ویژگی در استفاده از variadic templates هم کاربرد دارد. به مثال زیر توجه کنید: template<auto ... values> struct A {}; int main() { auto k = A<1, 2, 'c'>(); return 0; } الفاظ رشته‌ای (لیترال) با ممیز شناور‌ (Floating point) در مبنای هگزادسیمال استاندارد ۱۷ در استاندارد ۱۷ ممیز شناور در مبنای هگزادسیمال اضافه شده است. اگر یک حرف شناور لفظی، آغازش با دنبالهٔ کاراکتر‌های 0x یا 0X باشد، آن در مبنای هگزا دسیمال شناور محسوب می‌شود. در غیر این صورت در مبنای شناور دسیمال (مبنای ۱۰) تعریف می‌شود. 0x | 0X hex-digit-sequence exponent suffix double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0 به مثال زیر توجه کنید: #include <iostream> int main() { std::cout << 58. << '\n' << 4e2 << '\n' << 123.456e-67 << '\n' << .1E4f << '\n' << 0x10.1p0 << '\n'; } نتیجهٔ تحت این ویژگی به این صورت است: 58 400 1.23456e-65 1000 16.0625
  15. بارها شده است که شما به این فکر کنید برنامه‌ای بنویسید که تحت کامپایلر‌ها و سیستم‌عامل‌های مختلف اجرا شود. بنابراین شما باید از ویژگی‌های خاص این روش مراقب باشید چرا که هر سیستم‌عامل نسبت به خود ساختار و عملکرد متفاوتی را دارد. برای مثال بین رابط‌های برنامه‌نویسی Windows و لینوکس تفاوت بسیار است. یا نوع سیستم‌عامل‌های FreeBSD یا Linux تفاوت‌های بسیاری دارند که نباید کد‌های شما در همهٔ آن‌ها یکسان باشد. در این بخش من قصد دارم در رابطه با برخی از پرکاربرد‌ترین متغیر‌های CMake اشاره‌ای داشته باشم. بنابراین متغیر‌های زیر را در نظر بگیرید: متغیر UNIX: تمامی سیستم‌عامل‌های شبه‌-یونیکس مانند macOS را شامل می‌شود. درواقع زمانی true است که پلتفرم آن مک یا شبه‌-یونیکس باشد. متغیر WIN32: زمانی true خواهد بود که پلتفرم مقصد و توسعه ویندوز باشد. متغیر MINGW: پلتفرم ویندوز را بر پایهٔ MinGW شامل می‌شود و زمانی true خواهد بود که پلتفرم ویندوز همراه با کامپایلر Mingw پیکربندی شده باشد. متغیر MSVC: زمانی برابر true خواهد بود که پلتفرم ویندوز همراه با کامپایلر MSVC پیکربندی شده باشد. برای مثال اگر بخواهیم کاری انجام دهیم که صرفاً در پلتفرم ویندوز اعمال شود، باید آن را در دامنهٔ چنین شرطی قرار دهیم: if(WIN32) # for Windows operating system in general endif() شما می‌توانید در بین این کد متغیری تعریف کنید، مسیر کتابخانه‌ای را شناسایی کنید و یا هر کاری که نیاز است مختص پلتفرم ویندوز اعمال شود را تنظیم نمایید. مثال برای شناسایی محصولات شرکت اپل، تحتِ سیستم‌عامل‌های macOS، iOS و حتی watchOS , tvOS if(APPLE) # for MacOS X or iOS, watchOS, tvOS (since 3.10.3) endif() مثال برای بررسی نوع سیستم‌عامل‌های یونیکس و لینوکس به غیر از محصولات اپل if(UNIX AND NOT APPLE) # for Linux, BSD, Solaris, Minix endif() یک شرط نسبتاً کامل‌تر به صورت زیر خواهد بود: if(APPLE) # for MacOS X or iOS, watchOS, tvOS (since 3.10.3) MESSAGE("Current platform is macOS!") elseif(Linux AND NOT APPLE) # for Linux and not Unix base such as macOS! MESSAGE("Current platform is Linux!") elseif(WIN32) # for Windows only! MESSAGE("Current platform is Windows!") elseif(UNIX AND NOT APPLE) # for Linux, Unix base Free-BSD, Solaris, Minix MESSAGE("Current platform is Unix!") elseif(ANDROID) # for Linux base, Android only! MESSAGE("Current platform is Android!") endif() مثال برای تشخیص بر اساس نوع کامپایلر، مختص پلتفرم ویندوز تحت Mingw، MSys و MSVC if(MSVC OR MSYS OR MINGW) # for detecting Windows compilers endif() روش‌های دیگری نیز برای مقایسه صریح دیگری وجود دارد، برای مثال عملگر STREQUAL می‌تواند گزینهٔ خوبی در تشخیص و اعمال شرط باشد. مثل مقایسه‌ای، در صورتی که نوع کامپایلر Clang باشد یا گزینه‌های دیگر: if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # using Clang elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # using GCC elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") # using Intel C++ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # using Visual Studio C++ endif() در این صورت می‌توان بر اساس تشخیص شناسهٔ کامپایلر عملیات مورد نظر را اعمال کرد. همچنین می‌توان از عملگر MATCHES در بررسی شرط استفاده کرد: if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") MESSAGE("MSVC") endif() این مقاله ادامه خواهد داشت...
  16. کامبیز اسدزاده

    اکنون ++C سریع‌ترین رشد را بین زبان‌های برنامه‌نویسی دارد

    مدتی قبل بود که من در رابطه با شاخص‌های در حال رشد زبان‌های برنامه‌نویسی در کانال‌های شخصی نظری داده بودم که با توجه به وضعیت شاخص، زبان‌ برنامه‌نویسی ++C سریع‌ترین رشد را بعد از مدت‌ها به خود اختصاص داده است. این تغییرات و بیداری زبان طبق انتظاری که داشتم بعد از ظاهر شدن زبان برنامه‌نویسی Rust در بین ۲۰ زبان برنامه‌نویسی برتر و همچنین نهایی شدن استاندارد‌های 2a و پیشرفت‌های اخیر به خصوص رضایت‌بخشی کاربران از استاندارد 17 زبان ++C رخ داده است که دور از انتظار هم نبود. طبق شاخص محبوبیت طی چند سال گذشته، ++C با توجه به شاخص TIOBE در سپتامبر، سریع‌ترین زبان در حال رشد در بسته برنامه‌نویسی است. این زبان در سال‌های گذشته، محبوبیت سهم خود را در فراز و نشیب‌ها داشته است. اما با مقیاسه با سال‌های گذشته در حال حاضر رسماً سریع‌ترین رشد را در بین تمامی زبان‌های تحت پوشش اتوماسیون QA در شرکت Tobie را دارد. با این حال مدیرعامل Tobie جناب Paul Jansen گفته است، من فکر می‌کنم که استاندارد جدید سی++ یکی از دلایل این رشد اصلی باشد. به خصوص ویژگی‌های جدید module که قرار است جایگزین مکانیزم وحشتاک قبلی شود. با این روند سی++ بیشترین رشد‌ها که متعلق به #C با ۱.۱۸+ و R با ۱.۳۳+ را شکست می‌دهد.
  17. کامبیز اسدزاده

    قرارداد شیوه‌های نام‌گذاری

    قراداد شیوه‌های نام‌گذاری در برنامه‌نویسی یا (Variable Naming Conventions)، یکی از مهم‌ترین مواردی است که در خوانا بودن کد موثر است. نام‌گذاری متغیر‌ها از یک ایدهٔ ساده پیروی می‌کند؛ برای مثال، ایجاد متغیر‌ها عملکرد آن‌ها را توصیف می‌کند و از یک موضوع ثابت در کد شما پیروی می‌کند. نام‌گذاری محدود شده به چند کلمه در این قرارداد به جدا سازی کلمات در یک نام متغیر بدون استفاده از فضای خالی (فضای سفید) است. فضای سفید معمولاً در تفسیر برای زبان‌های برنامه‌نویسی دشوار است. به همین دلیل متغیر‌ها باید به نوعی محدود شوند تا با چنین مشکلاتی مواجه نشویم. مثال‌ها در این قرارداد به صورت زیر هستند: قرارداد Snakecase: در این قرارداد کلمات با زیر خطی از هم جدا می‌شوند. variable_one variable_two مثال در تعریف متغیر از نوع string_view به شیوهٔ Snakecas // // Created by Kambiz Asadzadeh on 9/1/20. // Copyright © 2020 Kambiz Asadzadeh. All rights reserved. // #include <iostream> #include <string_view> int main() { //!creates a string_view object std::string_view string_input = { "I'm C++ 17\n" }; std::cout << string_input; return 0; } قرارداد Pascalcase: در این قرارداد کلمات با حروف بزرگ از هم جدا می‌شوند: VariableOne VariableTwo مثال در تعریف متغیر از نوع string_view به شیوهٔ Pascalcase // // Created by Kambiz Asadzadeh on 9/1/20. // Copyright © 2020 Kambiz Asadzadeh. All rights reserved. // #include <iostream> #include <string_view> int main() { //!creates a StringView object std::string_view StringInput = { "I'm C++ 17\n" }; std::cout << StringInput; return 0; } قرارداد Camelcase: در این قرارداد کلمات به جز کلمهٔ اول با حروف بزرگ از هم جدا می‌شوند: variableOne variableTwo مثال در تعریف متغیر از نوع string_view به شیوهٔ Camelcase // // Created by Kambiz Asadzadeh on 9/1/20. // Copyright © 2020 Kambiz Asadzadeh. All rights reserved. // #include <iostream> #include <string_view> int main() { //!creates a stringView object std::string_view stringInput = { "I'm C++ 17\n" }; std::cout << stringInput; return 0; } توصیه، سعی کنید همیشه از یک قرارداد نام‌گذاری تبعیت کنید. این قرارداد‌ها در بین برنامه‌نویسان رایج بوده و در خوانایی کد شما توسط خود و دیگران بسیار موثر است.
  18. کامبیز اسدزاده

    سریع‌ترین فریم‌ورک‌های وب!

    در این مقاله من قصد دارم به معرفی ده فریم‌ورک برتر جهان در بازهٔ سال‌های ۲۰۱۹ و ۲۰۲۰ اشاره کنم که در حوزهٔ صنعت وب کاربرد دارند. معمولاً در سایت‌ها، وبلاگ‌ها و گروه‌های تلگرامی حرف از فریم‌ورک‌های شناخته شده‌ای مانند Asp.net core و یا Laravel به گوش می‌رسد. اما واقعیت این است که فریم‌ورک‌هایی که در مورد آن‌ها بحث می‌شود جایگاه خاصی در بین فریم‌ورک‌های قدرتمند و به عنوانی ناشناخته مانند Drogon، h2o، ulib و غیره ندارند! جالب است بدانید فریم‌ورک‌هایی که در ادامه نام‌هایشان را می‌شنوید به قدری سریع و قدرتمند هستند که مو بر تنِ شما سیخ خواهد کرد! برای مثال در این مقایسه جایگاه فریم‌ورک‌های دات‌نت به بالاتر از ۵۰ و لاراول به بیشتر از ۲۰۰ رتبه می‌رسد! این در حالی است که بر خلاف انتظارِ عام، فریم‌ورک‌های تحت سی/سی++ و راست به عنوان سریع‌ترین فریم‌ورک‌ها شناخته می‌شوند. در واقع مقایسه بر اساس نتایج گرفته شده از مرجع Techempower می‌باشد که هر ساله یک مقایسه در رابطه با کارآیی و کیفیت فریم‌ورک‌های وب می‌پردازد. سنجشِ فوق بر اساس وظایفی مانند سریال‌سازی جی‌سان، دسترسی به پایگاه داده و عملیات سمت سرور، پردازش و غیره می‌باشد. در این آزمایش‌ها عملکرد فریم‌ورک بر روی سیستم‌عامل، به صورت فول‌اِستک و میکرو اندازه‌گیری شده است که هر کدام را در رتبهٔ خاصی از وضعیت آن سوق می‌دهد. بهترین فریم‌ورک‌ها از نظر بنچ‌مارک (کارآیی) در سال ۲۰۱۹ در دورِ ۱۸ بین ۲۲۰ فریم‌ورک متعلق به h2o و ulib بوده است. کتابخانهٔ h2o یکی از قوی‌ترین مواردی است که می‌توان به آن اشاره کرد. در سال ۲۰۲۰ این رتبه‌بندی به نفعِ فریم‌ورک جدید‌تری به نام دراگون (Drogon) و مجدداً ulib جمع بندی شده است که نشان می‌دهد فریم‌ورک ulib به عنوان یکی از برترین فریم‌ورک‌های نوشته شده تحت سی و سی++ و همچنین دراگون تحت استاندارد‌های ۱۴ و ۱۷ زبان برنامه‌نویسی سی‌پلاس‌پلاس معرفی شده است. بنابرین بهتر است در مورد دراگون بیشتر بدانیم: این فریم‌ورک تحت زبان برنامه‌نویسی ++C در استاندارد ۱۴ و ۱۷ توسعه یافته و بر روی سکو‌های لینوکس، مک و ویندوز قابل اجراست. دراگون تحت ویژگی non-blocking I/O کار می‌کند و سرعت را همراه با دقت بسیار بالایی به خصوص بر روی پلتفرم‌های FreeBSD تضمین می‌کند. لینک مخزن توسعه و کد‌های دراگون. مثال از کد اولیه: #include <drogon/drogon.h> using namespace drogon; int main() { app().setLogPath("./") .setLogLevel(trantor::Logger::kWarn) .addListener("0.0.0.0", 80) .setThreadNum(16) .enableRunAsDaemon() .run(); } با توجه به مقایسه‌های صورت گرفته در آزمایش‌های مختلف زیر رتبه‌بندی فریم‌ورک‌ها مشخص می‌شود. آزمایش‌های فوق بر روی پردازندهٔ Dell R440 Xeon Gold صورت گرفته است که در این لینک آمده است. JSON serialization Single query Multiple queries Fortunes Data updates Plaintext آزمایش‌های مربوطه تنها به ۱۰ مورد اول اشاره کرده است، بنابراین برای مشاهدهٔ لیست بیشتر و جزئیات آن‌ها به مرجع آن مراجعه کنید.
  19. با سلام و درود، نسخهٔ ۵.۱۵.۰ به عنوان یک نسخهٔ نهایی از سری کیوت ۵ همراه با ویژگی‌های بسیاری ارائه شد. این نسخه با هدف پشتیبانی کامل از ویژگیِ backward-compatible (پشتیبانی از عقب‌گرد) در نسخه‌های سری ۵ منتشر شده است. اما طبق شرایطی که اخیراً شرکت کیوت اعلام کرده است، این نسخه به دو روش پشتیبانی بلند‌مدت و عادی ارائه می‌شود. نکته‌ای که باید به آن توجه داشته باشید این است که نسخهٔ LTS صرفاً برای کاربران تجاری مورد استفاده قرار خواهد گرفت. بنابراین توسعه‌دهندگان جامعهٔ متن‌باز یا در واقع نسخهٔ رایگان از کیوت می‌بایست آن را به صورت نصب آنلاین دریافت کنند. و یا می‌توانید کُد‌منبع آن را دریافت کرده و خود آن را کامپایل نمایید. این نسخه شامل ویژگی‌ها و اصلاحیه‌های زیر می‌باشد: پشتیبانی از ویژگی‌های نسخه‌های قبلی تا قبل از نسخهٔ سری ۶. پشتیبانی از رابط‌های بک‌اندی ۳ بعدی و رندرینگ که می‌توان یکی از تغییرات بسیار مهم سری کیوت ۵ باشد که در ادامه به آن اشاره شده است. ماژول کیوت کوئیک ۳ بعدی (Qt Quick 3D) محیط Qt Design Studio ۱.۵ بهبود‌ها و تغییرات در ماژول Qt QML بهبود‌ها و تغییرات در ماژول Qt Quick و دیگر تغییرات و بهبود‌ها... پشتیبانی از ویژگی‌های نسخه‌های قبلی تا قبل از نسخهٔ سری ۶ کیوت ۵.۱۵ به عنوان یک پله به سمت کیوت ۶ می‌باشد. این در صورتی است که کیوت ۶ در حال تغییر و تحولات بسیاری خواهد بود که در این نسخه از کیوت ۵.۱۵ سعی بر آن شده است که آن را به آسانی ممکن سازد. بسیاری از عملکرد‌هایی مستهلک که نشانه‌گذاری شده‌اند در کیوت ۶ حذف خواهند شد. با توجه به این موارد، کیوت ۵.۱۵ هم به عنوان یک نسخهٔ کامل از سری ۵ و هم یک پیش شروعی از نسخهٔ سری ۶ محسوب خواهد شد. پشتیبانی از رابط‌های بک‌اندی ۳ بعدی و رندرینگ احتمالاً مهمترین تغییر در سمت گرافیک و موتور رندرینگ کیوت اتفاق افتاده است. تغییرات بسیاری در لایه‌های زیرین اتفاق می‌افتد که بلافاصله برای کاربران قابل مشاهده نیست. در سال گذشته کار بر روی پشتهٔ گرافیکی صورت گرفت که این به‌روز رسانی در کیوت سری ۶ متمرکز خواهد شد که در حال حاضر نیز در کیوت ۵.۱۵ به عنوان گزینه‌ای در دسترس است. تیم توسعهٔ کیوت پشته‌های گرافیکی را در کیوت ۵ به خوبی توسعه داده بود تا به صورت چند-سکویی از این رابط‌های گرافیکی سه بعدی استفاده شود. اما طی دو سال اخیر، تغییرات قابل توجهی در صنعت باعث شده است که توسعه و استقرار برنامه‌هایی که از گرافیک‌های سه بعدی استفاده می‌کنند پیچیده‌تر شود. از طرفی اول شروع به کار روی Metal کرد و مدتی پیش پشتیبانی از OpenGL را در macOS و iOS کاهش و منسوخ کرد. گروه Khronos تلاش کرده است تا OpenGL را با Vulkan جایگزین کند که راهی برای اندروید و لینوکس می‌سازد. از طرف دیگر رابط‌های Direct3D 12 مایکروسافت کاملاً بازنویسی شده‌ است و به هیچ وجه با نسخه‌های قدیمی آن سازگار نیست. البته این به این معنی نیست که OpenGL در آینده از بین می‌رود. با توجه به شعار و قول کیوت با عنوان «چند-سکویی» توسعه‌دهندگان کیوت به دنبال راه حلی هستند که این راه حل در همه جا کار کند. بنابراین برای رسیدن به این هدف، کمی بیشتر از یک سال پیش شروع به کار بر روی یک لایهٔ انتزاعی برای همهٔ آن‌ها تحت Api‌های مختلف کرده‌اند. این رابط سخت‌افزاری Qt Rendering Hardware Interface یا RHI نام دارد و می‌تواند برای اجرای برنامه‌های تحت فناوری کیوت کوئیک (Qt Quick) در بالای Metal، Direct3D و Vulkan و همچنین OpenGL استفاده شود. به عنوان یک پیش‌نمایش فناوری در کیوت ۵.۱۵ پشتیبانی می‌شود، در واقع می‌توانید با فعال‌سازی آن از طریق یک متغیر محیطی، از Qt RHI استفاده کنید. در نهایت در کیوت ۶ این لایه بخش بسیار مهمی از معماری کیوت را تشکیل خواهد داد. ماژول کیوت کوئیک ۳ بعدی (Qt Quick 3D) یکی دیگر از ویژگی‌های قابل توجه و جدید در کیوت ۵.۱۵ نیز مربوط به گرافیک است. در زمان آغاز کیوت سری ۵ فناوری Qt Quick را سنگ بنای معماری کیوت در نظر گرفته و معرفی شده است. تمرکز آن بر ساده‌سازی ایجاد رابط‌های کاربری ۲ بعدیِ مبتنی بر لمس بود. امروزه کیوت ۵.۱۵ با یک فناوری جدید‌تر به عنوان Qt Quick 3D نیز معرفی می‌شود، فلسفهٔ آن کاربری آسان و ادغام محتوای ۳ بعدی در برنامه‌های مبتنی بر فناوری Qt Quick می‌باشد. در واقع با استفاده از Qt Quick 3D می‌توانید به راحتی صحنه‌های سه بعدی را در QML تعریف کنید. می‌توانید نور، چراغ، مِش و مواد مورد نظر خود را در آن تعریف کرده و همه چیز را به راحتی با رابط‌های ۲ بعدی خود ترکیب کنید. در جاهایی که نیاز است رابط‌های ۲ بعدی و ۳ بعدی را به صورت جداگانه تعریف کنید، با توجه به این راه حل دیگر مشکلی در این رابطه وجود نخواهد داشت. محیط Qt Design Studio ۱.۵ فناوری کیوت کوئیک ۳ بعدی تعداد زیادی از گزینه‌ها را برای ایجاد یک برنامهٔ جدید و جالب شامل عناصر ۲ بعدی و ۳ بعدی را فراهم می‌کند. بنابراین تلاش‌های بسیاری در توسعهٔ محیط Qt Design Studio شده است، تمام این قابلیت‌ها در اختیار و دسترس طراحان قرار می‌گیرد. به همین دلیل این یک نکتهٔ قوت است که بگوییم پشتیبانی از فناوری کیوت کوئیک ۳ در این نسخه از محیط استودیو طراحی کیوت ارائه می‌شود. بهبود‌ها و تغییرات در ماژول Qt QML در این بخش کیوت توانسته است گزینهٔ required را برای کامپوننت نویسی ارائه کند. این‌ها گزینه‌هایی هستند که به صورت پیش‌فرض می‌تواند توسط کاربر برای اجزاء اعمال شوند. بنابراین کامپوننت‌ها از این پس می‌توانند به صورت درون خطی در یک سند QML معین شوند. در کنار این یک روش جدید برای اعلان و ثبت انواع در QML ارائه شده است. بهبودی در ابزار qmllint رخ داده است و به مراتب راجع به مشکلات احتمالی در پایهٔ کد‌های QML نتیجهٔ بهتری را خواهد داشت. بهبود‌ها و تغییرات در ماژول Qt Quick چند ویژگی جدید نیز در Qt Quick ظاهر شده است. پشتیبانی از فضاهای رنگی در عنصر Image اضافه شده‌است. عنصر جدیدی به نام PathText به Qt Quick Shapes اضافه شده است. کنترل اشاره‌گر‌ها در گزینهٔ cursorShape برای مدیریت شکل مکان‌نما در سیستم‌های دسکتاپی و یک آیتم HeaderView برای افزودن آسان هدر‌های افقی یا عمدی در TableView اضافه شده است. دیگر بهبود‌ها کاربران کیوت خوشحال خواهند شد که بدانند، اکنون می‌توانند پشتیبانی بسیار بهتری را در رابطه با ظاهر (دکوراسیون) پنجره‌های سفارشی داشته باشند که به شما این امکان را می‌دهد تا تزئینات پنجرهٔ خود را تعریف کرده و محتوای سفارشی را در فضای نوار عنوان پنجره‌ها اعمال کنید. ماژول Qt Lottie، ماژولی که به عنوان یک پیش‌نمایش در نسخهٔ ۵.۱۴ معرفی شده بود، اکنون به صورت کامل پشتیبانی می‌شود. این ماژول به شما امکان می‌دهد تا از انیمیشن‌های After Effect در برنامه‌نویسی مبتنی بر کیوت استفاده کنید. ماژول Qt WebEgine از کرومیوم نسخهٔ ۷۷ در ۵.۱۴ به کرومیوم ۸۰ به‌روز شده است و با تمامی ویژگی‌های جدید از به‌روز‌رسانی‌های کرومیوم همراه است. ماژول Qt 3D پشتیبانی از اشکال‌زدائی و چند ویژگی جدید و کوچکتر را به همراه دارد. ماژول Qt Multimedia، اکنون از چند سطح رندرینگ پشتیبانی می‌کند. در Qt GUI مقیاس‌بندی تصویر و روال تبدیل اکنون برای بسیاری از موارد چند رشته‌ای قابل استفاده است. ماژول Qt Network اکنون از نسخهٔ TLS 1.3 پشتیبانی می‌کند. در ماژول Qt Core، QRunnable و QThreadPool اکنون می‌توانند با std::function کار کنند و همچنین یک روش QFile::moveToTrash() برای انتقال فایل‌ها به داحل سطل زباله به صورت چند-سکویی فراهم شده است. در نهایت نیز پشتیبانی از دیالوگ (پنجره‌های گفتگو) بومی در اندروید اضافه شده است و نیازی نیست کد‌های اضافی در این بخش اعمال کنید.
  20. کامبیز اسدزاده

    قبلاً در این تاپیک توضیح داده شده.
  21. کامبیز اسدزاده

    سلام، در رابطه با آموزش‌های ویدیوئی، ان‌شاءال... در فرصت مناسبی همراه با پلتفرم فانوکس ارائه خواهند شد.
  22. امروز نسخهٔ جدید ۴.۱۲.۰ از کیوت‌کریتور منتشر شد که دارای ویژگی‌های مهم‌تری نسبت به نسخه‌های قبلی دارد. یکی از مهمترین مواردی که واقعاً مشکلات اساسی را در این نسخه پوشش می‌دهد حل مسائل مربوطِ به توسعه‌دهندگان کیت اندروید است. در این ویرایش محیط توسعهٔ اندروید به صورت خودکار برای توسعه‌دهنده پیکربندی می‌شود. فقط کافی است مسیر دقیق فایل‌ها را ارائه کنید. Qt Creator 4.12 =============== Qt Creator version 4.12 contains bug fixes and new features. The most important changes are listed in this document. For a complete list of changes, see the Git log for the Qt Creator sources that you can check out from the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline origin/4.11..v4.12.0 General ------- * Added `Restart Now` option when changing settings that require restart * Added option for linking Qt Creator to a Qt installation, sharing auto-detected Qt versions and kits * Added guard against crashing plugins at startup, providing the option to temporarily disable the offending plugin * Added locator filter for searching in Qt Project bug tracker * Added option to create custom URL template locator filters * Added browser for Marketplace items to Welcome mode (QTCREATORBUG-23452) * Fixed various theming issues Help ---- * Added tool button for changing target for context help (QTCREATORBUG-17667) * Added option to register documentation only for highest Qt version, and made that default (QTCREATORBUG-21482, QTCREATORBUG-22799, QTCREATORBUG-10004) Editing ------- * Added `Go to Last Edit` * Added option for default line terminator style (QTCREATORBUG-3590) * Improved behavior when splitting would hide text cursor * Fixed that wizards ignored default file encoding * Fixed that only restricted number of sizes were allowed for font size (QTCREATORBUG-22536) * Fixed completion after undo (QTCREATORBUG-15038) ### C++ * Fixed issue with Clang and precompiled headers (QTCREATORBUG-22897) ### Language Client * Added support for Markdown in tooltips * Added support for auto-formatting * Added outline dropdown (QTCREATORBUG-21916) * Improved protocol error reporting * Fixed `Ctrl-click` for `Follow Symbol Under Cursor` (QTCREATORBUG-21848) ### QML * Updated to Qt 5.15 parser (QTCREATORBUG-23591) * Improved support for multiple imports into same namespace (QTCREATORBUG-15684) * Added scanning of `app.qmltypes` and `lib.qmltypes` for type information * Fixed highlighting for new keywords in Qt 5.15 * Fixed reading of `qmltypes` from Qt 5.15 (QTCREATORBUG-23855) ### Python * Added wizards for Qt Quick Application and Qt Widgets Application with `.ui` file (QTCREATORBUG-21824) ### Diff Viewer * Added support for staging only selected lines (QTCREATORBUG-19071) Projects -------- * Added option to hide "disabled" files in Projects tree (QTCREATORBUG-22821) * Added option to filter output panes for lines that do not match expression (QTCREATORBUG-19596) * Added option for default build configuration settings (debug information, QML debugging, Qt Quick Compiler) (QTCREATORBUG-16458) * Added option to only build target for active run configuration (qmake & Qbs) * Added option to only stop the target of active run configuration on build (QTCREATORBUG-16470) * Added option for project specific environment (QTCREATORBUG-21862) * Added option to remove items from `Recent Projects` list in Welcome mode * Added option to start run configurations directly from target selector (QTCREATORBUG-21799) * Added option to build project for all configured kits (QTCREATORBUG-16815) * Added `-ensure-kit-for-binary` command line option that creates a kit for a binary's architecture if needed (QTCREATORBUG-8216) * Added GitHub build workflow to `Qt Creator Plugin` wizard template * Improved UI responsiveness while parsing projects (QTCREATORBUG-18533) * Fixed build directory after cloning target (QTCREATORBUG-23462) * Fixed copying of filtered text from output pane (QTCREATORBUG-23425) ### QMake * Improved renaming of files (QTCREATORBUG-19257) * Fixed handling of `object_parallel_to_source` (QTCREATORBUG-18136) * Fixed crash with circular includes (QTCREATORBUG-23567) * Fixed issue with renaming files (QTCREATORBUG-23720) ### CMake * Improved handling of `source_group` (QTCREATORBUG-23372) * Added support for `Add build library search path to LD_LIBRARY_PATH` (QTCREATORBUG-23464) * Added automatic registration of CMake documentation, if available (QTCREATORBUG-21338) * Fixed that `.cmake` directory was created in project source directory (QTCREATORBUG-23816) * Fixed issues with `snap` on Ubuntu Linux (QTCREATORBUG-23376) * Fixed handling of `Enable QML` in debugger settings (QTCREATORBUG-23541) * Fixed unneeded reparsing of files * Fixed code model issues with precompiled headers (QTCREATORBUG-22888) ### Qbs * Updated included Qbs version to 1.16.0 * Changed to use separate Qbs executable instead of direcly linking to Qbs (QTCREATORBUG-20622) * Added option for default install root (QTCREATORBUG-12983) ### Python * Added option to disable buffered output (QTCREATORBUG-23539) * Added support for PySide 5.15 to wizards (QTCREATORBUG-23824) ### Generic * Improved performance for large file trees (QTCREATORBUG-20652) * Fixed that only first line of `.cflags` and `.cxxflags` was considered ### Compilation Database * Fixed that project was reparsed if compilation database contents did not change (QTCREATORBUG-22574) ### Nim * Added support for Nimble build system * Added support for `Follow Symbol Under Cursor` Debugging --------- * Added option to hide columns from views (QTCREATORBUG-23342) * Added option for `init` and `reset` GDB commands when attaching to remote server * Fixed pretty printer for `std::optional` (QTCREATORBUG-22436) Analyzer -------- ### Clang * Improved filtering * Added `Analyze Current File` to `Tools` menu and editor context menu * Added context menu item that opens help on diagnostics ### CppCheck * Added option to trigger Cppcheck manually ### Chrome Traces * Added more details for counter items * Added option to restrict view to selected threads * Added information about percentage of total time for events ### Heob * Added support for settings profiles (QTCREATORBUG-23209) Qt Quick Designer ----------------- * Added locking and pinning of animation curves (QDS-550, QDS-551) * Added support for annotations (QDS-39) * Fixed dragging of keyframes in curve editor (QDS-1405) * Fixed crash when selecting icon (QTCREATORBUG-23773) * Fixed missing import options (QDS-1592) Version Control Systems ----------------------- ### Git * Added option to create branch when trying to push to a non-existing branch (QTCREATORBUG-21154) * Added option to start interactive rebase from log view (QTCREATORBUG-11200) * Added information about upstream status to `Git Branches` view * Added option to `grep` and `pickaxe` git log (QTCREATORBUG-22512) * Made references in VCS output view clickable and added context menu (QTCREATORBUG-16477) Test Integration ---------------- * Added support for colored test output (QTCREATORBUG-22297) ### Google Test * Added support for internal logging (QTCREATORBUG-23354) * Added support for `GTEST_SKIP` (QTCREATORBUG-23736) Platforms --------- ### Windows * Improved behavior with regard to MSVC tool chain matching and compatibility of MSVC 2017 and MSVC 2019 (QTCREATORBUG-23653) ### macOS * Fixed parsing of Apple Clang specific linker message (QTCREATORBUG-19766) * Fixed `Run in Terminal` and `Open Terminal` when user has different shell configured (QTCREATORBUG-21712) ### Android * Discontinued support for Ministro * Added auto-detection of Java JDK (QTCREATORBUG-23407) * Added option to automatically download and install required Android tools (QTCREATORBUG-23285) * Added option to register multiple NDKs (QTCREATORBUG-23286) * Added automatic selection of correct NDK for Qt version (QTCREATORBUG-23583) * Added option to download and use [OpenSSL for Android](https://github.com/KDAB/android_openssl) (QTBUG-80625) * Added support for Android 11 with API level 30 * Improved examples browser to only show items tagged with `android` (QTBUG-80716) * Improved manifest editor (QTCREATORBUG-23283) * Fixed issues with latest SDK r29 (QTCREATORBUG-23726) * Fixed several issues with AVD manager (QTCREATORBUG-23284, QTCREATORBUG-23448) * Fixed that some essential packages were not installed (QTCREATORBUG-23829) * Fixed that ABI selection in build configuration did not persist (QTCREATORBUG-23756) ### iOS * Improved examples browser to only show items tagged with `ios` ### Remote Linux * Added option to use custom command for install step (QTCREATORBUG-23320) * Added option to override deployment data (QTCREATORBUG-21854) ### Bare Metal * Added support for RL78 architecture * Added support for J-Link and EBlink GDB servers * Added support for KEIL uVision v5.x debugger ### MCU * Added auto-registration of documentation and examples (UL-1685, UL-1218) * Switched to MCUXpresso IDE instead of SEGGER JLink for NXP kits (QTCREATORBUG-23821) * Fixed issues with desktop kit (QTCREATORBUG-23820) * Fixed issues with RH850 (QTCREATORBUG-23822)
  23. با توجه به عنوان مقاله، شباهت‌های بسیاری بین std::string_view و std::span وجود دارد، در واقع، string_view و span اشیاء‌ای هستند که به یک ترتیبِ به هم پیوسته از عناصری اشاره دارند که نقطهٔ آغازین آن‌ها از موقعیت صفر است؛ و همچنین عملیات استاندارد نگه‌دارنده‌ها (ظرف) را ارائه می‌کنند. هر دو نوع شیء از نوع easy-to-copy (کپی آسان) هستند که دارای یک اشاره‌گر و یک عنصر اندازه هستند. از نظر مفهومی، آن‌ها دیدگاه‌های غیر صاحب یک آرایه (یا دنبالهٔ پیوسته) هستند که رابط استاندارد غنی‌ای را ارائه می‌کنند. در مورد تفاوت‌ها (اختلافات) بین این دو، <std::span<T یک الگوی نمایش آرایه‌ای با هدف کلی است، در حالی که std::string_view یک نمایش تخصصی‌تر در یک دنباله‌کاراکتر یا رشته است. در زیر شرح مختصری از این تفاوت‌ها آورده شده است: شیء span یک قالب (Template) است، اما string_view خیر! شیء span، الگویی است که با هر نوعِ تعریف شده توسط کاربر کار می‌کند، در حالی که string_view به طور خاص نمای یک آرایهٔ مشخص پیوسته است. از نظر سطحی یک string_view معادل <span <char است. char buff[] = "Hello World"; auto sp = std::span<char>(&buff[0], 5); auto sv = std::string_view(&buff[6], 5); for(auto c : sp) std::cout << c; //Hello std::cout << " "; for(auto c : sv) std::cout << c; //World اما، ویژگی‌های string_view بیشتر از این مورد می‌تواند باشد. شیء string_view یک نوع فقط خواندنی برای نمایش است. یکی از ویژگی‌های برجستهٔ string_view این است که این شیء فقط یک نمایش فقط خواندنی است. بنابراین، ما نمی‌توانیم یک آرایهٔ زیرین را از طریق یک string_view تغییر دهیم، در حالی که این امکان از طریق span ممکن است: char str[] = "hello"; //Change str to uppercase through span auto sp = std::span<char>(str,strlen(str)); std::transform(sp.begin(), sp.end(), sp.begin(), [](char c) { return std::toupper(c); }); //str is now HELLO //Back to lowercase via string_view is not possible. auto sv = std::string_view(str); std::transform(sv.begin(), sv.end(), sv.begin(), [](char c) { return std::tolower(c); }); //ERROR! اگر string_view فقط خواندنی باشد، طول آن به اندازهٔ کافی انعطاف‌پذیر است که از طریق <span <const T به یک نمایش فقط خواندنی تبدیل می‌شود. بنابراین یک string_view به یک <span <const char نزدیک‌تر است. البته یک ویژگی وجود دارد که string_view را تضمین می‌کند. شیء string_view از عملیات std::string-like پشتیبانی می‌کند. شیء span دارای چندین عملیات متوالی پیوسته است، به عنوان مثال: front, back, begin و operator[]. با این حال، string_view چندین روش دیگر مانند std::string دارد، به عنوان مثال: substr, find, compare سربارگذاری اپراتور‌ها (مانند == و < یا >). بنابراین، string_view می‌تواند نیازِ به std::string را در مواردی که فضای زیرین آن مهم نیست را از بین ببرد.
  24. با سلام و درود، نسخهٔ ۵.۱۴.۰ به عنوان یک نسخهٔ ما قبل نهایی از ۵.۱۵ همراه با ویژگی‌های بسیاری ارائه شده است که در این میان ویرایش ۵.۱۴.۲ بعد از ۵.۱۴.۱ با برخی از بهبود‌ها و حل مشکلات گزارش شده منتشر شد. برخی از ویژگی‌های بسیار کاربردی که به کمک دوستان عزیز، @سروش ربیعی و @hamed_masafi به کتابخانهٔ QCalendar افزوده شده است. و از این نسخه به بعد امکان استفاده از تاریخ شمسی در کیوت فراهم می‌شود. شما می‌توانید این نسخه از کتابخانه را در این بخش دریافت کنید. یک مثال ساده: #include <QCoreApplication> #include <QCalendar> #include <QDate> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QCalendar cal(QLatin1String("jalali")); qDebug() << "availableCalendars=" << QCalendar::availableCalendars(); QString todayJalali = QDate::currentDate().toString("yyyy-MM-dd", cal); qDebug() << "Today in jalali calendar=" << todayJalali; QDate d(1398, 10, 15, cal); qDebug() << "Date 1398/10/15 in julian calendar=" << d.toString(); return a.exec(); } ویژگی‌های جدید به صورت زیر می‌باشند: ماژول Qt3d Threading architecture overhaul (removal of aspect thread) Frontend/Backend node sync overhaul QTransform now has access to the world matrix Introduction of Scene3DView Scene3D is now in sync with QtQuick Scene3D can now render as an underlay without FBO ماژول Qt Bluetooth [QTBUG-40698] Optional win32 backend to support Windows 7 and 8. Backend is not built by default and not part of the prebuild packages though. QLowEnergyController: Introduce AuthorizationError [QTBUG-76615] Ability to have multiple manufacturer data per manufacturer ID ماژول QtCore QCalendar adds support for Calendars other than Gregorian, by implementation of suitable back-ends. Back-ends to implement the Gregorian, Jalali (Persian), Islamic Civil, Milankovic, and Julian calendars. We look forward to other contributions. [QTBUG-14150] Qt is now relocatable, i.e. it's possible to move the Qt installation without breaking functionality or loading of plugins. ماژول Qt GUI QColorConstants provide constexpr QColor instances that don't cost any runtime overhead Updated High-DPI support. Applications can now opt-in to use non-integer scale factors, for example Windows at 150%. Use QGuiApplication::highDpiScaleFactorRoundingPolicy or QT_SCALE_FACTOR_ROUNDING_POLICY to set the rounding policy. Added the QT_ENABLE_HIGHDPI_SCALING environment variable which enables high-dpi scaling based on display DPI. Replaces QT_AUTO_SCREEN_SCALE_FACTOR (now deprecated), and corresponds to the Qt::AA_EnableHighDpiScaling application attribute. The QT_FONT_DPI environment variable is now supported cross-platform, for the purpose of developing and testing with specific DPI values. Color-space support for images. Reading and writing color-spaces from JPEG, PNG, WebP and TIFF images, and performing color-space transformation on images. QTextDocument/QTextTable now support per-edge border styling via QTextTableCellFormat border-collapse mode HTML table style import (partial) and export QTextDocument supports reading and writing Markdown format, as an alternative to HTML. If you read HTML and write Markdown, or vice-versa, the formatting should be preserved to the extent that the CommonMark and GitHub specs allow (including headings, tables, bullet lists, block quotes and code blocks); but we don't guarantee all cases yet, because it's thinly tested so far. ماژول Qt Multimedia Added QVideoFrame::Format_YUV422P. Introduced support of GStreamer OpenGL plugin. ماژول Qt Network HTTP/2 configuration API Network connectivity monitoring [QTBUG-1538] Support Kerberos Proxy Authentication ماژول Qt QML Added qmlRegisterSingletonInstance function. This allows to expose a QObject as a singleton to QML, without having to create a factory function as required by qmlRegisterSingletonType. It is meant as a type safe replacement of setContextProperty in common usages. Added qmlRegisterAnonymousType as a replacement for qmlRegisterType. It allows to specify the URI and major version, which enables better tooling support. qmllint gained an experimental -U option. If run with it, it warns about accesses to unqualified identifiers ماژول Qt Quick Added the first preview of the graphics API independent scenegraph renderer as an opt-in feature. This allows running qualifying Qt Quick applications on top of Vulkan, Metal, or Direct3D 11 instead of OpenGL. The supported platforms are currently Windows 10, Linux with X11 (xcb), macOS with MoltenVK, or Android 7.0+ for Vulkan, macOS for Metal, Windows 10 for D3D. Text and TextEdit now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML. Includes the GitHub checklist extension, such that you can click to toggle checkboxes in a TextEdit. TextEdit uses an I-beam cursor by default, and a pointing-hand cursor when hovering a checkbox or a link. You can still override the default cursor, though. Added WheelHandler, an Event Handler for the mouse wheel, and optionally for emulated mouse wheel events coming from a trackpad. Added BoundaryRule in Qt.labs.animation: a PropertyValueInterceptor that restricts the range of values a numeric property can have, applies "resistance" when the value is overshooting, and provides the ability to animate it back within range. It's particularly useful in combination with WheelHandler, to provide similar physics as Flickable has. Event Handler base classes such as QQuickSinglePointHandler and QQuickMultiPointHandler have private implementation, while the classes themselves are suitable for subclassing, and are exported. They do not have supported public C++ API yet, but we encourage you to experiment with subclassing them anyway using the private API. They are intended to become public at some point in Qt 6 (and we can continue to iterate the API until then, especially to keep up with upcoming changes to the QEvent classes in Qt 6). Image and BorderImage now have the same currentFrame and frameCount properties that AnimatedImage has; this allows choosing an individual ic ماژول Qt SerialBus [QTBUG-72979] Added operators to compare QCanBusDevice::Filter for equality or inequality. [QTBUG-70449] Added the QCanBusDevice::OperationError and QCanBusDevice::TimeoutError codes to signal wrong operation respectively timeout errors. [QTBUG-70766] Added the function QCanBusDevice::busStatus() to query the CAN bus status from the CAN bus device. [QTBUG-54943] Added the function QCanBusDevice::resetController() to reset a CAN controller from bus off state. [QTBUG-75204] SocketCAN: Added the configuration parameter QCanBusDevice::ProtocolKey to use another protocol inside the protocol family PF_CAN. [QTBUG-54296] SocketCAN: If libsocketcan is available, the CAN bus bitrate can be get and set at runtime. PeakCAN: Added support for PCAN-USB devices on macOS by using the MacCAN library. [QTBUG-75405][QTBUG-76232] Expose the underling QIODevice used for Modbus communication, e.g. for setting the serial port hardware flow control (RTS/CTS). ماژول Qt WebEngine Updated to be based on Chromium 77 [QTBUG-74166] New API for control of QWebEnginePage life-cycle [QTBUG-56978] Methods and properties for download item to get suggested name, and change the download directory and file name [QTBUG-50420] New findTextFinished signal and corresponding QWebEngineFindTextResult and FindTextResult types to get extra information about the result of a text search [QTBUG-55110][QTBUG-51176] Added methods to QWebEngineCertificateError to asynchronously handle an error, and get a chain of digital certificates ماژول Qt Widgets QTextEdit and QTextBrowser now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML. Includes the GitHub checklist extension, such that you can click to toggle checkboxes if the widget is editable. QTextBrowser::setSource() detects Markdown based on the file extension. تغییرات در پلتفرم اندروید Android needs NDKr20+ Added multi ABI build in one go. By default it will build for all android supported abis (arm64-v8a, armeabi-v7a, x86_64, x86). The user can control which ABIs he wants to use via ANDROID_ABIS qmake variable. Added support for the new AAB package format, which allows deploying a single application bundle to Google Play which contains binaries for all supported ABIs. ماژول جدید Qt Quick Timeline کیوت برای اتوماسیون Qt KNX Extended support for KNXnet/IP Core V2 (discovery, tunneling, routing, security) Qt MQTT Added support for using QSslConfiguration when connecting encrypted Added autoKeepAlive property to enable manual connectivity checks Qt OPC UA Added tech preview for GDS client support Updated 3rdparty open62541 to version 1.0 Qt CoAP The module leaves the Tech Preview status behind and an API commitment is given.
  25. کامبیز اسدزاده

    این یک Log است.
×
×
  • جدید...