اطلاعیه

Collapse
No announcement yet.

آموزش C++ (در میکرو..)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آموزش C++ (در میکرو..)

    سلام به همه دوستان.
    داشتم بررسی میکردم چرا استقبال از تاپیکی که برای container های سی++ زده بودم زیاد نبود.تاپیک اینجاست:
    همین جا!
    با خودم گفتم حتما زیاد از قابلیت های زبان سی خبر ندارند و یا خود این زبون رو بلد نیستند. گفتم یه تاپیکی بزنم یه کم در مورد این قضیه حرف بزنم تا دوستان آشنا بشند.اینجا من فرض میکنم شما خود سی رو بلد هستید و if,for,......این چیز ها رو دوباره نمیگم.آموزش این چیزا خیلی زیاده و دوباره کاری بهتره نکنیم.برای شروع یه یاد آوری از سی میکنم که چطور سعی میشد شی گرایی(در موردش میگم...) رو پیاده کرد.
    در سی با ساختار ها میشد نوع داده ای جدید ایجاد کرد. یه مثال:

    typedef struct
    {
    unsigned char wheel;
    unsigned char color;
    unsigned char door;
    }CAR;


    بعد از تعریف هرجا که CAR رو مینوشتیم میشد از این متغییر استفاده کرد:

    CAR mashineA;
    CAR cars[2];

    تو برنامه هم با عملگر . میشد به مقدار ها دسترسی پیدا کرد.(اگه به عنوان اشاره گر بود <- استفاده میشد)

    mashinA.door=4;
    cars[0].color=RED;

    این رو از سی فقط به عنوان یاد آوری گفتم.دونستن این قضیه تو کلاس ها کمک میکنه....
    منتظر باشید تا به خود آموزش برسیم......
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    #2
    پاسخ : آموزش C++ (در میکرو..)

    سوادمون به اونجا ها نمیرسید :redface:
    در ضمن من به شدت به این struct و typedef و enum و ... نیاز دارم
    کسی درست بهم توضیح نداده تا حالا اگه میشه ادامه بدید
    باتشکر

    دیدگاه


      #3
      پاسخ : آموزش C++ (در میکرو..)

      موضوعی که در زبان سی خیلی اهمیت داره شی گرایی اون هست.این حالا یعنی چی؟ یعنی تمام موارد که ما با اون ها سرو کار داریم به صورت یک شی هستند.مثلا پورت ها رو تو AVR مثال میزنم که برای بیشتر دوستان ملموس باشه. به جای اینکه از 3 تا ریجستر و کلی تابع استفاده کنیم و با اون ها سر و کله بزنیم فقط با یک شی سرو کله میزنیم و همه کار ها رو با این شی انجام میدیم. با استفاده از این شی گرایی لایه های برنامه رو راحت میتونیم اضافه کنیم.مثلا الان برای AVR یه برنامه رو نوشتیم اما فردا میخوایم برای ARM استفاده کنیم باید کل برنامه رو تغییر بدیم یا فقط شی پورت رو که با سخت افزار در ارتباط هست؟ اینکه در اینجا من پورت رو مثال زدم دلیل بر این نمیشه که فقط شی های حقیقی میتونند تعریف بشند.شما تو برنامه هر چیزی رو میتونید به عنوان یک شی در نظر بگیرید. به طور مثال یک شی با عنوان pen تعریف کنید و رنگ و سایز و فونت و.... نوشته رو از طریق این ایجاد میکنید و برای جابجایی یا اصلاح نیاز نیست که همه ی این موارد تغییر کنند و فقط شی pen رو تغییر میدیم. یا مثلا شی room رو تعریف میکنیم که شامل دما,نور,وضعیت در و پنجره و..... هستش.به تعدادی که نیاز هست از این اتاق تعریف میکنیم و کنترل رو با این انجام میدیم.شی ها میتونند زیر مجموعه هم داشته باشند.یه شی جدید داریم به نام house که یکی از اعضای اون شی room هست.به همین ترتیب هرکاری که تو دنیای واقعی با اشیا انجام میدید در اینجا هم میشه انجام داد. از مشتق شدن و ارث بری و......
      اشیا از طریق کلاس ها تعریف میشند و کلاس ها شامل یک سری متغیر ها و تابع هستند که کار با کلاس که همون شی ما رو میسازه رو انجام میدن.
      یه عبارت دیگه هست به اسم کپسوله کردن برنامه. معنیش این هست که برنامه با شی به صورت یک کپسول برخورد کنه و ندونه چی داخل اون هست.تابع های جز و یا متغیر هایی که برای پارامتر های داخلی شی استفاده میشند نیاز نیست که از بیرون قابل دسترس باشند. این کار لایه لایه بودن برنامه رو ساده میکنه و هم از ایجاد تغییرات ناخواسته در مقادیر جلوگیری میکنه. این کار با محدود کردن سطح دسترسی صورت میگیره......
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : آموزش C++ (در میکرو..)

        منم در حد سواد و وقتم میتونم بهتون کمک البته ناقابلی بکنم.باعث میشه خودمم یادم بیاد آقای بهاری.ممنون از تاپیک بسیار عالیتون.
        جانم به فدای ائمه اطهار
        می دونستم تحمل مرگ اعضای خانواده خیلی سخته ولی نه تا این حد،ایکاش پدرم بیشتر می موند.روحش شاد.

        دیدگاه


          #5
          پاسخ : آموزش C++ (در میکرو..)

          نوشته اصلی توسط شهریار رجب زاده
          سوادمون به اونجا ها نمیرسید :redface:
          در ضمن من به شدت به این struct و typedef و enum و ... نیاز دارم
          کسی درست بهم توضیح نداده تا حالا اگه میشه ادامه بدید
          باتشکر
          enum عملگر شمارشی هست. شما برای یه کاری یه محدوده دارید مثلا روز های هفته.این ها رو از طریق enum تعریف میکنید.

          typedef enum
          {
          sunday=0,
          monday,
          tuseday,
          wednesday,
          thursday,
          friday,
          saturday
          }DAY;


          تو برنامه خودش به هر کدوم از این ها یک عدد رو مقدار میده. ما چون از اسم این ها استفاده میکنیم نیازی نیست بدونیم چه عددی متناظر با این هاست.من یکشنبه رو برایر 0 گذاشتم این به این معنی هست که حتما میخوام به یکشنبه صفر رو بده اما بقیه مهم نیستند.این که چرا 0 رو همیشه مقدار میدند برمیگرده با منطق بول. توی IF خیلی راحت میشه بررسی کرد.مثلا میخوایم اگر یکشنبه بود یک کاری انجام بشه ولی روزای دیگه نه! به جای اینکه تو if بگی اگه برابر این بود یا.... از مقدار عددی استفاده میکنی. حالا این متغییر DAY میتونه آرگومان ورودی تابع باشه و یا حتی مقدار بازگشتی تابع. تابعی داریم که مقدار برگشتی اون باید یکی از روزهای هفته باشه. اگر از متغییر های معمولی استفاده میکردیم ممکن مقدار نامعتبری بگیره که اصلا همچین روزی رو نداریم. تو enum میشه گفت اعضا با یه عدد define میشن و جدا از این مقدار ها نمیتونه این متغییر بگیره.
          کتابخونه ff که elm-chan نوشته رو که میشناسید؟! تمام توابع از جنس یه متغیر هستند که اونو با enum تعریف کرده.برای همین مینویسیم if(res==FR_OK) ......
          خیلی مثال های دیگه میشه زد که فکر کنم توضیح واضحات میشه.
          struct رو هم که اول کار گفتم.typedef هم برای این هست که شما بتونید از اون به عنوان نوع متغییری استفاده کنید.تنها این کلید کاربرد نداره.
          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

          دیدگاه


            #6
            پاسخ : آموزش C++ (در میکرو..)

            سطح دسترسی به کلاس ها با 3تا کلمه کلیدی زیر تعیین میشه:
            public: به معنی این هست که دسترسی به این عضو(که میتونه تابع و یا متغییر باشه) هم در داخل خود کلاس وهم در خارج از خود کلاس امکان پذیره.
            private: به این معنی هست که این عضو فقط در داخل خود کلاس قابل دسترس هست و امکان استفاده از اون در خارج از کلاس نیست.
            protect: در حالت عادی شبیه به public هست.کاربرد اون در بحث ارث بری هست که به موقش بررسی میشه.
            حالا بیاید با هم یه کلاس تعریف کنیم.برای تعریف کلاس باید از کلمه class استفاده کنیم.

            class test
            {
            public:
            test();
            ~test();
            void public_function();
            int public_int;
            private:
            void private_function();
            int private_int;
            };

            حالا بیاید تحلیل کنیم چی نوشتیم. یه کلاس به نام تست ساختیم که شامل چند تا عضو public و چند تا private هست.
            یه تابع به اسم خود کلاس(تست) میبینید که نوع اون رو ذکر نکردیم.این تابع اسمش تابع سازنده ی کلاس هست.یادتون باشه تابع سازنده یه مورد اختیاری هست و میتونید ننویسید.کار این تابع به این شکل هست که در لحظه ی تعریف کلاس فراخوانی میشه و میشه توسط اون یه سری متغییر ها رو مقدار اولیه داد ویا کلا هر کاری رو انجام داد.یادتون باشه این تابع فقط موقع تعریف کلاس خود به خود فراخونی میشه و دیگه نمیشه اون رو صدا کرد.
            تابعی که بعد از سازنده میبینید تابع مخرب نام داره.به اسم خود کلاس هست اما با یه علامت~ . این تابع هم مثل سازنده نمیشه که در حالت استفاده بشه و فقط موقع پاک شدن کلاس( استفاده از delete و یا تمام شدن یک زیر برنامه (متغییر محلی)) به طور خودکار صدا میشه.برای ذخیره مقادیر و یا آزاد کردن حافظه ای که اشغال شده استفاده میشه. این تابع هم اختیاری هست و دوست دارید میتونید ننویسید.
            بعد از تابع سازنده و مخرب یه تابع و متغییر public میبینید که از خارج هم قابل دسترسی هستند و بعد یک متغییر و تابع private که فقط در داخل خود کلاس قابل استفاده هستند(فقط تو تابع هایی که خودمون تو این کلاس داریم مینویسیم+سازنده و مخرب)
            تا این جا تعریف یه کلاس رو انجام دادیم. تو پست های بعد راجع به نحوه نوشتن تابع های کلاس و استفاده از کلاس و.... بیشتر حرف میزنیم تا مطلب تثبیت بشه.
            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

            دیدگاه


              #7
              پاسخ : آموزش C++ (در میکرو..)

              میشه اول بگید کلاس یعنی چی
              و به چه درد میخوره؟

              دیدگاه


                #8
                پاسخ : آموزش C++ (در میکرو..)

                خوب ما یه شی تعریف کردیم به اسم تست. تو این شی که ما تعریف کردیم 2 تا تابع بود. سوالی که حتما براتون پیش اومده این هست که چطور بدنه ی این توابع رو تعریف کنیم؟ یه روش این هست که توی کلاس که تابع رو تعریف کردیم در جلوی تعریفش و به جای ; کروشه باز کنیم و تعریف کنیم بدنه تابع رو. اما این کار باعث قاطی شدن کد ها میشه و فهم برنامه رو خیلی سخت میکنه. بهتر هست بعد از تعریف خود کلاس به سراغ تعریف تابع های داخل اون بریم. با استفاده از اسم کلاس و عملگر :: میتونیم بدنه تابع کلاس رو تعریف کنیم.فرقی نداره تابع public هست و یا private و یا سازنده.... همه رو با این قاعده میتونیم تعریف کنیم.مثلا من بدنه ی تابع های تست رو بعد از تعریف کلاس به این شکل تعریف میکنم:

                test::test()
                {
                //some thing....
                }

                void test::public_function()
                {
                //some things.....
                }

                void private_function()
                {
                //some things....
                }

                با این شیوه کامپایلر متوجه میشه که هر تابع مال کدوم کلاس هست. تا اینجا تعریف خود کلاس رو یاد گرفتیم. بعد از این میریم سراغ این که چطور از کلاس ها در برنامه استفاده کنیم و با مفهوم شی گرایی بیشتر آشناشیم....
                [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                دیدگاه


                  #9
                  پاسخ : آموزش C++ (در میکرو..)

                  نوشته اصلی توسط شهریار رجب زاده
                  میشه اول بگید کلاس یعنی چی
                  و به چه درد میخوره؟
                  خوب شما تعریف شی که بالا کردیم رو متوجه شدید؟ تو برنامه نویسی دیگه به جای اینکه با تک تک متغییر ها و توابع کار کنیم با این اشیا کار میکنیم. این کار جدا از نظم دادن به برنامه و جلوگیری سردر گمی هایی که این متغییر مال این کار بود یا کار دیگه , باعث میشه اشتباه به متغییر ها مقدار داده نشه و یا تابع ها در جای اشتباه به کار نره.
                  یه شی به اسم شخص داریم و یک شی به اسم خونه. توابع رو اگه به صورت عادی (پشت هم و خارج از بدنه ی اشیا) ممکنه شما به اشتباه تابع جنسیت رو برای خونه استفاده کنید.طبیعی هست که جنسیت برای شخص هست و برای خونه بی معنی ولی شما این تابع رو به اشتباه به کار ببرید و کل برنامه به اشکال بر بخوره.
                  با استفاده از شی گرایی چون هر چیز برای همون شی استفاده میشه این اشکالات به وجود نمیاد. خیلی حسن های دیگه داره که دیگه از حوصله این جا خارج هست گفتنش اما بدونید شی گرایی رو یاد بگیرید کم کم متوجه میشید چقدر کار رو راحت میکنه.
                  حالا ما این شی رو توسط کلاس ها تعریف میکنیم. یعنی تعریف یه کلاس همون تعریف یک شی هست.....
                  [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                  دیدگاه


                    #10
                    پاسخ : آموزش C++ (در میکرو..)

                    خوب بعضی از دوستان پیام دادند که هنوز خوب متوجه کلاس نشدند. برای اینکه بحث مفید باشه یکم بیشتر در مورد کلاس توضیح میدم .
                    زمانی که میخواهیم یک مجموعه از اعداد را ذخیره کنیم از آرایه ها استفاده می کنیم ولی زمانی که بخواهیم اطلاعات مجموعه ای از خانواده ها را نگهداری کنیم و از آن در برنامه ها استفاده کنیم چطور ؟
                    جواب این سوال کلاس ها هستند که ما می توانیم با استفاده از کلاسها مجموعه ای که با هم در ارتباطند را نمایش دهیم و از آنها استفاده کنیم.
                    به طور مثال یک خانواده ممکنه تک نفره ، دو نفره ،....، باشد و هر کدام شغل , اسم ,سن و.... داشته باشند اگر بخواهیم برای هر بخش یک آرایه در نظر بگیریم هم خوانایی برنامه کاهش پیدا میکند و هم ممکن است اصلا به یکی از موارد ذکر شده احتیاج نداشته باشند و برای خود طراح برنامه نیز ممکن است گیج کننده باشد. کار کلاس نظم دادن به این متغییر هایی هست که به یک شی به خصوص مربوط هست.
                    هر شی(چه حقیقی و چه مجازی) یک سری پارامتر داره که اون شی رو توصیف میکنند. توسط کلاس ها ما این پارامتر های توصیف شی رو توصیف میکنیم. چون این کلاس همه ی اون پارامتر ها رو داخل خودش نگه میداره پس کلاسی که تعریف میشه متناظر هست با اون شی ما.
                    این پارامترهایی که داخل کلاس قرار دادیم نیاز به پردازش و مدیریت دارند پس ما یه سری توابع به کلاس ها اضافه میکنیم که کار این توابع فقط مدیریت این پارامتر های داخل این کلاس هستند. این توابع ضمانت میکنند که مقدار دهی به این پارامتر ها درست انجام بگیره. مثلا برای سن ما نمیتونیم عدد -20 رو قبول کنیم.پس این توابع باید موارد این چنینی رو هم کنترل کنند.
                    یه برنامه میخوام بنویسم که درک این چیزایی که گفتم رو ساده تر کنه.لطفا الان پست های قبلی که در مورد نحوه ی تعریف کلاس ها بود رو بخونید تا متوجه برنامه بشید. تو این برنامه به وسیله یه کلاس من یک شی به اسم person میسازم و با این شی در برنامه عملیاتی رو انجام میدم.:

                    class Person
                    {
                    public:
                    void set_age(unsigned char a); //set the age of person
                    unsigned char get_age(); //return the age of person
                    void set_id(unsigned char i); //set the id of person
                    unsigned char get_id(); //return the age of person
                    private:
                    unsigned char id;
                    unsigned char age;
                    {;
                    /////////////////////////////////////////////////////////////////////////
                    void Person::set_age(unsigned char a);
                    {
                    age=a;
                    }

                    unsigned char Person::get_age();
                    {
                    return age;
                    }

                    void Person::set_age(unsigned char i);
                    {
                    id=i;
                    }

                    unsigned char Person::set_age();
                    {
                    return id;
                    }
                    ///////////////////////////////////////////////////////////
                    void main()
                    {
                    Person A,B,C; // we declare 3 person
                    A.set_id(10);
                    B.set_id(11);
                    C.set_id(12);
                    A.set_age(20);
                    if(B.get_id()==13)
                    //do some things
                    {

                    تو این برنامه ما یک شی به نام person رو تعریف کردیم. تو تابع مین 3تا از این شی تعریف کردیم و عملیاتی رو انجام دادیم.در اینجا هدف نشون دادن نحوه ی کاربرد شی هست.نگید این برنامه رو ساده تر هم میشد نوشت. اشیا به این سادگی نیستند همیشه. استفاده از اشیا نوشتن کد رو ساده تر میکنه. نه از نظر حجم. از نظر اینکه بشه درک کرد کد رو. با استفاده از اشیا خیلی راحت چندین نفر میتونند رو یک برنامه کار کنند و نیاز نیست همه با کل برنامه درگیر بشند.
                    حالا بازم اگه سوالی یا موردی هست بپرسید. اگر همه متوجه شدن این قضیه رو بریم سراغ مطلب بعد. چند روز صبر میکنم تا اگه سوالی هست بگید.
                    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                    دیدگاه


                      #11
                      پاسخ : آموزش C++ (در میکرو..)

                      سلام
                      خوندن آموزشهای شما اصلآ خسته کننده نیست و من که به زبان سی علاقمند شدم
                      واقعآ خسته نباشید .لطفآ ادامه بدین :applause:
                      این مدعیان در طلبش بی خبرانند
                      آن را که خبر شد خبری باز نیامد

                      دیدگاه


                        #12
                        پاسخ : آموزش C++ (در میکرو..)

                        سلام خوب بود بالاخره متوجه شدم!
                        ولی یه چیزی این سطح دسترسی ها رو چطور میشه ازش استفاده کرد؟
                        مگه تو کد بالایی متغیر ها سطح private نداشت؟پس چطور تو if ازش استفاده کردید؟
                        نوشته اصلی توسط shahinbahari
                        سطح دسترسی به کلاس ها با 3تا کلمه کلیدی زیر تعیین میشه:
                        public: به معنی این هست که دسترسی به این عضو(که میتونه تابع و یا متغییر باشه) هم در داخل خود کلاس وهم در خارج از خود کلاس امکان پذیره.
                        private: به این معنی هست که این عضو فقط در داخل خود کلاس قابل دسترس هست و امکان استفاده از اون در خارج از کلاس نیست.
                        protect: در حالت عادی شبیه به public هست.کاربرد اون در بحث ارث بری هست که به موقش بررسی میشه.
                        در مورد سازنده و مخرب هم بیشتر توضیح بدید
                        ممنون

                        دیدگاه


                          #13
                          پاسخ : آموزش C++ (در میکرو..)

                          ولی یه چیزی این سطح دسترسی ها رو چطور میشه ازش استفاده کرد؟
                          مگه تو کد بالایی متغیر ها سطح private نداشت؟پس چطور تو if ازش استفاده کردید؟
                          صداش رو در نیار که حواسم نبود.دقیقا مفهوم سطح دسترسی همین مساله هست. در داخل if بالا من نمیتونم به متغییر ها و یا توابعی که تو قسمت private نوشته شدن دسترسی داشته باشم برای همین برای خوندن از روی اونها و یا نوشتن روی اونها توابع public رو نوشتم. کد بالا رو اصلاح کردم. مرسی از یاد آوریتون.
                          در مورد سازنده و مخرب هم بیشتر توضیح بدید
                          توی اون خطی که من A,B,C رو تعریف کردم ,اگر تابع سازنده رو مینوشتم در این جا اجرا میشد.
                          مثلا داخل تابع سازنده میشد یه مقدار خاصی رو به age ویا id بدم.
                          تابع مخرب دقیقا برعکس تابع سازنده لحظه ای که متغییر داره پاک میشه فراخوانی میشه.حالا کجا متغییر از بین میره؟ مثلا توی یه تابع این متغییر به صورت محلی تعریف شده.وقتی تابع تموم میشه و برنامه میخواد به تابع مین برگرده همه ی متغییر های محلی از بین میرن.
                          هردو این ها موارد اختیاری هستند.اگه لازم باشه استفاده بشه بیشتر از سازنده استفاده میشه تا مخرب.
                          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                          دیدگاه


                            #14
                            پاسخ : آموزش C++ (در میکرو..)

                            نوشته اصلی توسط shahinbahari
                            توی اون خطی که من A,B,C رو تعریف کردم ,اگر تابع سازنده رو مینوشتم در این جا اجرا میشد.
                            مثلا داخل تابع سازنده میشد یه مقدار خاصی رو به age ویا id بدم.
                            تابع مخرب دقیقا برعکس تابع سازنده لحظه ای که متغییر داره پاک میشه فراخوانی میشه.حالا کجا متغییر از بین میره؟ مثلا توی یه تابع این متغییر به صورت محلی تعریف شده.وقتی تابع تموم میشه و برنامه میخواد به تابع مین برگرده همه ی متغییر های محلی از بین میرن.
                            هردو این ها موارد اختیاری هستند.اگه لازم باشه استفاده بشه بیشتر از سازنده استفاده میشه تا مخرب.
                            ببخشید درست متوجه نشدم این تابع سازنده چیو میسازه؟کجا استفاده میشه؟
                            دقیقا همون سوالا برای مخرب
                            یه نمونه کد هم براش استفاده کنید با تشکر
                            راستی برای قسمت بعد میشه عملگر های بیتی و عملگر هایی از این دست به صورت کامل+طرز نوشتن انواع شرط های با چک کردن بیت های مختلف و ... رو آموزش بدید؟

                            دیدگاه


                              #15
                              پاسخ : آموزش C++ (در میکرو..)

                              ببخشید درست متوجه نشدم این تابع سازنده چیو میسازه؟کجا استفاده میشه؟
                              اسم این تابع سازنده هست چون موقع ساخته شدن متغییر فقط فراخونی میشه. استفاده از اون هم جایی هست که لازم باشه مقدار اولیه بدید.

                              Person::Person()
                              {
                              id=0;
                              age=18;
                              }

                              اگه این تابع رو به برنامه قبلی اضافه کنید موقع ساخت این مقدار دهی های اولیه صورت میگیره...
                              راستی برای قسمت بعد میشه عملگر های بیتی و عملگر هایی از این دست به صورت کامل+طرز نوشتن انواع شرط های با چک کردن بیت های مختلف و ... رو آموزش بدید؟
                              پیشنهاد خیلی خوبی هست ولی این موارد تو قالب سی++ جا نداره و بحث رو منحرف میکنه. بزودی یه تاپیک برای بررسی این موارد که گفتید ایجاد میکنم و داخل اون در مورد عملگر های بیتی حرف میزنیم.....
                              [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                              دیدگاه

                              لطفا صبر کنید...
                              X