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

قاسم رمضانی منش

کاربـــر رسمی
  • تعداد ارسال ها

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

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

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

10 بسیار خوب

درباره قاسم رمضانی منش

  • تاریخ تولد 9 آذر 1378

اطلاعات شبکه‌ای

موقعیت

  • شهر
    Esfahan

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

180 بازدید کننده نمایه
  1. قاسم رمضانی منش

    سلام و خسته نباشید. جناب اسدزاده باتشکر از رسیدگی شما. این مشکل در پست ارسال شده حل شد. اما همچنان در بخش ویرایشگر که میخواهیم کد را ارسال کنیم هیچ شماره خطی نمایش داده نمیشود.
  2. قاسم رمضانی منش

    @Amir Balazadeh دوست عزیز ! مرسی از پاسخِتان. ولی بهتر بود که توضیح میدادید موارد را به جای اینکه لینک ارسال کنید :). روش حل این مشکل را با توجه به روش هایی که داخل ساتی CodeProject گفته شده بود میگم تا ذخیره ای برای بقیه دوستانی باشد که این سوال رو دارن. داخل لینک سه روش گفته شده بود که دو روش رُ اینجا میگم : به همان دلیلی که گفتم + و کامپایل متوجه تعریفاتی که در فایل anothertest.cpp کردیم نمیشوند. برای رفع این مشکل ما باید یا تعاریف توابع خودمان را داخل خود کلاس قرار بدیم. یا اینکه خارج از کلاس ولی در همان فایلی که کلاس در آن هست. یعنی فایل anthertest.h. خب ! اینجا میتونیم از قابلیت های پیش‌پردازنده در سی‌پلاس‌پلاس استفاده کنیم. قبل از اینکه روش حل مشکل را بگم. یه نگاه به روش کار کرد این خط از کد بکنیم : File1.h void AnotherFunction(void){ std::cout << "I Can't do Anything :(" << std::endl; } main.cpp #include "file1.h" int main(){ return 0; } خب برای اینکه خروجی این فایل را مشاهده کنیم و متوجه بشیم که چطوری پیش‌پردازنده‌ی #include کار میکند. با استفاده از این دستور و کامپایلر gcc برنامه را کامپایل میکنیم : [ghasem@clibcore an]$ g++ -E main.cpp > file و حالا خروجی حاصل از دستور بالا : [ghasem@clibcore an]$ cat file # 1 "main.cpp" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "main.cpp" # 1 "file1.h" 1 void AnotherFunction(void){ std::cout << "I Can't do Anything :(" << std::endl; } # 2 "main.cpp" 2 int main(){ return 0; } امیدوارم کار پیش‌پردازنده‌ی #include را قشنگ متوجه شده باشید :). حالا برای قسمت حل مشکل template ها !. یه راه ساده برای حل این مشکل اینکه ما با فایل anothertest.cpp را بعد از کلاس با استفاده از #include اضافه کنیم ... به اینصورت : class TemplateTest{ private : int ClassVariable; public : TemplateTest(const int& input); int ReturnClassVariable(void); }; #include "anothertest.cpp" و یک راه دیگه : هر دوفایل anothertest.cpp و anothertest.h را داخل فایل کدمان یعنی main.cpp وارد کنیم : #include <iostream> #include "anothertest.h" #include "anothertest.cpp" int main(){ TemplateTest<int> AnotherTemplate(100); std::cout << AnotherTemplate.ReturnClassVariable () << std::endl; return 0x0000; } با تشکر.
  3. سلام در صورتی که تعاریف توابع عضو کلاس (class function member definition) را در همان فایل anothertest.h قرار دهیم برنامه بدون مشکلی اجرا میشود. اما در صورتی که تعاریف توابع را به داخل فایل anothertest.cpp انتقال دهیم ، برنامه کامپایل ولی با خطای لینکر مواجه میشود. دلیل این اتفاق چیست ؟ --ویرایش : پس از جستجویی که انجام دادم متوجه شدم که به دلیل اینکه کامپایلر برای هر نمونه از template هایی که ما نیاز داریم یک نسخه جداگانه درست میکند. مثلا در کد زیر. کد باید به این صورت تغییر کند : class TemplateTest{ private : int ClassVariable; public : TemplateTest(const int& input); int ReturnClassVariable(void); }; Git Diff #ifndef ANOTHERTEST_H #define ANOTHERTEST_H -template <class AnotherType> class TemplateTest{ private : - AnotherType ClassVariable; + int ClassVariable; public : - TemplateTest(const AnotherType& input); - AnotherType ReturnClassVariable(void); + TemplateTest(const int& input); + int ReturnClassVariable(void); }; #endif // ANOTHERTEST_H و از آنجایی که تعاریف کلاس ها در فایل دیگری قرار دارد. کامپایلر فراموش به نمونه سازی از آنها میکند. و به این دلیل است که با خطای لینکر مواجه میشویم. و برای رفع این مشکل باید تعاریف توابع را نیز در فایل anothertest.h قرار بدهیم. با این اوصاف آیا روش دیگه ای هست که از template ها در فایل های جداگانه استفاده کنیم ؟ anothertest.h #ifndef ANOTHERTEST_H #define ANOTHERTEST_H template <class AnotherType> class TemplateTest{ private : AnotherType ClassVariable; public : TemplateTest(const AnotherType& input); AnotherType ReturnClassVariable(void); }; #endif // ANOTHERTEST_H anothertest.cpp #include "anothertest.h" template<class AnotherType> TemplateTest<AnotherType>::TemplateTest(const AnotherType &input) : ClassVariable(input){ } template<class AnotherType> AnotherType TemplateTest<AnotherType>::ReturnClassVariable(){ return this->ClassVariable; } main.cpp #include <iostream> #include "anothertest.h" int main(){ TemplateTest<int> AnotherTemplate(100); std::cout << AnotherTemplate.ReturnClassVariable () << std::endl; return 0x0000; }
  4. قاسم رمضانی منش

    سلام خب اول برات delete رو میگم که ساده تره . شما یه توی برنامه نویسی شئ گرا که کار با کلاس ها (class) پیش میاد. همانطوری که میدونید توابعی به صورت پیشفرض کامپایلر داخل کلاس تعریف میکنه. که یکی از این توابع اسمش سازنده (constructor) هست که وظیفه مقدار دهی کلاس را داره. این مثال رو در نظربگیرید : #include <iostream> class JustForTest{ private : int ClassVariable; public : JustForTest(const int& input) : ClassVariable(input){ } int ReturnClassVariable(){ return this->ClassVariable; } }; int main(){ JustForTest Object(10); std::cout << Object.ReturnClassVariable () << std::endl; return 0; } خب کاری که داخل این کلاس انجام شده اینکه یه کلاس به اسم JustForTeste تعریف شده که دارای یه متغیر و دو تابع عضو هست. که یکی از توابع ، تابع سازنده کلاس هست. این برنامه در اجرا هیچ مشکلی نداره و دقیقا همان چیزی که ما انتظار داریم را چاپ میکنه ، که مقدار ده هست. حالا مشکل وقتی پیش میاد که برنامه نویسی بیاد و از کلاس شما استفاده کنه و سهواً مقداری از نوع char به سازنده کلاس ارسال کنه : int main(){ JustForTest Object('3'); std::cout << Object.ReturnClassVariable () << std::endl; return 0; } بر خلاف انتظارمان این کد هم کامپایل میشه ، چرا که خود char نوعی از int هست. و مسلما خروجی نامناسبی هم داره. برای اینکه این مشکل رفع بشه اغلب برنامه نویس ها از این روش استفاده میکنن : class JustForTest{ private : int ClassVariable; JustForTest(const char& input){ } public : JustForTest(const int& input) : ClassVariable(input){ } int ReturnClassVariable(){ return this->ClassVariable; } }; به این صورت که سازنده ای با ورودی char را با نوع دسترسی private تعریف میکنن که باعث میشه برنامه نویس های دیگر نتوانن مقدار از نوع char به تابع شما ارسال کنن. اما ! واضحه که این روش زیاد جالب نیست و باعث ناخوانی و زشتی کد هم میشه. لذا بهتره که با استفاده از قابلیتی که سی پلاس پلاس فراهم کرده استفاده کنیم و این سازنده را از کلاس حذف کنیم. که این کار با استفاده از کلمه کلیدی delete صورت میگیره : class JustForTest{ private : int ClassVariable; public : JustForTest(const int& input) : ClassVariable(input){ } JustForTest(const char& input) = delete; int ReturnClassVariable(){ return this->ClassVariable; } }; به همین سادگی و بدون خون ریزی و اما کلمه کلیدی explicit : تقریبا ماننده همون مثالی هست که برای کلمه کلیدی delete در قسمت بالا زدم. همانطوری که دیدید با اینکه ما مقدار char به تابع سازنده کلاس ارسال کردیم بدون مشکل برنامه کامپایل و اجرا شد. اما اتفاقی که پشت صحنه افتاده این بوده که : کامپایلر خودش مقدار char را به int تبدیل (cast) کرده. برای اینکه از این تبدیل جلوگیری کنیم. از کلمه کلیدی explicit قبل از تابع سازنده استفاده میکنیم : #include <iostream> class JustForTest{ private : int ClassVariable; public : explicit JustForTest(const int& input) : ClassVariable(input){ } int ReturnClassVariable(){ return this->ClassVariable; } }; int main(){ JustForTest Object = '3'; std::cout << Object.ReturnClassVariable () << std::endl; return 0; } برنامه ی بالا کامپایل نخواهد شد. چرا که هیچ تابع سازنده ای با پارامتر char پیدا نشده ! اما ممکنه که سوال بپرسید : پس فرق explicit با delete در چی هست ؟ جواب سوال : اگه کمی به کد دقت کنید متوجه میشید که ما با استفاده از Copy initialization (یعنی استفاده از = برای مقدار دهی) سازنده کلاس را مقدار دادیم. ولی درصورتی که از direct یا uniform initialization استفاده کنیم کد ما همچنان کامپایل میشود.. مثال : int main(){ JustForTest Object('3'); std::cout << Object.ReturnClassVariable () << std::endl; return 0; } خب برای اینکه به طور کلی ما تابع سازنده ای با پارامتر char را محدود کنیم باید از کلمه کلیدی delete‌ استفاده کنیم. خلاصه : کلمه کلیدی explicit برای محدود کردن تبدیل نوع در پارامتر کلاس هست. اما این در زمانی اتفاق می افتد که ما از copy initialization برای مقداردهی سازنده کلاس استفاده کنیم. و در صورت استفاده از direct یا uniform initialization دیگه این عمل امکان پذیر نیست. و برای اینکه یک تابع را به کلی از کلاس محدود کنیم از کلمه کلیدی delete استفاده میکنیم که باعث میشود هیچ شئ توانایی فراخوانی آن تابع را نداشته باشد.
  5. قاسم رمضانی منش

    سلام اول بگم که شما نمیتونید بدون داشتن تجربه عملی و واقعی ، توانایی نوشتن کد های با کیفیت و Stable داشته باشید. و حتما باید در پروژه های واقعی و بزرگ شرکت کنید. گفتم که ! برنامه نویسی بدون تجربه و تلاش های مستمر نشدنی هست. پس به این راحتی نباید انتظار درآمد زایی داشته باشید. اما میتونید کار هایی اعم از نوشتن پروژه های جدید ... و ثبت خلاقیت های جدید انجام بدید. مثل یه نمونه از پیشنهادی که دوستمون دادن @mohamad ... و مثالی که درباره انیستاگرام زدن. و اما یک سری پیشنهاد : سعی کنید با استارت آپ های کوچک و نوپا همکار بشید و شراکت کنید. پروژه های داخل Gitlab و Github را دنبال کنید. معمولا بیشتر پروژه ها دارای یه لیست به اسم TODO هستن ، شما میتونید با کامل کردن اونا به تجربه های برنامه نویسی خودتون اضافه کنید. و همچنین رزومه ی خودتون. جهت کارآموزی به شرکت های برنامه نویسی معتبر برید. برای پیدا کردن این شرکت ها میتونید از طریق آگهی های استخدامی که داخل سایت های کاریابی مثل جابینجا استفاده کنید پروژه های درحال تست و unstable رو بررسی کنید و سعی کنید باگ های برنامه ها را پیدا و باگ ها را برطرف کنید. و رفته رفته سعی کنید بر علم برنامه نویسی و دانش خودتون توی برنامه نویسی بی‌افزایید.
  6. قاسم رمضانی منش

    مرسی بعد از راه اندازی دوباره محیط Qt Creator زبانه C++ Code Style دوباره در قسمت تنظیمات محیط برگشت.
  7. قاسم رمضانی منش

    بله ! از این پلاگین را فعلا کرده بودم. و دوباره بعد از غیر فعال کردن هم تاثیری در بازگشت اون زبانه C++ Cody Style نداشت
  8. قاسم رمضانی منش

    سلام ! در محیط Qt Creator 4.8 (Base On Qt 5.12.0) پس از بررسی قسمت تنظیمات (Tools -> Options ) متوجه شدم که زبانه C++ Code Style دردسترس نمی‌باشد. آیا راهی برای برگرداندن این زبان هست ؟
  9. با سلام و تشکر ! منظورتان دقیقا از یک برنامه ی قابل اعتماد چیست ؟
  10. قاسم رمضانی منش

    سلام بهتر بود که مشکلتون رُ هم با این کار بگید ! درکل برای اینکار میتونید از دستورالعمل هایی که در این قسمت گفته شده استفاده کنید : SQL Database Drivers : Building the Drivers این لینک ها هم میتونن مفید باشن : Create MySQL driver for Qt5 on Windows Connection Database in Qt creator
  11. با سلام ! کلاس Person زیر را در نظر بگیرید : class Person: Age = 0; Rank = 0; Grade = 0; AnotherRank = 0; def PrintVariable(self): print(Person.Age); print(Person.AnotherRanke); حال اگه ما چیزی حدود 1000+ تا شئ از این کلاس داشته باشیم. و نیاز باشه که تمام مقادیر این متغیر ها به داخل یک فایل CSV انتقال داده بشه. چه روشی پیشنهاد میکنید ؟ Pyhton Version 3
  12. قاسم رمضانی منش

    برنامه با Log زیر ، لحظه ای اجرا و بعد بسته میشود با استفاده از دیباگر gdb برنامه ی Qt 3D Studio را اجرا گرفتم که دلیل Segmentation fault (core dumped) را : Thread 1 "Qt3DStudio" received signal SIGSEGV, Segmentation fault. 0x0000000000916157 in CStudioApp::getDuplicateType (this=this@entry=0x11b7cc0 <g_StudioApp>) at Application/StudioApp.cpp:996 996 Application/StudioApp.cpp: No such file or directory. گفته است.
  13. قاسم رمضانی منش

    با سلام ! بعد از نصب بسته های Qt 3D Studio 2.2.0 و Qt 3D Studio Runtime 2.2.0 با استفاده از نصاب آنلاین ; برنامه را در دایرکتوری Qt/Qt3DStudio-2.2.0/bin اقدام به اجرای برنامه کردم : [ghasem@clibcore bin]$ ./Qt3DStudio برنامه با Log زیر ، لحظه ای اجرا و بعد بسته میشود : [ghasem@clibcore bin]$ ./Qt3DStudio qt3ds.trace_info: Studio: "/home/ghasem/Software/Qt/Qt3DStudio-2.2.0/bin/Qt3DStudio" qt3ds.trace_info: Version: "2.2.0" static QSurfaceFormat CWGLRenderContext::selectSurfaceFormat(QOpenGLWidget*) selected surface format: QSurfaceFormat(version 3.3, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::CoreProfile) Warning: Setting a new default format with a different version or profile after the global shared context is created may cause issues with context sharing. libpng warning: iCCP: known incorrect sRGB profile static QSurfaceFormat CWGLRenderContext::selectSurfaceFormat(QOpenGLWidget*) selected surface format: QSurfaceFormat(version 3.3, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::CoreProfile) Warning: Setting a new default format with a different version or profile after the global shared context is created may cause issues with context sharing. Segmentation fault (core dumped) طبق گفته سایت مربوطه حداقل نیاز OpenGL ورژن 3.3 هست. مشخصات نسخه ای که من استفاده میکنم : OpenGL vendor string: nouveau OpenGL renderer string: NVA8 OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.2.4 OpenGL core profile shading language version string: 3.30 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 3.1 Mesa 18.2.4 OpenGL shading language version string: 1.40 OpenGL context flags: (none) OpenGL ES profile version string: OpenGL ES 3.0 Mesa 18.2.4 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00 مشخصات پلتفرم : OS : Fedora release 29 (Twenty Nine) x86_64 Kernel : 4.19.4-300.fc29.x86_64 GPU : NVIDIA NVS 3100M Qt : 5.11.2 - 5.12.0 آیا پیشنیاز دیگه ای برای نصب نیاز هست ؟
  14. قاسم رمضانی منش

    بعد نظرتون درباره Comment ها چیه ؟ شما به چه شکل ترجیه میدید ؟ ۱- حالت اول : void sortArray(std::array<int, g_arrayElements> &array) { // Step through each element of the array // (except the last one, which will already be sorted by the time we get there) for (int startIndex = 0; startIndex < g_arrayElements - 1; ++startIndex) { // smallestIndex is the index of the smallest element we’ve encountered this iteration // Start by assuming the smallest element is the first element of this iteration int smallestIndex = startIndex; // Then look for a smaller element in the rest of the array for (int currentIndex = startIndex + 1; currentIndex < g_arrayElements; ++currentIndex) { // If we've found an element that is smaller than our previously found smallest if (array[currentIndex] < array[smallestIndex]) // then keep track of it smallestIndex = currentIndex; } // smallestIndex is now the smallest element in the remaining array // swap our start element with our smallest element (this sorts it into the correct place) std::swap(array[startIndex], array[smallestIndex]); } } ۲- حالت دوم : void sortArray(std::array<int, g_arrayElements> &array){ // Step through each element of the array // (except the last one, which will already be sorted by the time we get there) // smallestIndex is the index of the smallest element we’ve encountered this iteration // Start by assuming the smallest element is the first element of this iteration // Then look for a smaller element in the rest of the array // If we've found an element that is smaller than our previously found smallest // smallestIndex is now the smallest element in the remaining array // swap our start element with our smallest element (this sorts it into the correct place) for (int startIndex = 0; startIndex < g_arrayElements - 1; ++startIndex){ int smallestIndex = startIndex; for (int currentIndex = startIndex + 1; currentIndex < g_arrayElements; ++currentIndex) { if (array[currentIndex] < array[smallestIndex]) smallestIndex = currentIndex; } std::swap(array[startIndex], array[smallestIndex]); } }
  15. قاسم رمضانی منش

    اونا مثال بود. گفتم که مثلا شما وقتی با یک (تابع|متغیر) بر خورد میکنید. انتظار دارید که شکل ظاهریش به چه صورت باشه.. و همینطور نامگذاری متغیر ها. اسم (متغیر|تابع) طولانی و با معنی باشه راحت ترید ؟ یا اینکه اسم متغیر کوتاه و مختصر باشه ؟ مرسی بابت لینک . آها... اوکی مرسی
×