اطلاعیه

Collapse
No announcement yet.

یه فاجعه بزرگ تو AVR STADIO 5

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

    یه فاجعه بزرگ تو AVR STADIO 5

    سلام :angry:
    چرا وقتی من یه متغیر از نوع long int تعریف میکنم و مثلا یه عمل ریاضی به این صورت (10000*8)انجام میدم اخطار overflow روی عدد 10000 میده در حقیقت نمیتونید این عددو از 4095 بیشتر کنید خیلی ور رفتم نشد وقتی میخوام رو ال سی دی نمایش بدم یه چیزایی تو مایع های حروف ژاپونی نشون میده جالب اینجاست که اینو (1000000*8) قبول میکنه و رو السیدی عدد 8000000 رو نشون میده انواع متغیر ها رو تست کردم نشد :angry: :angry: :angry:
    چیکار کنم :angry:

    #2
    پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

    برنامتون رو هم بزارید اینجا ! ببینیم عمق فاجعه چقدره :d

    دیدگاه


      #3
      پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

      این قسمتی از برنامه ام هست کارشم اینه که یه عدد مثل 78463809 رو میگیره و تک رقم تک رقم از توشون در میاره و داخل []WD میریزه
      code:
      char WD[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
      unsigned long int i,j;
      j = 7864281009;
      WD[0] = j/1000000000;
      i = WD[0]*1000000000;
      j = lcd - i;
      WD[1] = j/100000000;
      i = WD[1]*100000000;
      j = j - i;
      WD[2] = j/10000000;
      i = WD[2]*10000000;
      j = j - i;
      WD[3] = j/1000000;
      i = WD[3]*1000000;
      j = j - i;
      WD[4] = j/100000;
      i = WD[4]*100000;
      j = j - i;
      WD[5] = j/10000;
      /*here*/ i = WD[5]*10000;
      j = j - i;
      WD[6] = j/1000;
      i = WD[6]*1000;
      j = j - i;
      WD[7] = j/100;
      i = WD[7]*100;
      j = j - i;
      WD[8] = j/10;
      i = WD[8]*10;
      j = j - i;
      WD[9] = j;

      همه جاش درست کار میکنه فقط اون قسمتی که [5]WD ضرب 10000 میشه مشکل داره :angry:

      دیدگاه


        #4
        پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

        ببخشید تو AVR STADIO یه نیو باز کنید و اینو توش بنویسید
        #include <avr/io.h>
        long a;
        int main(void)
        {
        a = 10000*8;
        }
        بعد برید سراغ error list رو باز کنید اخطار داده شده دلیلش چیه؟(اگه این عددو تو السیدی ببینید برابر 14464 است)یعنی اشتباه ضرب میکنه
        حالا به عدد 10000 یک صفر اضافه کنید (100000) حالا برنامه رو کامپایل کنید ملاحضه میکنید که اخطاری داده نشده (با اینکه 100000>10000) و حاصل ضرب هم درسته بنظر شما دلیلش چیه
        اگه این یه باگ باشه که واقعا افتضاهه حتی تو قدیمی ترین نسخه کدویژن و یا حتی بسکام هم همچین چیز مزخرفی وجود نداشت :angry: :angry: :angry:

        دیدگاه


          #5
          پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

          با سلام

          int در میکرو های 8 بیتی معمولا به صورت :
          -32768....تا +32767
          اگر هم بدون علامت منظور شود : 0....65535
          یعنی 16 بیت در نظر گرفته می شود.

          حالا عدد شما : 10000 * 8 = 80000
          80000 = 65536 + 14464 !!!!!

          موقتا باید عبارت را به اینصورت بنویسید ،

          #include <avr/io.h>
          long a;
          int main(void)
          {
          a = (long int)10000*8;
          }

          یا در تنظیماتی که نوع int را 16 بیتی یا 32 بیتی منظور می کند ( اگر چنین تنظیماتی وجود داشته باشد.) تغییر دهید.

          تبدیل نوع ، که صورت گرفته باید به سمت بیتهای بالاتر باشد که ظاهرا اینگونه نبوده است.

          با سپاس

          پ.ن:
          اعداد بزرگتر از 65536 اتوماتیک وار به صورت 32 بیتی یا long int در نظر گرفته می شوند.
          گشتی در لاله زار
          http://www.eca.ir/forum2/index.php?topic=76138.0

          http://www.eca.ir/forum2/index.php?topic=76141

          دیدگاه


            #6
            پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

            درسته ولی چرا حاصل عبارت a = 8*100000 درست بدست می آید (چرا نیازی به a=(long int)8*100000 ندارد)?

            دیدگاه


              #7
              پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

              متشکرم از جناب آقای Solsal و همچنین (آقا فرشاد) :wow:
              ممنونم مشکلم حل شد :wow:
              اینطوریاهم نیست که Atmel نرم افزار بروز شدشو همراه با باگ بده بیرون اون فکر همه جاشو کرده
              تا حالا که من از این کامپایلر راضی بودم بهتر از تمام کامپایلر هاست
              قابل توجه دوستداران AVR STADIO بخاطر عنوان تاپیک عذر خواهی میکنم مشکل اصلا از کامپایلر نیست مشکل یک فاجعه بزرگ در سواد منه :icon_razz: oo: :bye

              دیدگاه


                #8
                پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

                ولی در کل ، این چیزی هم که شما گفتید به Avrstudio فکر نکنم ربطی داشته باشه ! به ساختار avr-gcc ربط داره .
                شما دارید از پوسته avrstudio جهت کارکردن با winavr استفاده می کنید.

                دیدگاه


                  #9
                  پاسخ : یه فاجعه بزرگ تو AVR STADIO 5

                  چون عدد 100000 یک عدد از نوع long فرض شده و کل عملیات بر اساس بزرگترین نوع درگیر حساب میشه یعنی عبارت 8 * 100000 به صورت ضرب دو عدد long محاسبه میشه که حاصل هم long هست. ولی 8 * 10000 به صورت ضرب دو عدد 16 بیتی حساب میشه ولی حاصل از رنج 32767 خارج میشه. اینجا قاعدتا کامپایلر باید warning بده و نه error مگه اینکه در پشن های کامپایلر warning رو معادل error در نظر گرفته باشین.

                  دیدگاه

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