-
تعداد ارسال ها
97 -
تاریخ عضویت
-
روز های برد
25
پست ها ارسال شده توسط قاسم رمضانی منش
-
-
در 9 دقیقه قبل، بهنام صباغی گفته است :محیط توسعه
دقیقا متوجه نشدم منظورتان را از محیط توسعه .
مشخصات سیستمی که این برنامه را اجرا کرده :
OS: Fedora release 29 (Twenty Nine) x86_64 Kernel: 4.19.6-300.fc29.x86_64 CPU: Intel i7 M 620 (4) @ 2.667GHz GPU: NVIDIA NVS 3100M Memory: 3801MiB
و کامپایلر
g++ (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5)
بدون دستکاری فلگها استفادهدر 9 دقیقه قبل، بهنام صباغی گفته است :میتونید با فلگ تنظیم کنید
با چه فلگ هایی این عمل صورت میگیره ؟
-
با سلام !
آیا برنامه ها به صورت خودکار در حالت Multi Threading اجرا میشوند ؟
بنده قطعه کد زیر را کامپایل و اجرا گرفته ام :
main.cpp
#include <iostream> int main(void){ constexpr double long AnotherIndex = 999999999999999999; for(double long index=0;index <= AnotherIndex;++index){ std::cout << index << std::endl; } return 0x0000; }
بعد از اجرا ، خروجی برنامه ی
htop
به اینصورت بود :1 [|||||||||||||||||||||| 71.9% ] Tasks: 166, 738 thr; 4 running 2 [||||||||||||||||||| 60.30%] Load average: 2.94 1.88 1.61 3 [||||||||||||||||||||||| 74.1% ] Uptime: 04:50:24 4 [|||||||||||||||||| 56.6% ] Mem[||||||||||||||||||||||||2.76G/3.71G] Swp[||| 790M/7.99G] PID USER PRI NI VIRT PES SHR S CPU% MEM% TIME+ Command 18991 ghasem 20 0 5616 1692 1544 R 89.1 0.0 1:13.01 /tmp/Opt/main
یعنی زمان اجرای این برنامه هر چهار هسته ی پردازنده درگیر خواهد شد ! ... آیا کامپایلر به صورت خودکار متناسب با پردازش Multi Threading کد را کامپایل میکند ؟ یا اینکه اینکار به عهده سیستم عامل میباشد ؟
-
با سلام.
بنده خروجی کد اسمبلی تولید شده Struct و Class را بررسی کردم ظاهرا که خروجی یکسانی دارند ! آیا واقعا دیگر تفاوتی بین کلمهکلیدی
struct
وclass
در سیپلاسپلاس نیست ؟struct.cpp
struct AnotherType{ public : int StructType; }; int main(){ AnotherType Object; return 0; }
class.cpp
class AnotherType{ public : int ClassType; }; int main(){ AnotherType Object; return 0; }
و خروجی های اسمبلی تولید شده :
struct.cpp
[ghasem@clibcore test]$ g++ -S struct.cpp -o Struct && cat Struct .file "struct.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits
class.cpp
[ghasem@clibcore test]$ g++ -S class.cpp -o Class && cat Class .file "class.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits
و برای اطمینان خروجی حاصل از دستور
diff Struct Class
:[ghasem@clibcore test]$ diff Struct Class 1c1 < .file "struct.cpp" --- > .file "class.cpp"
- 1
-
-
@Amir Balazadeh دوست عزیز ! مرسی از پاسخِتان. ولی بهتر بود که توضیح میدادید موارد را به جای اینکه لینک ارسال کنید :).
روش حل این مشکل را با توجه به روش هایی که داخل ساتی CodeProject گفته شده بود میگم تا ذخیره ای برای بقیه دوستانی باشد که این سوال رو دارن.
داخل لینک سه روش گفته شده بود که دو روش رُ اینجا میگم :
به همان دلیلی که گفتم
در 4 ساعت قبل، قاسم رمضانی منش گفته است :دلیل اینکه کامپایلر برای هر نمونه از
template
هایی که ما نیاز داریم یک نسخه جداگانه درست میکند.+ و کامپایل متوجه تعریفاتی که در فایل
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; }
با تشکر.
-
سلام
در صورتی که تعاریف توابع عضو کلاس (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; }
-
سلام
خب اول برات
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
استفاده میکنیم که باعث میشود هیچ شئ توانایی فراخوانی آن تابع را نداشته باشد.- 3
-
سلام
در 32 دقیقه قبل، CISCO گفته است :اگر شما برنامه نویسی رو کامل و بدون مشکل بلد باشی
اول بگم که شما نمیتونید بدون داشتن تجربه عملی و واقعی ، توانایی نوشتن کد های با کیفیت و Stable داشته باشید. و حتما باید در پروژه های واقعی و بزرگ شرکت کنید.
در 33 دقیقه قبل، CISCO گفته است :اولین حرکتی که میکنید برای پول در آوردن چیه
گفتم که ! برنامه نویسی بدون تجربه و تلاش های مستمر نشدنی هست. پس به این راحتی نباید انتظار درآمد زایی داشته باشید.
اما میتونید کار هایی اعم از نوشتن پروژه های جدید ... و ثبت خلاقیت های جدید انجام بدید.
مثل یه نمونه از پیشنهادی که دوستمون دادن @mohamad ... و مثالی که درباره انیستاگرام زدن.
و اما یک سری پیشنهاد :
- سعی کنید با استارت آپ های کوچک و نوپا همکار بشید و شراکت کنید.
- پروژه های داخل Gitlab و Github را دنبال کنید. معمولا بیشتر پروژه ها دارای یه لیست به اسم TODO هستن ، شما میتونید با کامل کردن اونا به تجربه های برنامه نویسی خودتون اضافه کنید. و همچنین رزومه ی خودتون.
- جهت کارآموزی به شرکت های برنامه نویسی معتبر برید. برای پیدا کردن این شرکت ها میتونید از طریق آگهی های استخدامی که داخل سایت های کاریابی مثل جابینجا استفاده کنید
- پروژه های درحال تست و unstable رو بررسی کنید و سعی کنید باگ های برنامه ها را پیدا و باگ ها را برطرف کنید.
و رفته رفته سعی کنید بر علم برنامه نویسی و دانش خودتون توی برنامه نویسی بیافزایید.
-
مرسی
بعد از راه اندازی دوباره محیط Qt Creator زبانه C++ Code Style دوباره در قسمت تنظیمات محیط برگشت.
-
بله ! از این پلاگین را فعلا کرده بودم. و دوباره بعد از غیر فعال کردن هم تاثیری در بازگشت اون زبانه C++ Cody Style نداشت
-
سلام !
در محیط
Qt Creator 4.8 (Base On Qt 5.12.0)
پس از بررسی قسمت تنظیمات (Tools -> Options
) متوجه شدم که زبانه C++ Code Style دردسترس نمیباشد. آیا راهی برای برگرداندن این زبان هست ؟- 1
-
در ۱ ساعت قبل، کامبیز اسدزاده گفته است :اگر شما به یک برنامهٔ کاملاً قابل اعتماد در این حوزه نیاز دارید
با سلام و تشکر !
- منظورتان دقیقا از یک برنامه ی قابل اعتماد چیست ؟
- 1
-
سلام
بهتر بود که مشکلتون رُ هم با این کار بگید !
درکل برای اینکار میتونید از دستورالعمل هایی که در این قسمت گفته شده استفاده کنید :
SQL Database Drivers : Building the Drivers
این لینک ها هم میتونن مفید باشن :
-
برنامه با 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.
گفته است.
-
با سلام !
بعد از نصب بسته های
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
آیا پیشنیاز دیگه ای برای نصب نیاز هست ؟
-
بعد نظرتون درباره 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]); } }
-
اونا مثال بود. گفتم که مثلا شما وقتی با یک (تابع|متغیر) بر خورد میکنید. انتظار دارید که شکل ظاهریش به چه صورت باشه.. و همینطور نامگذاری متغیر ها.
- اسم (متغیر|تابع) طولانی و با معنی باشه راحت ترید ؟
- یا اینکه اسم متغیر کوتاه و مختصر باشه ؟
مرسی بابت لینک .
آها... اوکی مرسی
-
با سلام !
به نظر برنامه نویسان حرفه ای ، وقتی یه پروژه ای (چند صد هزارخطی) به شما داده میشه چه انتظاری از نامگذاری توابع و متغیر ها دارید ؟ (چه انتظارات ظاهری از کد دارید ؟)
برای مثال :
- کدام یکی از توابع زیر درک و خواندنش برای یک فرد خارجی (کسی که قصد ویرایش کد نوشته شد فرد دیگری را دارد) راحت تر است ؟
unsigned short int PrintArrayElemets(const int *Array); int printArray(const int *arr);
- سورس کد لینوکس (نوشته شده به زبان سی) تقریبا بیشتر قسمت ها توابع به اینصورت تعریف شده است ... آیا شما به عنوان یک ویرایشگر (برنامه نویسی حرفه ای) این روش را راحت برای خواندن و درک کد قبول میکنید ؟
unsigned short int PrintArrayElemets(const int *Array); int printArray(const int *arr);
-
در 21 دقیقه قبل، بهنام صباغی گفته است :یعنی حدودا 6 ثانیه و نیم
راضی هستی یا بهترش کنم ؟
درمورد کتابخونه ای که گفتی دارم الان یه چیز هایی میخونم :X واقعا عالیه ! همین ابزار در کنار قدرت بهینه سازی که خودمون میتونیم توی کد اعمال کنیم مثل مواردی که آقای شیری و اسدزاده گفتن سرعت فوق العاده ای رومیتونیم داشته باشیم .
مرسی آقا بهنام راضی راضی ام متشکر
-
در 6 دقیقه قبل، فرهاد شیری گفته است :الگوریتم های مرتب سازی های دیگه را هم تست کنید
بله ! صدالبته که عملکرد انواع الگوریتم ها و روششون میتونه توی سرعت تاثیر داشته باشه.
مثل اینکه درست منظور خودم را نگفتم:) هردو کدی که ارسال کردم به یک روش نوشته شده اند ولی یکی به زبان سی پلاس پلاس و با استفاده از کتابخانه های استاندارد و یکی با استفاده از زبان سی و کتابخونه های استاندارد خودش.
البته این مورد بدیهی هست که سرعت کمی از سی به سی پلاس پلاس کاهش پیدا کنه. که بنده دنبال راهی بودم برای رفع این مشکل که آقا بهنام با معرفی فلگ بهینه سازی O- تا حدود بسیار زیادی این مشکل رو برطرف کردن.
-
در 7 دقیقه قبل، فرهاد شیری گفته است :در 2 ساعت قبل، قاسم رمضانی منش گفته است :معمولا خیلی بهتره که اینطور پردازش های سنگین را به صورت موازی انجام بدید مثلا از تکنیک Divide and Concur استفاده کنید.
ولی با تغییراتی که دادم برای 20000 تا تقریبا 3 ثانیه طول کشید که سورت کنه!
مرسی ممنون حتما درباره این تکنیک جستجو میکنم.
با تغییراتی که دادید سرعت را از ۷ دقیقه به ۱ دقیقه کاهش دادید !. (شما با مقدار ۲۰۰۰۰ هزار اجرا کرده بودید. مقدار پیش فرض ۱۰۰۰۰۰ بود.)
-
در 19 دقیقه قبل، بهنام صباغی گفته است :حالا تست دوم با تنظیم کردن دو تا فلگ برای بهینه سازی فلگ های -O3 و -ffast-math
مرسی متشکرم.
بله سرعت رو به شدت بالابرد !
اما !
این فلگ هایی که گفتید فقط فلگ اول O3- برای بهینه سازی هست که باعث افزایش سرعت میشه.
و فلگ دوم ffast-math- به کامپایلر اجازه میده که یک سری از قوانین IEEE و ISO و نقض کنه :
و گفته شده که در صورت استفاده از فلگ ffast-math- از هیچ کدام سطح های بهینه سازی O- استفاده نکنید که باعث خروجی اشتباه میشه !
- 1
-
با سلام !
دو قطعه برنامه ی زیر یکی آرایه ۱۰۰۰۰۰ تایی در حافظه Stack ساخته و به صورت Random مقداردهی شده و Sort میشود. کد اول به زبان ++C و با استاندارد 11 نوشته شده است که حدود ۷ دقیقه و کد دوم به زبان C نوشته شده است که حدود 1 دقیقه زمان میبرد !
CPU : Intel i7 M 620 (4) @ 2.667GHz
آیا راهی برای بهینه سازی سرعت اجرای برنامه ی نوشته شده به زبان ++C هست ؟
کد نوشته به زبان ++C :
#include <iostream> #include <functional> #include <utility> #include <array> #include <random> #include <chrono> const unsigned int MAX_LENGTH = 100000; bool Compare(unsigned int FirstVariable,unsigned int SecondVariable){ if(FirstVariable < SecondVariable) return true; return false; } void SortArray(std::array<unsigned int,MAX_LENGTH> &MyArray,std::function<bool(unsigned int,unsigned int)> function){ for(unsigned int index=0;index < MAX_LENGTH;++index) for(unsigned int AnotherIndex=0;AnotherIndex<MAX_LENGTH;++AnotherIndex) if(function(MyArray[index],MyArray[AnotherIndex])) std::swap(MyArray[index],MyArray[AnotherIndex]); } void PrintArrayElements(const std::array<unsigned int,MAX_LENGTH> &MyArray){ for(const auto &item : MyArray) std::cout << item << std::endl; } void RandomizeArray(std::array<unsigned int,MAX_LENGTH> &MyArray){ std::mt19937_64 Random(static_cast<int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())); std::uniform_int_distribution<> RandomGenerator(0,1000); for(unsigned int index=0;index<MAX_LENGTH;++index) MyArray[index] = static_cast<unsigned int>(RandomGenerator(Random)); } int main(){ std::array<unsigned int,MAX_LENGTH> MyOrginalArray; RandomizeArray(MyOrginalArray); SortArray(MyOrginalArray,Compare); PrintArrayElements(MyOrginalArray); return 0x0000; }
کد نوشته شده به زبان C :
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define MAX_LENGTH 100000 bool Compare(unsigned int FirstVariable,unsigned int SecondVariable){ if(FirstVariable < SecondVariable) return true; return false; } void SortArray(unsigned int *MyArray,bool (*compare)(unsigned int,unsigned int)){ unsigned int tmp=0; for(unsigned int index=0;index < MAX_LENGTH;++index){ for(unsigned int AnotherIndex=0;AnotherIndex<MAX_LENGTH;++AnotherIndex){ if(compare(MyArray[index],MyArray[AnotherIndex])){ tmp = MyArray[index]; MyArray[index] = MyArray[AnotherIndex]; MyArray[AnotherIndex] = tmp; } } } } void RandomizeArray(unsigned int *MyArray){ srand(time(NULL)); for(unsigned int index=0;index < MAX_LENGTH ;++index) MyArray[index] = rand() % 1000; } void PrintArrayElements(unsigned int *MyArray){ for(unsigned int index=0;index<MAX_LENGTH;++index) fprintf(stdout,"%d\n",MyArray[index]); } int main(){ unsigned int Array[MAX_LENGTH]; RandomizeArray(Array); SortArray(Array,Compare); PrintArrayElements(Array); return 0x0000; }
- 1
-
در 9 ساعت قبل، کامبیز اسدزاده گفته است :دستورات زیر را در ترمینال اجرا کنید.
sudo apt-get install build-essential sudo apt-get install mesa-common-dev libglu1-mesa-dev
مرسی تشکر با نصب دو بسته آخر درست شد.
سوال : از کجا متوجه شدید که این بسته ها مورد نیاز هست ؟
- 1
وضعیت اجرای برنامهها در حالت Multi Threading
در سوالات عامیانه در رابطه با ++C مدرن
ارسال شده در
مرسی بابت پاسخ. بله الان که با خوندن فایل
/proc/PID/status
متوجه شدم که کلا این برنامه از یک thread بیشتر استفاده نمیکنه :).