اطلاعیه

Collapse
No announcement yet.

مشکل با C++

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

    مشکل با C++

    تو برنامه CodeBlocks وقتی می نویسم void main () برنامه error می ده :
    E:\Elec\CodeBlocks Project\000\0.2\main.c|3|error: `main' must return `int'|
    لطفا بهم بگید مشکل از کجاست؟

    #2
    پاسخ : مشکل با C++

    بنویس int main
    استاندارد جدید (البته دیگه قدیمی شده) میگه تابع main حتما باید int باشه و یه مقداری رو برگردونه (return 0 هم میخواد)
    https://www.linkedin.com/in/mohammadhosseini69

    http://zakhar.blog.ir

    دیدگاه


      #3
      پاسخ : مشکل با C++

      جسارتا این استاندارد جدید یا قدیم ممکنه یک مورد منطقی پشتش باشه. main اجرا کننده اصلی برنامه است و یک برنامه پس از اختتام کدی رو به سیستم عامل تحویل میده که میشه از نحوه اجرای برنامه توسط این کد اطلاع پیدا کرد.
      در حالتی که برنامه جای دیگه ای غیر از main تموم بشه مثلا استفاده از exit یا abort این کد مشخصه. فکر میکنم abort برنامه رو با کد 3 تموم میکنه. حالا وقتی برای main مقدار برگشتی قرار داده نمیشه مسلما ما در انتهای تابع main مقداری برنمیگردونیم. اما این به این معنی نیست که مقداری برنگرده. چون در روال startup مقدار برگشتی تابع main مهم تلقی شده و باهاش کار میشه. و در این حالت معلوم نیست که main چه مقداری برگردونده.

      بذارین اینجوری بگم:

      فرض کنین روال startup اینجوری باشه:


      ....
      exit( main(argc, argv, envp) );
      ....


      اگر ما این تابع رو به این صورت تعریف و استفاده کنیم:


      void main(void)
      {
      }


      برنامه کامپایل و اجرا میشه اما تابع exit با چه مقداری برنامه رو تموم میکنه؟ در یک ساختار x86 محتوای رجیستر ax و در avr محتوای جفت رجیستر r25:r24. این رجیستر(ها) که نمیتونن مقداری نداشته باشن. ولی معلوم نیست چی توشونه. و ما داریم با یک زبان با قابلیت انعطاف بالاو قدرتمند کار میکنیم. پس باید کامپایلر بهمون گیر بده که int بذار تا مجبور شی مقدار برگشتی رو دانسته بهم برگردونی.

      امیدوارم دقیقا متوجه شده باشین منظورم چیه.

      دیدگاه


        #4
        پاسخ : مشکل با C++

        میشه یکم ساده تر توضیح بدین؟ :-/
        کار بسیار ظریفی است که انسانی را ببخشیم، بی آنکه ارزشش را در نظر خود او و خودمان پایین بیاوریم

        دیدگاه


          #5
          پاسخ : مشکل با C++

          وقتی شما یک تابعی مثل getchar رو صدا میکنین باید بدونین که این تابع یک مقدار عددی برمیگردونه که کد کاراکتر خونده شده هست و اگر کوچکتر از صفر باشه یعنی نتونسته چیزی رو بخونه. بنا بر این کد زیر با اینکه ممکنه از لحاظ منطقی درست بنظر بیاد اما غلطه:


          char c = (char)getchar();


          چرا؟ چون اغلب قریب به اتفاق مواقع ایرادی در خوندن اطلاعات پیش نمیاد و متغیر c حاوی کاراکتر خونده شده هست. اما اگر به هر دلیلی این تابع نتونه چیزی بخونه مقدار (منفی یک) رو برمیگردونه که با کدی که نوشتیم براحتی با کاراکتر 255 اشتباه میشه. چرا؟ چون char عموما به صورت علامتدار اگر به یک int تبدیل بشه مقدار (منفی یک) رو داره. میگین نه این کد رو اجرا کنین:


          signed char c = (signed char)0xff;
          printf("%d\n", (int)c);



          منظورم اینه که ما اینجا فرضی رو استفاده کردیم که خیلی از مواقع درسته و نه تمام مواقع!

          حالا مورد ما.
          یک برنامه از main شروع به اجرا میشه و یک جایی یا با تموم شدن تابع main یا توسط صدا زده شدن یکی از توابع exit یا abort برنامه تموم میشه. اگه به سورس توابع ذکر شده نگاه کنین یه چیزی مشابه زیر میبینین:


          void exit(int exit_code)
          {
          _exit(exit_code);
          }


          void abort(void)
          {
          _exit(3);
          }


          همونطور که میبینین این دو تابع مقداری رو به عنوان نتیجه اجرای برنامه به سیستم عامل برمیگردونن. حالا اگه ما برنامه رو با تموم شدن کد تابع main تموم کنیم چه اتفاقی میفته؟ در هر صورت سیستم عامل به یک کد برگشتی احتیاج داره. abort همواره کد 3 رو برمیگردونه. exit کدی رو که ما بهش گفتیم. ولی main چی؟ اگر کدی برنگردونیم روتین startup که وظیفه صدا کردن تابع main رو بر عهده داره یک کدی که معلوم نیست چیه رو به سیستم عامل برمیگردونه. و این برای برنامه ای که برنامه ما رو اجرا میکنه ممکنه یک سردرگمی ایجاد کنه. بعضی وقتها برنامه ما کدی برمیگردونه که ما میدونیم چنده و بقیه مواقع نمیدونیم. این چیزیه که ما بهش میگیم شانس و ما در کار با کامپیوتر به این مورد نه تنها احتیاجی نداریم بلکه عنوان کردنش نشون از ماست مالی کردن و بی برنامگی ما هست.

          مطمئنا پیش خودتون میگین "برو بابا حال داری" ولی اگر در هر برنامه سه چهار تا از این موردها ایجاد کنین واقعا برنامه نویس خوبی نمیشین چون برنامه تون صد در صد قابل اعتماد و پیش بینی نیست. اینو یادتون باشه: خیلی ها برنامه مینویسن. اما تعداد برنامه نویس های خوب واقعا کمه.

          دیدگاه


            #6
            پاسخ : مشکل با C++

            سلام
            با توجه به دستور زیر هر جا x داشته باشیم چه بلایی سرش میاد ؟


            #define hi(x) (*((int8 *)&x+1))

            ممنون
            زمان تنها واحد حقیقی اندازه گیریه
            زمان وجود ماده رو اثبات میکنه
            بدون زمان هیچکدوم ما وجود نخواهیم داشت
            زمان یکتاست

            دیدگاه


              #7
              پاسخ : مشکل با C++

              هیچی! چون اینجا x آرگومان ماکرو است. ربطی به بقیه برنامه ندارد. اصلا بیرون از توصیف این ماکرو xی وجود ندارد.
              اما اگر قرار باشه زمانی که این ماکرو استفاده میشه عملش تفسیر بشه؛ این ماکرو بایت دوم یک متغیر رو برمیگردونه که در ماشینهای با ساختار عددی BigEndian مثل پروسسورهای اینتل مقدار بایت پر ارزش عدد رو برمیگردونه. ولی در ماشینهایی با ساختار LittleEndian مثل مک اینتاش مقدار بایت کم ارزش رو برمیگردونه.

              ضمنا بهتره ماکرو به صورت زیر نوشته بشه:


              #define hi(x) (*(((int8 *)&(x))+1))


              مثلا اگر متغیری از نوع short داشته باشیم با مقدار 0x1234 این ماکرو روی اینتل مقدار 0x12 و در مک اینتاش مقدار 0x34 رو برمیگردونه.

              دیدگاه


                #8
                پاسخ : مشکل با C++

                نوشته اصلی توسط reza_agha
                مثلا اگر متغیری از نوع short داشته باشیم با مقدار 0x1234 این ماکرو روی اینتل مقدار 0x12 و در مک اینتاش مقدار 0x34 رو برمیگردونه.
                حالا اگه این ماکرو روی یه عدد 16 بیتی اعمال بشه یعنی 8 بیت دوم رو بر می گردونه ؟
                مثلا اگه data=oxCF باشه( lsb=hi(data به من مقداره رو میده 1111دیگه ؟
                با توجه به اینکه oxcfبرابر11001111هست !

                من اینو توی کتابخونه ی CCS دیدم
                http://www.4shared.com/file/AtusY6lN/9366.html

                زمان تنها واحد حقیقی اندازه گیریه
                زمان وجود ماده رو اثبات میکنه
                بدون زمان هیچکدوم ما وجود نخواهیم داشت
                زمان یکتاست

                دیدگاه


                  #9
                  پاسخ : مشکل با C++

                  نوشته اصلی توسط reza_agha
                  این ماکرو بایت دوم یک متغیر رو برمیگردونه
                  میشه لطفا تحلیلش کنید چه جوری این کارو انجام میده ؟

                  نوشته اصلی توسط reza_agha
                  که در ماشینهای با ساختار عددی BigEndian مثل پروسسورهای اینتل مقدار بایت پر ارزش عدد رو برمیگردونه. ولی در ماشینهایی با ساختار LittleEndian مثل مک اینتاش مقدار بایت کم ارزش رو برمیگردونه.
                  میکرو کنترلر ها ی AVR و PIC چه ساختاری دارند ؟
                  ممنون
                  زمان تنها واحد حقیقی اندازه گیریه
                  زمان وجود ماده رو اثبات میکنه
                  بدون زمان هیچکدوم ما وجود نخواهیم داشت
                  زمان یکتاست

                  دیدگاه


                    #10
                    پاسخ : مشکل با C++

                    مقدار عددی 0xCF در حقیقت به فرم 16 بیتی 0x00CF نگهداری میشه. در سیستمهایی مثل Intel و AVR و بعضی نسخ ARM عددی مثل این به صورت دوبایت پشت سر هم شامل 0xCF و 0x00 ذخیره میشن که چون این ماکرو بایت دوم عدد رو برمیگردونه پس مقدار 0x00 برمیگرده. این مقدار چون در 8051 و 68000 عکس این نوع ذخیره میشه پس ترتیب بایتها به صورت 0x00 و 0xCF هست. بنا براین بایت دوم عدد در این سیستمها برابر با 0xCF میشه.

                    این ماکرو برای دسترسی به بایت دوم یک حافظه بکار میره که بهتره حالت کلی استفاده بشه که کامپایلر بتونه اپتیممش کنه به صورت زیر:


                    #define hi(n) ((unsigned char)(((unsigned short)(n))>>8))


                    که این ماکرو در هر محیطی مقدار 0x00 رو برمیگردونه. ضمنا میتونه با عدد ثابت هم کار کنه.

                    - من ساختار pic رو نمیشناسم.
                    - ماکرویی گه شما قید کردین به کامپایلر میگه:

                    *** فرض کن که x یک متغیری از نوع آرایه بایتی هست. حالا بایت دومش رو در نظر بگیر.

                    این ماکرو بر خلاف اونی که من پیشنهاد دادم میتونه برای تغییر مقدار بایت بالایی یک متغیر هم استفاده بشه:


                    short n = 0x1234;

                    hi(n) = 5; // n = 0x0534


                    که البته معادل قابل فهم ترش میشه:


                    short n = 0x1234;

                    unsigned char *p = (unsigned char *)&n;
                    p[1] = 5;

                    دیدگاه

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