رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

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

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

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

  • روز های برد

    25

پست ها ارسال شده توسط قاسم رمضانی منش


  1. در 4 دقیقه قبل، سروش ربیعی گفته است :
    در 1 ساعت قبل، قاسم رمضانی منش گفته است :

     

    نه هیچ برنامه‌ای به‌طور خودکار در چند ترد اجرا نمیشه.

    مرسی بابت پاسخ. بله الان که با خوندن فایل /proc/PID/status متوجه شدم که کلا این برنامه از یک thread بیشتر استفاده نمیکنه :).


  2. در 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 دقیقه قبل، بهنام صباغی گفته است :

    میتونید با فلگ تنظیم کنید

    با چه فلگ هایی این  عمل صورت میگیره ؟


  3. با سلام !

    آیا برنامه ها به صورت خودکار در حالت 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 کد را کامپایل میکند ؟ یا اینکه این‌کار به عهده سیستم عامل می‌باشد ؟


  4. با سلام.

    بنده خروجی کد اسمبلی تولید شده 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

  5. سلام و خسته نباشید. 

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

    test.jpg

    • تشکر شده 1

  6. @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;
    }

     

    با تشکر.


  7. سلام 

    در صورتی که تعاریف توابع عضو کلاس (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;
    }
    

     


  8. سلام 

    خب اول برات 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;
        }
    };

    به همین سادگی و بدون خون ریزی :classic_biggrin:

     

    و اما کلمه کلیدی 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

  9. سلام 

    در 32 دقیقه قبل، CISCO گفته است :

    اگر شما برنامه نویسی رو کامل و بدون مشکل بلد باشی

    اول بگم که شما نمیتونید بدون داشتن تجربه عملی و واقعی ، توانایی نوشتن کد های با کیفیت و Stable داشته باشید. و حتما باید در پروژه های واقعی و بزرگ شرکت کنید.

     

    در 33 دقیقه قبل، CISCO گفته است :

    اولین حرکتی که میکنید برای پول در آوردن چیه

    گفتم که ! برنامه نویسی بدون تجربه و تلاش های مستمر نشدنی هست. پس به این راحتی نباید انتظار درآمد زایی داشته باشید. 

    اما میتونید کار هایی اعم از نوشتن پروژه های جدید ... و ثبت خلاقیت های جدید انجام بدید.

    مثل یه نمونه از پیشنهادی که دوستمون دادن @mohamad ... و مثالی که درباره انیستاگرام زدن. 

     

     

    و اما یک سری پیشنهاد :

    1. سعی کنید با استارت آپ های کوچک و نوپا همکار بشید و شراکت کنید.
    2. پروژه های داخل Gitlab و Github را دنبال کنید. معمولا بیشتر پروژه ها دارای یه لیست به اسم TODO هستن ، شما میتونید با کامل کردن اونا به تجربه های برنامه نویسی خودتون اضافه کنید. و همچنین رزومه ی خودتون.
    3. جهت کارآموزی به شرکت های برنامه نویسی معتبر برید. برای پیدا کردن این شرکت ها میتونید از طریق آگهی های استخدامی که داخل سایت های کاریابی مثل جابینجا استفاده کنید
    4. پروژه های درحال تست و unstable رو بررسی کنید و سعی کنید باگ های برنامه ها را پیدا و باگ ها را برطرف کنید. 

    و رفته رفته سعی کنید بر علم برنامه نویسی و دانش خودتون توی برنامه نویسی بی‌افزایید. 

     


  10. سلام 

    بهتر بود که مشکلتون رُ هم با این کار بگید !

    درکل برای اینکار میتونید از دستورالعمل هایی که در این قسمت گفته شده استفاده کنید :

    SQL Database Drivers : Building the Drivers

     

    این لینک ها هم میتونن مفید باشن :

    Create MySQL driver for Qt5 on Windows

    Connection Database in Qt creator


  11. برنامه با 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.
    

    گفته است.


  12. با سلام !

    بعد از نصب بسته های 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

    آیا پیشنیاز دیگه ای برای نصب نیاز هست ؟

     


  13. بعد نظرتون درباره 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]);
    	}
    }

     


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

    • اسم (متغیر|تابع) طولانی و با معنی باشه راحت ترید ؟
    • یا اینکه اسم متغیر کوتاه و مختصر باشه ؟

     

    مرسی بابت لینک .

    آها... اوکی مرسی:classic_huh:


  15. با سلام !

    به نظر برنامه نویسان حرفه ای ، وقتی یه پروژه ای (چند صد هزارخطی) به شما داده میشه چه انتظاری از نامگذاری توابع و متغیر ها دارید ؟ (چه انتظارات ظاهری از کد دارید ؟)

    برای مثال :

    • کدام یکی از توابع زیر درک و خواندنش برای یک فرد خارجی (کسی که قصد ویرایش کد نوشته شد فرد دیگری را دارد) راحت تر است ؟
    unsigned short int PrintArrayElemets(const int *Array);
    
    int printArray(const int *arr);
    • سورس کد لینوکس (نوشته شده به زبان سی) تقریبا بیشتر قسمت ها توابع به اینصورت تعریف شده است ... آیا شما به عنوان یک ویرایشگر (برنامه نویسی حرفه ای) این روش را راحت برای خواندن و درک کد قبول میکنید ؟
    unsigned short int 
    PrintArrayElemets(const int *Array);
    
    int 
    printArray(const int *arr);

     


  16. در 21 دقیقه قبل، بهنام صباغی گفته است :

    یعنی حدودا 6 ثانیه و نیم

    راضی هستی یا بهترش کنم ؟

    درمورد کتابخونه ای که گفتی دارم الان یه چیز هایی میخونم :X واقعا عالیه ! همین ابزار در کنار قدرت بهینه سازی که خودمون میتونیم توی کد اعمال کنیم مثل مواردی که آقای شیری و اسدزاده گفتن سرعت فوق العاده ای رومیتونیم داشته باشیم  :classic_biggrin:.

    مرسی آقا بهنام راضی راضی ام متشکر :classic_ninja:

     


  17. در 6 دقیقه قبل، فرهاد شیری گفته است :

    الگوریتم های مرتب سازی های دیگه را هم تست کنید

    بله ! صدالبته که عملکرد انواع الگوریتم ها و روششون میتونه توی سرعت تاثیر داشته باشه.

    مثل اینکه درست منظور خودم را نگفتم:) هردو کدی که ارسال کردم به یک روش نوشته شده اند ولی یکی به زبان سی پلاس پلاس و با استفاده از کتابخانه های استاندارد و یکی با استفاده از زبان سی و کتابخونه های استاندارد خودش. 

    البته این مورد بدیهی هست که سرعت کمی از سی به سی پلاس پلاس کاهش پیدا کنه. که بنده دنبال راهی بودم برای رفع این مشکل که آقا بهنام با معرفی فلگ بهینه سازی O- تا حدود بسیار زیادی این مشکل رو برطرف کردن.


  18. در 7 دقیقه قبل، فرهاد شیری گفته است :
    در 2 ساعت قبل، قاسم رمضانی منش گفته است :

     

    معمولا خیلی بهتره که اینطور پردازش های سنگین را به صورت موازی انجام بدید مثلا از تکنیک Divide and Concur استفاده کنید.

    ولی با تغییراتی که دادم برای 20000 تا تقریبا 3 ثانیه طول کشید که سورت کنه!

    مرسی ممنون حتما درباره این تکنیک جستجو میکنم.

    با تغییراتی که دادید سرعت را از  ۷ دقیقه به ۱ دقیقه کاهش دادید !. (شما با مقدار ۲۰۰۰۰ هزار اجرا کرده بودید. مقدار پیش فرض ۱۰۰۰۰۰ بود.)


  19. در 19 دقیقه قبل، بهنام صباغی گفته است :

    حالا تست دوم با تنظیم کردن دو تا فلگ برای بهینه سازی فلگ های -O3 و -ffast-math

    مرسی متشکرم.

    بله سرعت رو به شدت بالابرد !

    اما !

    این فلگ هایی که گفتید فقط فلگ اول O3- برای بهینه سازی هست که باعث افزایش سرعت میشه.

    و فلگ دوم ffast-math- به کامپایلر اجازه میده که یک سری از قوانین IEEE و ISO و نقض کنه  :

    GCC Command Options

    و گفته شده که در صورت استفاده از فلگ ffast-math- از هیچ کدام سطح های بهینه سازی O- استفاده نکنید که باعث خروجی اشتباه میشه !

    • پسندیدن 1

  20. با سلام !

    دو قطعه برنامه ی زیر یکی آرایه ۱۰۰۰۰۰ تایی در حافظه 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

  21. در 9 ساعت قبل، کامبیز اسدزاده گفته است :

    دستورات زیر را در ترمینال اجرا کنید.

    
    sudo apt-get install build-essential
    sudo apt-get install mesa-common-dev libglu1-mesa-dev

     

    مرسی تشکر با نصب دو بسته آخر درست شد.

    سوال : از کجا متوجه شدید که این بسته ها مورد نیاز هست ؟

    • پسندیدن 1
×
×
  • جدید...