-
تعداد ارسال ها
505 -
تاریخ عضویت
-
روز های برد
266
پست ها ارسال شده توسط کامبیز اسدزاده
-
-
سلام و درود،
این پست صرفاً جنبهٔ مشاوره و به اشتراک گذاری تجربیات را دارد (بنابراین نحویِ بیان آن عامیانه است).
من @کامبیز اسدزاده : Kambiz Asadzadeh : علاوه بر برنامهنویسی و علاقهٔ شدیدی که دنیای تکنولوژی و مخصوصاً مهندسی کامپیوتر و به ویژه برنامهنویسی در حوزهٔ استارتآپی دارم، سالهاست که به عنوان منتور فنیِ استارتآپها در رویدادها، جلسات و دورههمیهای بسیاری شرکت و در محور رُشد فردی فنی فعالیت به استارتآپهای بسیاری کمک کرده ام.
با توجه به منتورینگ انواع مختلف استارتآپها در حوزههای IT مشکلات، سوالات و موارد بسیاری رو شناسایی و برای آنها راهکارهایی رو ارائه دادهام که به نوبهٔ خودم برخی از آنها را در اختیار شما قرار خواهم داد.
بهتره قبل از هر چیز تعریفی از منتور (Mentor) و منتورینگ داشته باشیم! بنابراین مقالهٔ زیر را حتماً مطالعه کنید.
حال با توجه به تجربیات مربوط به این حوزه، لازم دونستم بخشی از این راهکارها رو در اختیار کسانی قرار بدم که مُدام در ذهن خود دنبال پاسخی برای چگونکیهای رسیدن به یک مهارت مطلوب فردی هستن.
مدتی هست من در گروهها و شبکههای اجتماعی بسیاری مشاهده میکنم که افراد تازه کار به دنبال این هستند که چگونه و به چه شیوهای میتونن برنامهنویسی حرفهای و مفید را یاد بگیرند. پاسخ این سوال پیچیده نیست، اما شاید خصوصیاتی را که باید بر روی آنها تمرکز داشته باشید رو به خوبی نمیشناسید! من به شما کمک میکنم تا در این مسیر مسائلی که واقعاً باید به آنها دقت کنید رو شناخته و اونها رو در نظر بگیرید.
نقل قولقبل از هرچیز به خصوصیات و پیشزمینههایی که برای حرفهای شدن در برنامهنویسی نیاز دارید اشاره میکنم.
خصوصیات یک برنامهنویس حرفهای چیست؟
- علاقه و استعداد در حوزهٔ برنامهنویسی (داشتن ارادهٔ قوی).
- سِمِج و کُنجکاو بودن.
- شکست ناپذیر (خستگی ناپذیر).
- مخالف هر گونه بهانه و تنبلی - به کار گیری روشهای صحیح حل مسائل و رسیدن به پاسخ سوالات.
- رقابت با هیچکس به جز دیروز خودِت! (رقیبت باید خودت باشی نه شخصِ خاصی) از دیگران الگو بگیر اما با کسی به جز خودت رقابت نکن.
- کم توقع از لحاظ کمک گرفتن از دیگران بر روی مسائل ساده باش (پر توقع از لحاظ رسیدن به پاسخ با تلاشهای فردی باش).
- تعصب نداشتن بر یک حوزه یا زبان یا هر ابزاری (زبانهای برنامهنویسی لوازم و ابزارهای جعبهابزار یک برنامهنویس هستند).
- هدف داشتن (هدف مفید - نه مُخرب).
- آینده نگر بودن (همیشه احتمالات رو در نظر بگیر و چشم بسته دنبال چیزی نباشید) و حرف هر کسی رو در بیان اول بدون تحقیق (سند) قبول نکن. حرف شنوی و استفاده از تجربیات دیگران بسیار خوب هست (اما باید مطمئن باشید که اون پیشنهاد صحیح هست نه غلط!) حالا ممکن پیشنهاد دهنده استاد دانشگاه باشه یا میتونه یکی از ما داخل شبکههای اجتماعی باشه! (بهتره دنبال منتور باشید).
- همیشه یک قدم از چیزی که هستید جولو تر باشید.
- حرفهای باش! حرفهایهای برنامهنویسی رو با اخلاقِ خوبشون باید شناخت.
- عدم حسادت و غرور در آموزشِ آموختهها و تجربیات یکی از بهترین نکات حرفهای بودن است.
نقل قولزبانهای برنامهنویسی ابزارهای یک برنامهنویس هستند (هرچقدر تعداد ابزارهای شما بیشتر و متنوعتر باشه، قدرت مانور شما بیشتر خواهد بود).
من چطور میتونم یک برنامهنویس حرفهای بشم؟
پاسخ، با توجه با خصوصیات بالا، یک برنامهنویس با تلاش مستمر و متکی به دانش و مستندات صحیح میتونه با مرور زمان مهارت خودش رو افزایش و تجربیات و سوابش و رزومش رو قوی کنه. به هیچ عنوان راه صد ساله را یک شبه نمیتونه بره!
نقل قولبهترین اُستاد برای من خودم بودم!
نقل قولهیچ مهارتی به سادگی به دست نمیاد!
آیا دانشگاه در برنامهنویسِ مفید شدن مهم است؟
این سوال بسیار زیاد به گوش میخوره، اما حقیقت اینه که دانشگاه به عنوان یک ابزار ساخت و پیشرفت فردی بشما نمیاد! متاسفانه دانشگاهها و دانشجویانی که با هدف التماس به اساتید و دیگر افراد به دنبال پاس کردن دروس دانشگاهی هستن هیچ شانسِ موفقیتی در رسیدن به یک حرفهای شدن رو ندارن! نتیجهٔ این شیوه از یادگیری و آموزش چیزی به جز فارغالتحصیل شدن همراه با یک کاغذ پاره نخواهد بود و هیچ جایی در بازار و دنیای واقعی نخواهد داشت.
نقل قولتحقیق و پژوهش رو انجام بدین و توسط اون کمک کنید تا نظام آموزشی مسیر درستی رو دنبال کنه.
البته منظور از این صحبتها این نیست که دانشگاه مفید نبوده و تاثیری در موفقیت نداره، اما حقیقت اینه که علم واقعیِ برنامهنویسی با توجه به نظام آموزشی و شرایطی که وجود داره به دست نمیاد.
چطور میتوانم به پاسخ سوالاتی که دارم برسم؟
خوشبختانه دنیای مُدرن امروزی زمینهای برای برقراری ارتباط بین یکدیگر را به خوبی فراهم کرده، در صورتی که شما سعی خودتون رو کردین اما نتونستین مشکلی که با اون مواجه شدین رو حل کنید، جای نگرانی نداره! همهٔ ما یک استاد مشترک داریم (اسمش گوگل Google) هست. شما میتونید با جستجو در این موتور جستجوگر به ۱۰۰٪ پاسخهای خود برسید.
نکته: سعی کنید سوالات خودتون رو به زبان علمی بپرسید (انگلیسی) حتی اگه زبان شما دست و پا شکسته باشه درصد موفقیت و رسیدن به پاسخ بهتر و سریعتر در این حالت بسیار زیاده. بنابراین شما میتونید پاسخ سوالات خودتون رو خیلی راحت با چند کلمهٔ مشخص بپرسید مثل نمونههای زیر:
Why should I learn C++ in 2019?
How to declare an array in C++?
How to declare a string in Java?
Why do we need pure virtual function in C++?
How do I create a class in Visual Studio 2017?
How long will it take to learn Python?
مطمئن باشید جستجوگر گوگل تحت هوش مصنوعی خودش بهترین و نزدیکترین پاسخها رو نسبت به سوال شما پیشنهاد خواهد داد! این کار باعث میشه حتی شمایی که به سوال پُرسی مغرور هستید یا حتی شمایی که به خودتون زحمت نمیدین جستجو کنید به راحتی به پاسخهایی برسید که قراره اون رو از کسی بپرسید!
نقل قولهرکسی که کار با گوگل رو بلد نباشه بهتره دوره برنامهنویسی خط بکشه! این مهارت به عنوان یک مهارت لازمهٔ زندگی در دنیای مدرن امروزی است.
یک برنامهنویس حرفهای رو چطور میشه شناخت؟
یک برنامهنویس حرفهای ادعای تو خالی ندره! هر زمان که دیدین یک برنامهنویس از دانش خودش ادعا میکنه مطمئن باشید اونوطور که باید به تکامل نسبی در این علوم نرسیده! دنیای برنامهنویسی نامحدود و بسیار گسترده هست.
نقل قولیک برنامهنویس حرفهای هیچ ادعایی از خود نداره به جز عمل و انتقال اون به دیگران!
برنامهنویسِ حرفهای معمولاً مشتاق به آموزش و یاری دیگران هم داره، معمولاً از تجربیات حرفهای خودشون در اختیار دیگران قرار میدن. البته این بستگی به شرایط هم داره (ممکنه کسی به خاطر مشغلهٔ زندگی روزمره) نتونه اونطور که باید به دیگران کمک کنه (شاید هم اصلاً علاقهای به یاد دادن نداره ) شاید هم اعتماد به نفس کافی نداشته باشه که همهٔ اینها طبیعی است.
نقل قولبه خودت اعتقاد و اطمینان داشته باش! اعتماد بنفس رو تقویت و مهارتت رو به دیگران انتقال بده.
مغرور هم نباش!
اما Github و سایتهای مرجع، مقالات، کتابها و نمونهکارها نیز نمونه مثال خوبی برای پیدا کردن منابع به اشتراکگذاری چنین افرادی هست که میتونه در شناخت مهارتهاش ملاک باشه.
نقل قولنکته: نمونه کار و رزومهٔ کاری (واقعی و عملی) نشاندهندهٔ تجربه و مهارت شماست نه مدرک و کاغذپارههای دانشگاهی.
نقل قولتوجه داشته باشید که بزرگترین افراد تاثیر گذار در جهان همشون انصراف دهندهٔ دانشگاه بودن چون فضای محدود دانشگاهی مانع پیشرفت بوده.
صحبتهای شخصی مثل استیو جابز رو در کنفرانس Stanford سال ۲۰۰۵ پیگیر باشید ببینید تنها رابطش با دانشگاه چی بوده. البته منظورم این نیست که خدایی نکرده دانشگاه رو بیخیال بشید خیر! چون خیلیها خصوصیات بالارو ندارند و بهتره تشریف ببرن دانشگاه و همونجا شاید به کمک کاغذ پاره یه چیزی شدن رضایت به یک حقوق کارمندی هم دلیل بدی نیست...! اما اگه میخوای دنیا رو بسازی باید فراتز از چهارچوب محدودی که برات ساختن تفکر کنی!
خلاصهٔ این صحبتها از نظر من = تلاش مکرر در قالب (خودآموزی) هست باید به خودت، فرصت و نعمتی که خالقِت بهت داده اطمینان و اعتقاد داشته باشی).
نقل قولهر چیزی هم که یاد گرفتی بخشی از اون رو به دیگران یاد بده (غرور علمی نداشته باش) اما تاکید بر اصلاح کردن داشته باش و اون رو به دیگران یاد بده.
إنَّ لِكُلِّ شَيءٍ زَكاةً ، وزَكاةُ العِلمِ أن يُعَلِّمَهُ أهلَهُ.
امام صادق عليه السلام:
هرچيزى زكاتى دارد و زكات دانش، آموختن آن است به اهلش.
به فرموده رسول خدا (صلی الله علیه و آله): یا عالم باش یا در حال آموختن دانش و وقت خود را در بیهودگی و خوشگذرانی صرف نکن.
نظرات دیگر...
آنتونی جی. دی آنجلو: اشتیاقتان برای یادگیری را توسعه دهید، تا هرگز در راه رشد و تعالی متوقف نشوید.
آلبرت اینشتین: تنها چیزی که در یادگیری من تداخل ایجاد میکند، تحصیلاتم است.
وینستون چرچیل: من شخصا همیشه آماده یادگیری هستم، اگرچه دوست ندارم همیشه تحت تعلیم باشم.
افلاطون: دانشی که همراه با اجبار کسب شود در ذهن نمیماند.
Education is the most powerful weapon which you can use to change the world. - Nelson Mandela
I have no special talent. I am only passionately curious. - Albert Einstein
A person who won't read has no advantage over one who can't read. - Mark Twain
نقل قولHowever, success comes only to those who believe in themselves and are prepared to win.
Good Luck.
احتمال بهروز رسانی و ادامهٔ این پست وجود دارد...
- 5
-
ابزار 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 به بعد در دسترس قرار گرفته است.نقل قولکتابخانههای اشتراکی (پویا) به صورت
libc++_shared.so
و کتابخانههای ایستا (استاتیکی) در قالبlibc++_static.a
میباشند.برخی از تغییرات مهم که لازم است به آنها توجه شود به صورت زیر میباشند:
- تغییرات اساسی از نسخهٔ 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 استفاده میکنید این کار به صورت خودکار انجام میشود.- 1
-
نسخهٔ Qt Creator 4.8.1 منتشر شد.
تغییرات و بهودها:
Qt Creator version 4.8.1 contains bug fixes. 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/v4.8.0..v4.8.1 General * Fixed too large minimum size of preferences dialog (QTCREATORBUG-21678) Editing * Fixed that text marks could vanish (QTCREATORBUG-21628) * Fixed wrong background color for some text highlighting items (QTCREATORBUG-21661) * Fixed handling of system text encoding on Windows (QTCREATORBUG-21622) * Language Client * Fixed crash after failed server restarts (QTCREATORBUG-21635) All Projects * Fixed crash when renaming file in file system view (QTCREATORBUG-21741) * Fixed that `Create suitable run configurations automatically` setting was not saved (QTCREATORBUG-21796) QMake Projects * Fixed handling of `unversioned_libname` (QTCREATORBUG-21687) C++ Support * Clang Code Model * Fixed Clang backend crashes when `bugprone-suspicious-missing-comma` check is enabled (QTCREATORBUG-21605) * Fixed that `Follow Symbol` could be triggered after already moving to a different location * Fixed tooltip for pointer variables (QTCREATORBUG-21523) * Fixed issue with multi-line completion items (QTCREATORBUG-21600) * Fixed include order issue that could lead to issues with C++ standard headers and intrinsics * Fixed highlighting of lambda captures (QTCREATORBUG-15271) * Fixed issues with parsing Boost headers (QTCREATORBUG-16439, QTCREATORBUG-21685) * Clang Format * Fixed handling of tab size (QTCREATORBUG-21280) Debugging * Fixed `Switch to previous mode on debugger exit` (QTCREATORBUG-21415) * Fixed infinite loop that could happen when adding breaking on non-source line (QTCREATORBUG-21611, QTCREATORBUG-21616) * Fixed that debugger tooltips were overridden by editor tooltips (QTCREATORBUG-21825) * Fixed pretty printing of multi-dimensional C-arrays (QTCREATORBUG-19356, QTCREATORBUG-20639, QTCREATORBUG-21677) * Fixed issues with pretty printing and typedefs (QTCREATORBUG-21602, QTCREATORBUG-18450) * Fixed updating of breakpoints when code changes * CDB * Fixed `Step Into` after toggling `Operate by Instruction` (QTCREATORBUG-21708) Test Integration * Fixed display of UTF-8 characters (QTCREATORBUG-21782) * Fixed issues with custom test macros (QTCREATORBUG-19910) * Fixed source code links for test failures on Windows (QTCREATORBUG-21744) Platform Specific Android * Fixed `ANDROID_NDK_PLATFORM` setting for ARMv8 (QTCREATORBUG-21536) * Fixed debugging on ARMv8 * Fixed crash while detecting supported ABIs (QTCREATORBUG-21780)
برای دریافت کلیک کنید.
-
سلام،
این تاپیک صرفاً جهت بازبینی و رقابت بین کدهای نوشته شده توسط شما است، شما میتوانید سَبکِ تمیزنویسی (استایلِ) کدهای خود را برای معرفی به دیگران در این بخش به اشتراک بگذارید.
کدهایی که از لحاظ خوانایی و پاکی و فاقد باگهای احتمالی هستند امتیاز مثبت و کدهایی که فاقد آن باشند امتیاز منفی خواهند گرفت.
-
در 12 ساعت قبل، er.khanaki گفته است :سلام به همه دوستان.
یک کلاس سی داریم که ارتباط سریال رو انجام میده و من با این کد
qmlRegisterType<serialPort>("io.qt.Serial.SerialPort", 1, 0, "SerialPort");
کلاس سی رو نمونه سازی کردم در qml.مشکل اینجاست که چطور زمانی که در سی و توسط پورت سریال اطلاعاتی رو دریافت کردم textarea در qml مقادیر رو نمایش بده.
کد دریافت از سریال در کلاس سی ++
QString serialPort::getData() { QByteArray serialData; QString serialBuffer = ""; serialData = _serialport->readAll(); serialBuffer = QString::fromStdString(serialData.toStdString()); qDebug() << serialBuffer; return serialBuffer; }
textarea in qml
Rectangle { id:containerTextArea width: parent.width anchors.top: container.bottom anchors.bottom: btnClearTextCommunication.top color: "#e0e0eb" TextArea { id:txtCommunication anchors.fill: parent; readOnly: true } }
نمونه سازیم کلاس سی++
SerialPort { id:serialport }
سلام،
تابع
getData
رو باید برای کیوامال فراخوانی کنید.قبل از تابع بهتره
Q_INVOKBLE
رو قرار بدی تا بتونی تحت QML بهش دسترسی داشته باشی.اگر که توابع شما همانطور که به نظر میاد پیچیده هستند از آموزش زیر الگو بگیرید.
-
در 12 ساعت قبل، Farideh گفته است :سلام،
در qml جدولی دارم که با ارث بری ازlistView
ایجاد شده و علاوه بر اطلاعات اعداد حاوی اطلاعات تصویر هم هست. برای گزارشگیری از این جدول به صورت pdf باید تصاویر و نوشتههایی به عنوان سربرگ اضافه کنم. برای الصاق تصاویر و گزارشگیری از این جدول به صورت pdf چه راهی در qml پیشنهاد میکنید؟شما میتونید در کیوت از توابعی مثل
drawImage
از کلاسQPainter
در ++C استفاده کنید و نتیجهٔ اون رو با استفاده از تابعgrabToImage
در سمت QML بسازید.قبل از هر چیز ماژول پرینت رو فعال کنید، برای این کار داخل فایل
.pro
این کد رو اضافه کنید.QT += printsupport
سپس کلاسی بسازید، مثلاً کلاس PrintAction به صورت زیر:
#ifndef PRINTACTION_H #define PRINTACTION_H #include <QObject> #include <QVariant> class PrintAction : public QObject { Q_OBJECT public: PrintAction(); Q_INVOKABLE void print(const QVariant &data); }; #endif // PRINTACTION_H
#include "printaction.h" #include <QPrinter> #include <QPainter> #include <QPrintDialog> PrintAction::PrintAction() { } void PrintAction::print(const QVariant &data) { QImage img = qvariant_cast<QImage>(data); QPrinter printer; QPrintDialog *dlg = new QPrintDialog(&printer,nullptr); if(dlg->exec() == QDialog::Accepted) { QPainter painter(&printer); painter.drawImage(QPoint(0,0),img); painter.end(); } }
فایل main.cpp به این صورت خواهد بود:
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QApplication> #include <QQmlContext> #include "printaction.h" #include <QtPlugin> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv); QQmlApplicationEngine engine; //Register C++ class for QML PrintAction print; engine.rootContext()->setContextProperty("PRINT", &print); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
در نهایت فایل QML شما هم باید چیزی مثل این باشه:
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.4 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") property date currentDate: new Date() RowLayout { id:pageHeader width: parent.width Layout.fillWidth: true Label { text: "First name: " } Text { text: qsTr("<b>Kambiz</b>") } Label { text: "Last name: " } Text { text: qsTr("<b>Asadzadeh</b>") } Item { Layout.fillWidth: true; } Label { text: "Date: " } Text { text: currentDate.toLocaleDateString(); font.bold: true } } Button { x: 437 y: 137 width: 150 height: 36 text: qsTr("Print") onClicked: { var stat = pageHeader.grabToImage(function(result) { result.saveToFile("/Users/compez/Desktop/someimage.png"); PRINT.print(result.image); }); console.log("Success: ", stat); } } }
موفق باشید.
-
در 2 ساعت قبل، Saman گفته است :بعد از سه روز ۳ پیداش کردم -ـ-
Flow { id: flow width: parent.width-5 height: childrenRect.height spacing: 10 anchors.verticalCenter: parent.verticalCenter Repeater{ model: ListModel { ListElement { name: "Jim Williams" url: " " } ListElement { name: "John Brown" url: " " } ListElement { name: "Bill Smyth" url: " " } ListElement { name: "Sam Wise" url: " " } } Rectangle{ height: 25 width: name.width radius: 2 Text { id: name text: model.name anchors.centerIn: parent } MouseArea{ anchors.fill: parent onClicked: stackView.push(model.url) } } } }
سلام،
این چیزی نیست که انتظارش رو داشتی.
برای Flow هم خاصیت
anchors.verticalCenter: parent.verticalCenter
رو تعریف نکن.از همون GridView استفاده کن و آیتمهای درونش رو لنگر بزن (anchors).
-
در در 14 دی 1397 در 11:00، CISCO گفته است :یه سوال داشتم که خیلی وقت هست درگیرش هستم.
من خودم به صورت عادی از win32 در ++C استفاده میکنم و برای ساختن حتی یه button کلی زور میزنم و کد مینویسم برای رویداد ها و لوکیشن و ...حالا بماند که برای تنظیم یک رنگ برای یک button یا text چقدرر دردسر دارم.
سلام،
کتابخانههای Win32 و MFC هرچند کتابخانههای قدرتمندی هستند اما باید در نظر داشته باشید اینها اختصاصی برای پلفترم ویندوز بوده و بر اساس API های ویندوز ارائه شدن و مسلماً کاربردهای آنچنان بهروز و چند منظورهای مثل Qt رو ندارند.
کتابخانهٔ پیشنهادی خود مایکروسافت در قالب چهارچوب داتنت است که برای سی++ هم UWP قابل استفاده بوده و شما میتونید رابط کاربری مدرن رو هم با WPF توسعه دهید (اما انتظار نداشته باشید در حد Qt خارقالعاده باشه).
در در 14 دی 1397 در 11:00، CISCO گفته است :البته نا گفته نماند که به Qt ام برای طراحی فکر کردم اما چند تا مشکل دارد . اولی اینکه حجم برنامه رو به شدت میبره بالا
با توجه به اینکه شخصاً تعامل خوبی با داتنت و سیشارپ دارم و در مواقعی که صلاح میدونم ازش استفاده میکنم، نیاز هست تا شمارو در جریان یک واقعیت قرار بدم (که سوال بسیاری از دوستان بوده)!
شما برای اینکه برنامهای رو تحت هر زبانی اجرا کنید مسلماً نیاز به یک سری کتابخانهها و پیش نیازاتی خواهید داشت! برای مثال در سیشارپ شما نیاز به داتنت دارید و در سی++ نیاز به STL، Qt، Boost و غیره! حالا کتابخانهٔ پیشفرض سی++ STL و پیشفرض سیشارپ Net. هست!
حالا با توجه به اینکه شما یک برنامهٔ ساده ز نوع "سلام دنیا!" بنویسید! چیزی که در سی++ ارائه خواهد شد حدود چند کیلوبایت است که برای اجرای اون تنها نیاز به فایلهای msvcr و msvcp و یا vcruntime خواهید بود که جمعاً حدود ۱ تا ۲ مگابایت نیستند! اما برعکس در سیشارپ شما بخوای همین برنامهٔ ساده رو بنویسی خبری از این سادگی نیست! نیازمند پکیج حجیمی از داتنت خواهی بود که باید نصبش کنی.
در ویندوز وقتی شما با سیشارپ برنامهنویسی میکنید به دلیل اینکه چهارچوب
.Net
و SDKهای مربوط به داتنت بر روی سیستمعامل مستقر شدهاند نیازی نیست تا کتابخانههای مربوط به داتنت رو در کنار برنامهٔ خودتون قرار بدین (چون اینها در خود سیستمعامل نصب میشوند نه در کنار برنامه).دقت کنید آیا بدون نصب پکیج (Microsoft .NET Framework Redistributable) میتونید برنامههای مربوطه رو اجرا کنید؟
پاسخش مسلماً خیر خواهد بود! این پکیج حداقل بعد از نصب چیزی حدود ۲۰۰ تا ۷۰۰ مگابایت و حتی بیشتر کتابخانهٔ داتنت استخراج خواهد کرد و این یعنی در کنار فایل اجرایی یک برنامهٔ ساده از نوع "سلام دنیا!" چنین حجم بزرگی از کتابخانه نیاز خواهد بود! اما شما متوجه این نمیشید چون به صورت پیشفرض موقع نصب برخی از ابزارهای اختصاصی مایکروسافت مثل ویژوال استودیو، آفیس و غیره این پکیج نصب میشود! البته خارج از لطف هم نیست در برخی از نسخههای نهایی ویندوز مثل ویندوز ۱۰ بخش هستهٔ کتابخانه همراه با هستهٔ سیستمعامل ارائه میشه و آنچنان مثل قبل نیاز نصب بخش عظیم کتابخانه نیست. اما با این حال شما حتماً به پکیج مربوطه جهت اجرای تمامی قابلیتهای برنامهٔ خودتون نیاز خواهید داشت که اصلاً قابل مقایسه با یک برنامهٔ ۱ تا ۲ مگابایتی تحت سی++ نیست.
حالا با توجه به این آیا حجمی معادل ۸ تا ۲۰ مگابایت واقعاً مشکل محسوب میشود؟! شما فرض کن کتابخانهٔ کیوت رو در قالب یک SDK روی هستهٔ سیستمعامل خودت نصب کرده باشی! در این صورت همون فایل اجرایی چند کیلوبایتی نهایت حجم تولید شده از یک برنامهٔ ساده است.
در در 14 دی 1397 در 11:00، CISCO گفته است :دوم تعداد فایل های برنامه رو میبره بالا . سوم من در کل IDE برنامه نویسیم در Visual studio هست و به اون بیشتر عادت دارم چون خیلی ساده تر هست نسبت به Qt و اگر بخوام پلاگین های qt رو بریزم توی vs باز هم باید به صورت کد و لوکیشن و ... انجام بدم که تقریبا مثل win32 میشه فکر کنم.
من خودم شخصا برای این مشکل به این فکر افتادم که رابط گرافیکی رو با c# بنویسم و همه کد ها رو توی یه قالب dll که به زبان c++ نوشته شده از #C فراخانی کنم.
نظر شما چیه؟ راه حل بهتری سراغ دارید؟
تعداد فایلها مربوط به همون کتابخانه هستش!
آیا میدونید تعداد فایلهای داتنت بسیار بیشتر و در یک کلام چند برابر کتابخانهٔ کیوت است!؟ برای اینکه متوجه واقعیت (پنهان) شوید به این مسیر بروید:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework
وحشتناکه نه؟! مایکروسافت به همین راحتی سر برنامهنویسها شیره میماله و اونها رو قانع کرده. اگر کمی زیرک و حرفهای به این مسائل باشید خواهید فهمید که در پشت این مزیت خوب چه چیزی هست!
در در 14 دی 1397 در 11:00، CISCO گفته است :سوم من در کل IDE برنامه نویسیم در Visual studio هست و به اون بیشتر عادت دارم چون خیلی ساده تر هست نسبت به Qt و اگر بخوام پلاگین های qt رو بریزم توی vs باز هم باید به صورت کد و لوکیشن و ... انجام بدم که تقریبا مثل win32 میشه فکر کنم.
در شناخهتر بودن محیط VS شکی نیست، اما این محیط توسعه یک محیط انحصاری برای پلتفرم ویندوز است. محیط توسعهٔ Qt در هماهنگی بالا با خود کتابخانه در قالب چهارچوب مخصوصاً پشتیبانی از سیستمعاملهای دیگه بسیار بهتر عمل میکنه. در مورد شباهتش به Win32 هم به خاطر درگیری مستقیم شما با کتابخانه هست.
در در 14 دی 1397 در 11:00، CISCO گفته است :من خودم شخصا برای این مشکل به این فکر افتادم که رابط گرافیکی رو با c# بنویسم و همه کد ها رو توی یه قالب dll که به زبان c++ نوشته شده از #C فراخانی کنم. نظر شما چیه؟ راه حل بهتری سراغ دارید؟
در رابطه با اینکه رابط کاربری رو با سیشارپ بنویسید و بکاند رو با سی++ کاملاً مخالفم! چون دارین خودتون رو گول میزنید! اگه قرار هست این کارو بکنید خب با همون VS تحت داتنت و C++/CLR کدنویسی کنید که تحت داتنت خواهد بود.
راهحل بهتر اینه که واقعیت رو بپذیرید و قبول کنید که هر کار خارقالعادهای نیاز به تعامل بیشتری خواهد داشت.
اگر میخواهید در قالب سرعت، قدرت، دسترسی، تعامل و خارج از هرگونه محدودیت برنامهنویسی کنید سی++ رو باید با تمامی سختیهاش بپذیرید! در غیر این صورت هیچ روشی برای قانع کردن خودتون وجود نداره.
درضمن پاسخ اصلی به عنوان سوال : به صورت پیشنهادی فریمورک Qt هست.
کتابخانههای دیگری هم هستند مثل wxWidgets.
- 2
- 2
- 1
-
شما برای اینکه به شیء مربوط به مدل در کیواماِل دسترسی داشته باشید کافیه نام مدل رو با مشخصه
model
مشخص کنید.ListView { .... model: myModel } delegate: ItemDelegate { Text { text: model.title } }
-
در 4 ساعت قبل، mahan گفته است :دوستان کسی می تونه دراین زمینه کمک کنه ؟
دوست عزیز لینک روش ویندوز رو هم در پست قبلی دادم که! نمیشه که پروژه رو ما انجام بدیم شما هم باید تلاش کنی.
-
در در 8 دی 1397 در 12:38، nima_pw گفته است :سلام،
ممنون از پاسخ شما.
ویژوال استودیو ویرایش ۲۰۱۷
ابزار CMake نسخه 3.13.2 (GUI)
فایل برنامه: DTAEA.zip - آپلود عکس و فایل رایگان
هم در ویندوز و هم در لینوکس و مک این پروژه رو تست کردم و هیچ مشکلی در حین کامپایلر نداره.
از MinGW استفاده نکنید، با MSVC x64 بیلدش کنید.
روالش هم این هست که cmake رو اجرا کنی، مسیر سورس پروژه رو بهش تعریف و در بخش کامپایلر MSVC 2017 x64 رو انتخاب و بسازیش.
در نهایت فایل
ALL_BUILD.vcxproj
ساخته خواهد شد و میتونید با VS کامپایلش کنید.اینم خروجی موفقیت آمیز برای من :
The C compiler identification is MSVC 19.16.27025.1 The CXX compiler identification is MSVC 19.16.27025.1 Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe -- works Detecting C compiler ABI info Detecting C compiler ABI info - done Detecting C compile features Detecting C compile features - done Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe -- works Detecting CXX compiler ABI info Detecting CXX compiler ABI info - done Detecting CXX compile features Detecting CXX compile features - done Configuring done Generating done
-
در 17 ساعت قبل، nima_pw گفته است :سلام
من یک پروژه open source دانلود کردم، شبیه سازی یک مقاله هست
باید اجرا کنم و خروجی هاش رو ببینم به زبان C نوشته شده اما با Cmake ساخته شده که تقریبا فهمیدم Cmake چیه اما نتونستم برنامه رو توی Visual Studio اجرا کنم. Cmake رو نصب و خروجی رو برای Visual studio 2017 ساختم اما وقتی اجرا میکنم پیام out of date میده، در جواب build میزنم yes اما faild میشه، No میزنم اجرا نمیشه
از داخل خود Visual Studio هم که توی سرچ هام فهمیدم میشه مستقیما پوشه ای که cmakeList.txt داره رو open کرد، این کارو کردم اما اون بالا کنار فلش سبز رنگ نوشته select startup item و روی current document هست و گزینه دیگه ای نداره و قابلیت اجرا نداره
تصویر فایل های این پروژه رو ضمیمه کردم
نمیدونم باید چیکار کنم، ممنون میشم راهنمایی کنید.
خطای out of date به تنهایی برای شناسایی مشکل کافی نیست، ظاهراً باید چیزی رو بهروزرسانی کنید.
مشخصات پروژه (لینک برای بررسی) همچنین نسخهٔ VS و CMake رو ارسال کنید تا بتونیم بیشتر بررسی کنیم.
-
در ۱ ساعت قبل، GornerLabo گفته است :تشکر استاد
خواهش میکنم.
-
در 9 ساعت قبل، GornerLabo گفته است :بعد بیلد ، کتابخانه به این شکل دراومد. لینک دانلود کتابخانه بیلد شده با کامپایلر mingw
مشکل حالا نحوه اد کردن این کتابخانه س. فایل dll داره در فولدر bin ولی فایل .h نداره که داینامیک ادد کنم
کتابخانه را که بیلد کردین قرار نیست
.h
را هم کنار فایلهای بیلد شده قرار بدین!شما باید پوشهٔ libarchive را از کتابخانهٔ اصلی و فایلهای بیلد شده را به صورت دستی بهش اضافه کنید.
- 1
-
در 8 دقیقه قبل، GornerLabo گفته است :مشکل بیلد هم حل شد. سپاس استاد.
برای اضافه کردن به پروژه از گزینه add library استفاده میکنم . برای این منظور بعد add library ، مسیر کتابخانه و فایل .a رو فقط میتونم اضافه کنم که با بیلد کردن پروژه با ارور مواجه میشم. گوگل کردم و چندجایی دیدم مشکل داشتن در ویندوز برای اضافه کردن. اینم حل شه ازتون ممنون میشم
خب خطایی که میگیری چی هست؟
سعی کن از حالت داینامیک استفاده کنی، حالت Release یا Debug کتابخونه رو هم با برنامهٔ خودت هماهنگ کن.
-
در 11 ساعت قبل، mahan گفته است :عرض سلام و ادب
من قصد دارم برای نمایش نقشه از امکانات marble استفاده کنم و یک نمونه ساده برای نمایش نقشه بسازم ولی تنطیماتش رو نمیدونم. لطفا راهنمایی بفرماید که چطور راه اندازیش کنم فایل پروژه را به پیوست ارسال می کنم.
تنظیمات به این صورت هستش که خودش هم توضیح داده. کتابخانه رو باید بیلد کنید و بعد به پروژه اضافش کنید.
دستورات ساخت کتابخانه به صورت زیر میباشد:
mkdir -p ~/marble/build cd ~/marble/build cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_KF5=FALSE -DCMAKE_INSTALL_PREFIX=/usr/local ~/marble/sources make sudo make install
در نهایت کد آزمایشی به صورت زیر خواهد بود:
#include <QApplication> #include <marble/MarbleWidget.h> int main(int argc, char** argv) { QApplication app(argc, argv); // Load Marble using OpenStreetMap in Mercator projection Marble::MarbleWidget *mapWidget = new Marble::MarbleWidget; mapWidget->setProjection(Marble::Mercator); mapWidget->setMapThemeId("earth/openstreetmap/openstreetmap.dgml"); mapWidget->setWindowTitle("Hello Marble!"); mapWidget->show(); return app.exec(); }
اگر هم برای پلتفرم ویندوز لازمش دارید طبق این راهنمایی کامپایلش کنید.
از این آموزش هم میتونید کمک بگیرید:
-
در 11 دقیقه قبل، GornerLabo گفته است :استاد ممنون بابت پاسخ گویی. من ازکاربرای ویندوزم. برای بیلد در ویندوز و کامپایلر mingw32 باید به چه نحو عمل کرد؟
سورس کد کتابخانه رو دریافت و توسط CMake GUI بسازیدش.
برنامه
command prompt
رو اجرا و سورس رو با دستورmingw32-make
کامپایل کنید. -
در 21 ساعت قبل، GornerLabo گفته است :اول باید کتابخانه بیلد بشه، با دستورات زیر:
tar xzf libarchive-xxx.tar.gz cd libarchive-xxx ./configure make make check make install
برای افزودن این کتابخانه به Qt از بخش Add Library پروژه اقدام کن، خروجیش چیزی شبیه به این باید بشه من آخرین نسخه رو امتحان کردم:
LIBS += -L$$PWD/../../../Downloads/libarchive-3.3.3/build/ -larchive INCLUDEPATH += $$PWD/../../../Downloads/libarchive-3.3.3 DEPENDPATH += $$PWD/../../../Downloads/libarchive-3.3.3 PRE_TARGETDEPS += $$PWD/../../../Downloads/libarchive-3.3.3/build/libarchive.a
در نهایت یک کد آزمایشی به صورت زیر برای زیپ کردن در قلب
.tar
امتحان کردم که مشکلی نداره و کار میکنه. فرصت زیادی ندارم تا همه مواردش رو چک کنم، شما طبق مستندات و مثالهای پیشفرض امتحان و به کیوت اضافش بکنید.#include <QCoreApplication> #include <QString> #include <QByteArray> #include <QFileInfo> #include <QDebug> #include <QDirIterator> #include <libarchive/archive.h> #include <libarchive/archive_entry.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { QString directory = "iostreamir"; struct archive *a; struct archive_entry *entry; struct stat st; char buff[8192]; size_t bytes_read; int fd; QByteArray outArray = directory.toLocal8Bit() + ".tar"; char *outDirectory = outArray.data(); qDebug() << outDirectory; QByteArray inputArray = directory.toLocal8Bit(); char *inputDirectory = inputArray.data(); qDebug() << inputDirectory; QFileInfo inputInfo; inputInfo.setFile(directory); // the name of the directory QByteArray pathArray = inputInfo.fileName().toLocal8Bit(); char *pathDirectory = pathArray.data(); qDebug() << pathDirectory; a = archive_write_new(); archive_write_add_filter_gzip(a); archive_write_set_format_pax_restricted(a); archive_write_open_filename(a, outDirectory); QDirIterator it(directory, QDirIterator::Subdirectories); while (it.hasNext()) { entry = archive_entry_new(); stat(inputDirectory, &st); archive_entry_set_pathname(entry, it.next().toLocal8Bit().constData()); archive_entry_set_filetype(entry, AE_IFDIR); archive_entry_copy_stat(entry, &st); archive_write_header(a, entry); fd = open(inputDirectory, O_RDONLY); bytes_read = read(fd, buff, sizeof(buff)); while (bytes_read > 0) { archive_write_data(a, buff, bytes_read); bytes_read = read(fd, buff, sizeof(buff)); } close(fd); archive_entry_free(entry); archive_write_finish_entry(a); archive_write_close(a); archive_write_free(a); } return 0; }
- 1
-
در در 2 دی 1397 در 12:59، فانوس گفته است :من نمیدونم کجا اشتباه کردم. ممنون میشم کمکم کنید
سلام،
قبل از اینکه کدتون رو بررسی کنیم، ممکن هست خطایی که دریافت میکنید رو هم مشاهده کنیم؟
-
در 49 دقیقه قبل، قاسم رمضانی منش گفته است :با سلام.
با توجه به اینکه محیط Qt Creator برای استفاده از
QWidget
یاQt Quick
یک محیطبصری هم تعبیه کرده است که کار را برای استفاده راحتتر کرده است. امّا واقعاً استفاده از این ابزار در پروژههای بزرگ درست میباشد ؟ یا اینکه باید از برای کنترل بیشتر با استفاده از کدنویسیمحض طراحیمحیط را به عهده گرفت ؟ در اینصورت ... وظیفهٔ اصلی این محیط طراحی چیست ؟- مثالهایی که خود Qt هم دارد ، بدون استفاده از محیط ویژوال طراحی شده است.
بستگی داره با چه دیدگاهی بهش نگاه کنید.
مسلماً کسی که حرفهای است در کار خود نیازی به محیطهای ویزاردی ندارد. اما یک واقعیت وجود دارد، در واقع اصل استانداردی است که باید در محیطهای توسعه وجود داشته باشد. بنابراین برای اینکه کنترل سریعتر و بهتری در طراحی و پیاده سازی اجزاء داشته باشید وجود چنین ویژگی بسیار کارآمد خواهد بود. برای مثال جهت بررسی Statesها در یک جزء مشاهدهی بصری آن کمک بسیاری در تصمیم گیری بر تغییرات و توسعه خواهد کرد.
فرض کنید مانیتور شما حرفهای با پهنای بسیار بزرگ است، برای طراحی حرفهای نیمی از محیط توسعهٔ خود را در اختیار نیمی از پهنای مانیتور خود و تمامی بخشها مرتبط با منطق آن را همزمان با یکدیگر تحت نظر قرار خواهید داد.
تصویر فوق یک روش استاندارد برای تحت نظر داشتن جزء به جزء یک شیء است که تحت Satetesها بررسی میشود و شما به صورت Real-time میتونید این جزئیات را تحت نظر داشته باشید.
نتیجه : کاربرد چنین ویژگی صرفاً جهت تسلط بسیار بر اشیاء و وضعیت آنها در زمان توسعه میباشد.
- 1
-
در 2 ساعت قبل، قاسم رمضانی منش گفته است :با سلام.
معیارها برای انتخاب یک دیتابیس برای یک برنامهٔ حسابداری چه چیزهایی میتواند باشد ؟ بنده درحال شروع نوشتن یک برنامهٔ حسابداری با استفاده از فریمورک Qt هستم. و وهله اوّل که درحال طراحی بخشهای مختلف برنامه هستم نیاز به انتخاب یک دیتابیس دارم. که با وجود تنوع دیتابیسها در این زمینه نیاز دانستم که نظر مابقی دوستان را در این زمینه بدانم.
بنده برنامهی حسابداری هلو را دیدم که از دیتابیس MS SQL Server استفاده میکند. ولی خب برنامهٔ من Cross-Platform میباشد و نمیتوانم از MS SQL Server استفاده کنم.
سلام،
معیارها میتونن بسیار جزئی و کاملاً فنی باشن! مثلاً بحث هزینهها، ساختار، پرفرمنسها، ویژگیها، بحث تجاری بودن، پشتیبانی و غیره...
برای مثال MySQL به خاطر سرعت بالا، پشتیبانی از چند-سکویی، پایداری خوب و همچنین پشتیبانی از لایههای چند منظوره و موتورهای چند منظوره برای اهداف خاص بسیار مطرح شده، البته نسخههای متفاوتی دارن که جدیدا MariaDB بسیار بهتر هست. از طرفی PostgreSQL در نسخههای جدیدتر از لحاظ سرعت با MySQL برابری میکند و به خاطر تضمین پشتیبانی از دادههای بسیار بزرگتر نسبت به مایاسکیوال و پشتیبانی از قابلیتهای بسیار زیاد نسبت به آن مطرح هست! مخصوصاً عملکرد بهتری که در سرورهایی با پشتیبانی از پردازندههای چند هستهای دارد. این دو مورد کاربردهای بسیار عظیمی دارند و شما میتونید برای اهداف بزرگ ازشون استفاده کنید. هر دوی این دیتابیسها چند-سکویی هستند اما برای کار حرفهای MySQL و برای کارهای حرفهای تر PostgreSQL پیشنهاد میشه.
در نظر داشته باشید بهینه سازی این موارد با ترکیب مختص برای سیستمهای کشینگ مثل Memcached و Redis بسیار چشمگیر خواهد بود.
برای پروژهٔ شما با توجه به توضیحی که دادین MySQL انتخاب خوبی هست.
- 1
- 1
-
در 7 دقیقه قبل، najib moradi گفته است :سلام
بنده دوره زبان برنامه نویسی سیپلاسپلاس را کامل کردم و فعلا قصد دارم گرافیکال کار کنم اما نمیدانم از کجا باید شروع کنم باید چه چیز را یاد بگیرم!
کلاً راهنمایی لازم دارم اگه زحمت نیست ممنون میشم.
سپاس از همکاری شما
سلام،
قبلاً در رابطه با این موضوع توضیحات به صورت کامل ارائه شده است.
همچنین موارد زیر را مطالعه بفرمایید:
-
در 2 ساعت قبل، dorche گفته است :این صفحه و مثال هاش رو ببینید.
کدت و یا خطایی که دریافت میکنی رو قرار بده تا دقیق بتونیم نظر بدیم، طبق مثالی که دیدم نباید مشکلی داشته باشید.
-
در 33 دقیقه قبل، Saman گفته است :اما من نمیتونم صفحه های اون رو داینامیک کنم و ممکنه چندین صفحه داشته باشم ممنون میشم راهنماییم کنید
سلام،
بیشتر توضیح بدین، منظورتون از داینامیک شدن دقیقاً چی هست؟
cv-qualification چیست؟
در سوالات عامیانه در رابطه با ++C مدرن
ارسال شده در
در استاندارد سیپلاسپلاس وقتی نیاز است تا نوعی را برای متغیر خود انتخاب و توصیف کنید به طور معمول آن را به صورتهای نوعِ اساسی و پایه مانند عدد صحیح، رشته، آرایه و غیره و یا یک نوع ویژهٔ واجد شرایط جهتِ استثناء شدن توصیف میکنیم. این انواع به دو صورت no cv-qualifier و cv-qualifier از هم متفاوت توصیف میشوند.
کلمات CV خلاصه شدهٔ
const
وvolatile
است، زمانی که شما نوعی از متغیر را تحت کلمات کلیدی const و volatile توصیف میکنید در واقع نوع آن را تحت عنوان const-qualified و volatile-qualified توصیف کردهاید که از تعریف عادی متمایز میشوند و با این کار متغیر را واجد شرایط خاصی قرار میدهید.برای مثال، نوع زیر در قالب استاندارد cv-qualifier تعریف شده است که به صورت ضروری مقدار اولیهٔ آن نیز مشخص شده است:
در صورتی که کدی همانند نمونهٔ زیر داشته باشیم:
از طرف کامپایلر با خطایی مشابه خطای زیر مواجه خواهیم شد:
منظور از این خطا این است که، مقدار جدیدی را شما نمیتوانید به متغیری از نوع const که تحتِ شرایطِ const-qualified میباشد بدهید.
از طرفی اگر نوع متغیر خود را با volatile توصیف کنید، مقدار متغیر در هر نَخ (Thread) دیگر احتمال تغییر یافتن را خواهد داشت.
در واقع شما آن متغیر را واجد شرایط ویژهای قرار دادهاید که بتواند در هرجا که نیاز بود تغییر پیدا کند. (در این حالت بر خلاف نوع const کامپایلر خطایی را از خود ساطع نمیکند و علاوه بر آن در زمان بهینهسازی از آن مورد صرف نظر خواهد کرد).
استفاده از کلمهٔ کلیدی volatile بهینهسازی کامپایلر را از بهینهسازی آن دور میکند.توجه داشته باشید که یک کلمهٔ کلیدی ویژه نیز وجود دارد به نام mutable که از آن زمانی استفاده میشود که اعضای کلاس و نوع توابع شما به صورت const یعنی از نوع const-qualified توصیف شده باشد که تغییر آن امکانپذیر نیست. در صورتی که لازم باشد استثناء یا واجد شرایط قرار بگیرد نوع آن توسط mutable میتواند توصیف شود که اجازهٔ تغییر فقط به آن مورد داده خواهد شد.
در نهایت متغیر زیر به صورت no cv-qualitifier تعریف شده است که در حالت معمول بر اساس قوانین و شرایطی که کامپایلر در نظر میگیرد با آن برخورد و در صورت نیاز بهینهسازی خواهد شد.