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

فرهاد شیری

مدیران مرجع
  • تعداد ارسال ها

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

  • آخرین بازدید

  • روز های برد

    23

آخرین بار برد فرهاد شیری در 20 اسفند

فرهاد شیری یکی از رکورد داران بیشترین تعداد پسند مطالب است !

اعتبار در سایت

104 عالی

2 دنبال کننده

درباره فرهاد شیری

توسعه‌ دهنده بَک اِند
توسعه‌ دهنده فرانت اِند
اساتید
  • تاریخ تولد 20 مهر 1360

موقعیت

  • شهر
    تهران

آخرین بازدید کنندگان نمایه

375 بازدید کننده نمایه
  1. فرهاد شیری

    بله می توانید تعریف کنید وقتی نوع شمارشی بدون نام در یک کلاس ویا یک استراکچر می سازید در صورتی که حوزه دسترسی این نوع شمارشی عمومی تعریف شده باشه می توانید به صورت ثابت های عضو عمومی کلاس بهشون دسترسی پیدا کنید. #ifndef TESTENUM_H #define TESTENUM_H class testEnum { public: testEnum(); virtual ~testEnum(); enum { a, b, c = 0, d = a + 2 }; enum { z, e, g = 0, f = z + 2 }; protected: private: }; #endif // TESTENUM_H testEnum t1; cout << t1.d << endl; و اگر هم برای داده شمارشی نام تعریف کنید به این صورت هم میتوانید استفاده کنید #ifndef TESTENUM_H #define TESTENUM_H class testEnum { public: testEnum(); virtual ~testEnum(); enum T1 { a, b, c = 0, d = a + 2 }; enum T2 { z, e, g = 0, f = z + 2 }; protected: private: }; #endif // TESTENUM_H testEnum t1; cout << t1.T1::a << endl; این سوال هم خیلی کلی هست ولی معمولا تعریف داده شمارشی بدون نام خیلی مرسوم نیست یا حداقل من خودم که این کار را انجام نمیدهم اونهم به این علت که نگهداری برنامه و پیچیدگی را افزایش میده وقتی روش غیر استانداردی را برای یک نوع استاندارد به کار ببریم. ولی در مجموع داده های شمارشی بر اساس ساختمانی که دارند هزینه نگهداری پایینتر و همچنین اتلاف حافظه کمتری نسبت به انواع ثابت ها را دارند.
  2. فرهاد شیری

    کدوم نارضایتی دوست عزیز! کاربرها ناراضی بودن که نمیرفتن آیفون بخرن 20 میلیون اونها مارا تحریم میکنن ما چیکار میکنیم میریم توصف خرید آیفون... شد یکبار ما اونها را تحریم کنیم و نخریم نه دوست گرامی مطمن باش حتی اگر خود گوشی را هم تحریم کنن یعنی تو جغرافیای ایران روشن نشه باز ملت میرن میخرن انقد کلنجار میرن تا بالاخره روشنش کنن یا اینکه همونطوری خاموش 15 میلیون پول میدن میخرن دیدم که میگم
  3. فرهاد شیری

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

    اگر از CLR ویا universal window platform tools در ویژوال استودیو استفاده کرده باشید قطعا برای اجرای برنامه هاتون به فریم وورک های دات نت نیاز خواهید داشت در ماشین مقصد. ولی اگر از MFC , Win32 استفاده کنید نیازی به دات نت نخواهید داشت حالا چه فایل باینری stand alone exe بسازید ویا کتابخانه های Dynamic Link Library بسازید
  5. فرهاد شیری

    به مقاله زیر مراجعه نمایید. فرق بین کامپایل استاتیک و داینامیک
  6. ادامه مقاله امنیت در نرم افزارهای تولید شده با زبان ++C به یک شی cv-qualified توسط یک شی cv-unqualified دسترسی پیدا نکنید! به برنامه زیر توجه کنید، یک روش با شرایط ثابت، که برای ذخیره سازی پنهان نتایج ناشی از دورانداختن شرایط ثابت مذکور تلاش میکند، فراخوانی میشود. به دلیل آنکه کلاس S به عنوان یک ثابت اعلام شده است. تغییر ناگهانی و جهش مقدار پنهان ذخیره شده، منجر به بروز رفتار نامشخص میگردد. #include <iostream> class S{ private: int cachedValue; int compute_value() const; // expensive public: S() : cachedValue(0) {} int get_value() const{ if (!cachedValue){ const_cast<S *>(this)->cachedValue = compute_value(); } return cachedValue; } }; void f(){ const S s; std::cout << s.get_value() << std::endl; } اکنون برای رفع این مشکل کافی است که نوع متغیر عضو کلاس را به صورت mutable تعریف نماییم. #include <iostream> class S{ private: mutable int cachedValue; int compute_value() const; // expensive public: S() : cachedValue(0) {} int get_value() const{ if (!cachedValue){ cachedValue = compute_value(); } return cachedValue; } }; void f(){ const S s; std::cout << s.get_value() << std::endl; } نباید یک شی لاندا بیشتر از اشیایی رجوع شده به خود، عمر کند! این امکان وجود دارد که عبارت لاندا، اشیای دارای مدت زمان ذخیره سازی خودکاری را از مجموعههای ازحوزه های پیوسته حوزه ی دسترسی، برای استفاده در بدنه ی تابع، رصد و دریافت کند. ممکن است این رصد به صورت صریح و از طریق مشخص کردن شی در capture-list لاندا، یا به صورت ضمنی و با استفاده از capture-default و ارجاع به شی در بدنه ی تابع لاندا صورت پذیرد. هنگامی که یک شی به وسیله ی کپی رصد میشود، شی لاندا شاملیک عضو داده ای غیرایستای بدون نام خواهد شد، که مقدار اولیه برابر با مقدار شی مورد رصد است. طولعمر عضو داده ای غیرایستا نیز برابر با طول عمر شی لاندا خواهد بود. با این وجود، هنگامیکه یک شیتوسط مرجع رصد می شود، طول عمر مورد ارجاع به طول عمر شی لاندا گره نخورده است. بنابراین هنگامیکه یک شی لاندا از شی مورد ارجاع و رصد خود بیشتر عمر کند، مادامیکه شی مورد ارجاع و رصد در دسترس است، اجرای عملگر فراخوانی تابع شی لاندا منجر به بروز رفتار نامشخص میشود.بنابراین، شی لاندا نباید طول عمری بیشتر از شی مورد ارجاع و رصد خود داشته باشد. به مثال زیر توجه نمایید، یک مرجع لاندا، یک متغیر محلی را از یک لاندای بیرونی رصد میکند. با این وجود، طولعمر این لاندای داخلی بیشتر از لاندای بیرونی و متغیرهای محلی خودکار تعریف شده ی آن است. هنگامیکه شی لاندای داخلی در ()f اجرا میشود، رفتار نامشخصی روی خواهد داد. auto g(int val){ auto outer = [val]{ int i = val; auto inner = [&]{ i += 30; return i; }; return inner; }; return outer(); } void f(){ auto fn = g(12); int j = fn(); } برای رفع این اشکال کافی است که لاندای inner متغیر i را نه از طریق ارجاع بلکه از طریق کپی رصد نماید. auto g(int val){ auto outer = [val]{ int i = val; //auto inner = [=] () mutable { //OR auto inner = [i]{ i += 30; return i; }; return inner; }; return outer(); } void f(){ auto fn = g(12); int j = fn(); } زمانی که عملگر new را سربارگذاری میکنید حتما باید عملگر delete را هم سربارگذاری نمایید به برنامه زیر توجه نمایید، #include <Windows.h> #include <new> void *operator new(std::size_t size) noexcept(false){ // Private, expandable heap. static HANDLE h = ::HeapCreate(0, 0, 0); if (h){ return ::HeapAlloc(h, 0, size); } throw std::bad_alloc(); } // No corresponding global delete operator defined. در صورتی که هیچ کلاس کمکی برای سربار گذاری در نظر نگرفته باشید قطعا نمی توانید از عملگر delete بر روی حافظه رزرو شده توسط این تابع استفاده کنید. بنابراین بهتره از یک کلاس پوشاننده استفاده کنیم.. #include <Windows.h> #include <new> class HeapAllocator{ private: static HANDLE h; static bool init; public: static void *alloc(std::size_t size) noexcept(false){ if(!init){ h = ::HeapCreate(0, 0, 0); // Private, expandable heap. init = true; } if(h){ return ::HeapAlloc(h, 0, size); } throw std::bad_alloc(); } static void dealloc(void *ptr) noexcept{ if (h){ (void)::HeapFree(h, 0, ptr); } } }; HANDLE HeapAllocator::h = nullptr; bool HeapAllocator::init = false; void *operator new(std::size_t size) noexcept(false){ return HeapAllocator::alloc(size); } void operator delete(void *ptr) noexcept{ return HeapAllocator::dealloc(ptr); }
  7. فرهاد شیری

    یک سر به لینک زیر بزنید Using ActiveX controls and COM in Qt
  8. سلام به نظرم در این برهه از زمان تسلط در یک زبان ویا یک Frame Work به هیچ وجه نمیتونه تضمینی برای آینده یک مهندس نرم افزار ویا یک برنامه نویس باشه! بنابراین بهتره سعی کنید ++C را شروع کنید و بصورت موازی Frame Work Qt را هم استفاده کنید، ولی به هیچ وجه از تکنولوژی های سمت زبان جاوا غافل نشید. صرف تسلط به زبان ++C الان نمیتونه خیلی مهم باشه، (البته شرایط تجاری بازار IT کشور خودمون را عرض میکنم) اونهم به این علت که قطعا درصد بسیار کمی از شرکتهای معتبر که الان در ایران فعال هستند، زبان ++C را به عنوان تکنولوژی توسعه ای نرم افزارها شون انتخاب میکنن که اونهم بخاطر خیلی از دلایل که قبلا بارها بحث شده. که البته شانس استخدام در این شرکتها هم خیلی پایین هست. متاسفانه مشکل هم از اونجا شروع میشه که، کسانی که بدون فکر و منطق هجوم میارن سمت زبانهایی مثل سی پلاس پلاس فکر میکنن با خوندن دوتا کتاب و دوتا پروژه روی گیت ایجاد کردن و مطالعه سایتهای رفرنس می تونن در زبان سی پلاس پلاس تجربه کسب کنند که قطعا نمیتونه اینطور باشه! هرچند نام کیوت و سی پلاس پلاس خیلی بزرگ جلوه میکند اما واقعیت چیزه دیگه ای هست. پس تا وقتی هم که شما شرایط قرار گرفتن دریک تیم توسعه ای نرم افزاری که تکنولوژی توسعه ی نرم افزارهای تجاری شون با زبان سی پلاس پلاس ویا فریم وورک کیوت هست، را نداشته باشید قطعا نمیتونید دراین زمینه به یک دانش خوب و قوی دست پیدا کنید. به همین علت اگر برنامه نویسی که بخواد در این بازار مشغول باشه بهتره حتما از تکنولوژی های دات نت و جاوا و تکنولوژی های سمت وب اطلاعات کافی داشته باشه.
  9. فرهاد شیری

    احسنت! دست مریضاد...
  10. فرهاد شیری

    جوابم را سعی کردم بهتر نشون بدم! دوستان اگر نظری داشتید بنده را بی نصیب نذارید! بنابراین می توان نتیجه گرفت در صورتی که آرایه A int A[]{1,2,3,4,5}; با این مقادیر در حافظه وجود داشته باشد، استنباط این است در اولین آدرس دهی Cache وبا هربار فراخوانی Cache مقادیر 1 و 3 و 5 با نرخ Hit 100 وجود خواهند داشت. و مقادیر 2 و 4 در Cache در دسترس نخواهند بود ومجددا آدرسی دهی خواهد شد.
  11. فرهاد شیری

    سپاسگذار زحمات شما هستم
  12. فرهاد شیری

    عالی مثل همیشه!
  13. فرهاد شیری

    جناب اسدازاده! تشکر از مقاله ها و اشتراک گذاری دانش فنی خودتون در اختیار افرادی امثال من، قدردان زحمات شما هستیم!
  14. فرهاد شیری

    تشکر! و سپاس فراوان
  15. فرهاد شیری

    عالی! مثل همیشه
×