C++
رفتن به کانال در Telegram
گروه آموزش زبان برنامه نویسی سی، سی پلاس پلاس خدمت شما دوستداران گرامی با امید بهره بردن و موفقیت شما همراهان🌹 ممنون که همراه ما میشین و ما رو حمایت میکنین 🌹 https://t.me/ourcpp
نمایش بیشتر2 130
مشترکین
-224 ساعت
-57 روز
-4730 روز
آرشیو پست ها
2 130
👨🏫آموزش standard template library (STL)
🔘بخش اول
➖قسمت ۱/۲
منبع:Linkedin
مدرس:Bill Weinman
#آموزش #stl
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش standard template library (STL)
مدرس: Bill Weinman
منبع: Linkedin
سطح: متوسط
توضیحات: کتابخانه استاندارد الگو (SLT) یکی از کامل ترین و قدرتمند ترین کتابخانه های موجود در مورد Container است. برای دستیابی به مهارت در C++، داشتن درک صحیح از الگو های های C ++ و STL هر دو ضروری می باشد.
در این دوره، که دومین سری از تمرکز بر ضروریات C++ می باشد، مدرس بررسی دقیقی بر روی هر دو موضوع ضروری ذکر شده دارد. در شروع دوره، او الگو ها را آموزش می دهد و در مورد نحو الگو ها، کلاس ها، توابع و ویژگی جدید argument deduction بحث می کند. سپس او بر مبنای دانش بدست آمده از بخش شروع دوره، در مورد در برگیرنده های SLT، تکرار کننده ها، تبدیل کننده ها، توابع، و الگوریتم ها بحث می کند.
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
#challenge #memory_layout #c02
چالش: مشکل کد زیر چیست؟
struct my_type final {
int int_value;
double double_value;
my_type(int const i, double const d)
: double_value(d), int_value(i)
{ }
};2 130
#challenge_answer #c01
جواب چالش Referenceها.
این کد Undefined Behavior هست. چرا که ما توی تابع
f_1 با فراخوانی std::map::erase باعث خراب شدن Iteratorها شدیم.
امّا چیزی که مشکل اصلی رو درست میکنه اینکه ما یک const-reference به کلید یکی از عناصر Map فرستادیم به تابع. پس یعنی وقتیکه اون Iteratorها خراب میشند دیگه اون const-reference هم مقدارش Valid نیست و خرابه.
متأسفانه این کد در اکثر مواقع میتونه درست عمل بکنه، امّا اگه با Address Sanitizer برنامهامون رو اجرا بکنیم؛ یه همچین خطایی میگیریم:
ERROR: AddressSanitizer: heap-use-after-free on address
2 130
#challenge #reference #c01
چالش: آیا این کد مشکلی دارد؟
std::map<std::string, int> map = {
{"_1", 1}, {"_2", 2}
};
void f_2(std::string const& i) {
std::cout << "Key: " << i << std::endl;
}
void f_1(std::string const& i) {
map.erase(i);
f_2(i);
}
int main() {
while (!map.empty()) {
f_1(map.begin()->first);
}
}
------------------
جهت اجرا کردن:
https://wandbox.org/permlink/KfQkd9cxkQbyqXUc2 130
#tips #effective_modern_cpp #enumerations
همیشه استفاده از Scoped Enumerationها رو به استفاده از Unscoped Enumerationها ترجیح بدید.
در سیپلاسپلاس استاندارد ۱۱ قابلیّت Scoped Enumerationها اضافه شد که بر خلاف Unscopedها در جایی که تعریف شدند بهصورت گلوبال نمیتونستیم ازشون استفاده بکنیم و حتماً باید محدودهاشون (Scope) رو مشخص میکردیم و همچنین قابلیّت Explicit Casting هم ندارن.
با Unscoped Enumerationها خیلی راحت میتونستیم یک همچین خطایی بکنیم:
enum types { number, string };
bool number = false;
که کامپایلر به ما یک همچین خطایی میده:
error: ‘bool number’ redeclared as different kind of entityچرا که قبلاً با استفاده از Unscoped Enumerationها ما
number رو تعریف کردیم. امّا با Scoped Enumerationها یه همچین مشکلی رو نداریم:
enum class types { number, string };
bool number = false;
چرا که اینجا number توی محدوده types تعریف شده و برای استفاده ازش باید صریحاً محدوده رو مشخص بکنیم:
auto type = types::number;برای جلوگیری از این خطاها و احترام به Strong Typing زبان سیپلاسپلاس استفاده از Scoped Enumerationها رو اولویت بدید؛ مگر اینکه دلیل خاصی برای استفاده از Unscoped Enumerationها داشته باشید. مثلاً نیاز به عملیات بیتی:
enum permissions {
write = 1,
read = 1 << 1,
config = 1 << 2
};
auto perm = write | config;
if (perm & (1 << config)) {
std::cout << "User Can Config" << std::endl;
}2 130
#tips #debugging #macro
گرفتن گزارش دقیق با ماکروهای از پیشتعریف شده
در هنگام Debug کردن، معمولاً از پیغامهایی استفاده میکنیم. برای اینکه این پیغامها اطلاعات دقیقتری بتونند بهمون بدند؛ Preprocessor یکسری Macro از پیشتعریف شده داره که میتونند اطلاعاتی مانند:
- شمارهٔ خط جاری.
- اسم فایل.
- اسم تابع.
رو به ما بدند.
• ماکرو شمارهٔ خط
برای دریافت شمارهٔ خط میتونیم از ماکروی
__LINE__ استفاده کنیم.
• ماکرو اسم فایل
برای دریافت اسم فایلجاری میتونیم از ماکروی __FILE__ استفاده کنیم.
• ماکرو اسم تابع
برای دریافت اسم تابعجاری میتونیم از ماکروهای:
- __func__
- __FUNCTION__
استفاده بکنیم، منتهیٰ دو ماکرو دیگه هستند که دقیقتر به ما اسم تابع رو میدند:
- __PRETTY_FUNCTION__ : Just for GCC
- __FUNCSIG__ : Just for MSVC
که با ترکیبی از این ماکروها، میتونیم Loggerهای خودمون رو درست بکنیم:
#ifdef _WIN32 #define FUNC_NAME __FUNCSIG__ #elif defined(__unix__) #define FUNC_NAME __PRETTY_FUNCTION__ #else #define FUNC_NAME __func__ #endif #define M_LOG \ std::cerr << "[ " << __LINE__ << " : " << FUNC_NAME << " ] "برای دیدن نحوهٔ استفاده: https://wandbox.org/permlink/FMi2uPI3cOSpTPSq ---------------- نکته: برای استفاده در پروژههای بزرگ، به خاطر اهمیّت Logها و نیاز به مدیریت بیشتر، بهخصوص در برنامههای Multi-Thread؛ باید از کتابخونههای Logger جانبی استفاده بکنیم: - https://github.com/fffaraz/awesome-cpp#logging
2 130
#tips #pointer_arithmetic
هنگام استفاده از عملیات
+ یا - بر روی اشارهگرها، مراقب آدرس حافظه باشید.
زمانیکه ما یک حافظهای را دستی دریافت میکنیم:
auto list = new int[10];برای اینکه بتونیم دوباره این حافظه رو حذف بکنیم، نیاز به یکسری ساختاری در پسزمینه برای ذخیرهٔ اطلاعات مورد نیاز حافظهٔ گرفته شده هست؛ که اینکار توسط کتابخونهٔ استانداردی که استفاده میکنیم انجام میشه (مثلاً در سیستمعاملهای استاندارد معمولاً یا
glibc هست یا musl).
یکی از این اطلاعات مهم، آدرسی هست که توابع Allocation مثل عملگر new یا تابع malloc به ما میده. خب چی میشه اگه این آدرس رو ما از دست بدیم؟ مسلماً دچار Memory Leak میشیم.
یکی از روشهایی که این آدرس از بین میره، Pointer Arithmetic هست:
auto list = new int[10]; list += 3; delete[] list;اینجا چون ما از آدرسی که عملگر
new بهمون داده بود، سه واحد جلو رفتیم، دیگه عملگر []delete نمیتونه حافظه رو آزاد بکنه و ما دچار Memory Leak میشیم.
مشکل بزرگتر: اگه این تیکه کد رو Compile بکنیم، هیچ خطایی نمیگیریم، چون کاملاً Valid هست، منتهیٰ از نظر منطقی مشکل داره. اگه کد رو با نهایت تنظیمات Warningها Compile بکنیم میتونیم یه همچین Warningیی بگیریم:
warning: ‘void operator delete [](void*)’ called on pointer ‘<unknown>’ with nonzero offset 12 [-Wfree-nonheap-object]
2 130
#tips #malloc #memory_allocation
تفاوت عملگرهای
new و delete با توابع malloc و free
توابع new, delete و free, malloc جفت دسته، هدفشون گرفتن حافظهست و در نهایت Allocation Function ها رو صدا میزنند، تنها تفاوتشون توی ++C این هست که وظیفهٔ هدایت RAII رو در دست میگیرند. مثلاً یه همچین چیزی غلط هست:
struct A{ A() {}; ~A() {} };
malloc(sizeof(A));
کاری کهCompiler برای new میکنه:
mov edi, 1 call operator new(unsigned long) mov rdi, rax call A::A() [complete object constructor]و کاری که
malloc میکنه:
mov edi, 1 call mallochttp://yosefk.com/c++fqa/heap.html#fqa-16.4
2 130
زبان های برنامه نویسی استفاده شده در بازی ها
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش هفت
➖قسمت ۶/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش هفت
➖قسمت ۵/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش هفت
➖قسمت ۴/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش هفت
➖قسمت ۳/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش هفت
➖قسمت ۲/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش هفت
➖قسمت ۱/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی2 130
👨🏫آموزش سی پلاس پلاس ویژه مبتدیان-مقدماتی
🔘بخش ششم
➖قسمت ۶/۶
منبع:یودمی
مدرس:Eduonix Learning Solutions
#آموزش #یودمی
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔘گروه برنامه نویسی C/C++
🔘سی پلاس پلاس فارسی