اطلاعیه

Collapse
No announcement yet.

سوال درباره یک warning در کدویزن

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

    سوال درباره یک warning در کدویزن

    با سلام
    مشکلی دارم که ممنون میشم اگه کسی بتونه کمکم کنه:
    در نرم افزار کدویژن یک متغیر long int a داریم. می خواهیم a رو به چپ شیفت بدیم. حال اگه a رو به اندازه یک عدد مثلا 20 شیفت بدیم مشکلی نداره، اما اگه عدد 20 رو بریزیم توی متغیر ثانوی b و عملیات شیفت رو انجام بدیم warning می ده و عملیات شیفت رو حداکثرتا 16 انجام می ده.
    نمونه برنامه:
    long int a ;
    char b ;
    warning: overflow is possible in 16 bit shift left <<== a |= 0x01 << b
    NO warning <<== a |= 0x01 << 20
    درحقیقت می خواهم warning که نوشتم برطرف بشه.
    با نیکی، آزادها بنده می شوند.(امام علی (ع))

    #2
    پاسخ : سوال درباره یک warning در کدویزن

    سلام
    فکر کنم دقیقا چند ماه پیش بود که یکی از کاربرهای کدویژن این مشکل رو داشت. بعد گفت دلیلش رو فهمیده. می گفت چون برنامه رو کرک کرده این موضوع پیش اومده. آخرش هم فکر کنم به GCC مهاجرت کرد.

    دیدگاه


      #3
      پاسخ : سوال درباره یک warning در کدویزن

      نوشته اصلی توسط mahdi3924
      با سلام
      مشکلی دارم که ممنون میشم اگه کسی بتونه کمکم کنه:
      در نرم افزار کدویژن یک متغیر long int a داریم. می خواهیم a رو به چپ شیفت بدیم. حال اگه a رو به اندازه یک عدد مثلا 20 شیفت بدیم مشکلی نداره، اما اگه عدد 20 رو بریزیم توی متغیر ثانوی b و عملیات شیفت رو انجام بدیم warning می ده و عملیات شیفت رو حداکثرتا 16 انجام می ده.
      نمونه برنامه:
      long int a ;
      char b ;
      warning: overflow is possible in 16 bit shift left <<== a |= 0x01 << b
      NO warning <<== a |= 0x01 << 20
      درحقیقت می خواهم warning که نوشتم برطرف بشه.
      ا ا ا ا این چه کاریه ؟؟؟؟؟!!!!!!!!!!!!!!!!!!!!!!!!!!

      شما با این دستورات a رو شیفت نمیدی که

      0x01 را داری به یک اندازه ای شیفت میدی . توجه کن اگه بیش از 7 بیت ، 0x01 رو به چپ شیفت بدی، شیفت کننده مقدار صفر را بر میگردونه . ولی دستوراتت را خیلی بد نوشتی . اگر منظورت این باشه:
      کد:
      a=a | (0x01<<20);
      که این مقدار صفر را با a به صورت بیتی or میکنه ، که میشه همون a

      ولی اگر منظورت این باشه(با توجه به وارنینگی که داده فکر کنم کامپایلر گفته منظورت اینه: بخاطر اولویت بندی عملگرها):
      کد:
      a= (a|0x01) <<20;
      که میاد متغییر 16 بیتی a را هشت بیت اولش رو با 0x01 به صورت بیتی or میکنه (که کار الکی هست که میشه همون a که بیت سمت راستی همیشه یکه) و بعد 20 بیت به سمت چپ شیفت میده که میشه صفر و کامپایلر چون به صورت صریح نوشتین 20 میگه حتما به این موضوع واقف هستید و وقتی یک متغییر میزارید میگه بپا مقدار متغییره بیش از 16 شد جواب صفر میشه و سرریز میکنه ها.

      راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
      کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
      نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
      انشالله به زودي تاپيک ها به روز رساني خواهد شد،

      دیدگاه


        #4
        پاسخ : سوال درباره یک warning در کدویزن

        نوشته اصلی توسط rozeh
        سلام
        فکر کنم دقیقا چند ماه پیش بود که یکی از کاربرهای کدویژن این مشکل رو داشت. بعد گفت دلیلش رو فهمیده. می گفت چون برنامه رو کرک کرده این موضوع پیش اومده. آخرش هم فکر کنم به GCC مهاجرت کرد.
        فکر میکنم اگر دید یک مقدار منطقی داشته باشیم ،به نظر نمیاد به دلیل کرک بودن برای یک کامپایلر چنین مشکلاتی بوجود بیاد.
        راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

        دیدگاه


          #5
          پاسخ : سوال درباره یک warning در کدویزن

          اولا تشکر از توجهتون
          دوما شما درست میگید، منظورم رو بد رسوندم، من نمی خوام a رو شیفت بدم، در حقیقت می خوام a رو با 0x01 ای که به اندازه b شیفت به چپ پیدا کرده or کنم. مشکل اینجاست که زمانی که 0x01 را به اندازه یک عدد ثابت شیفت بدم وارنینگی نداره، اما زمانی که به جای عدد ثابت یک متغیر حاوی اون عدد میزارم وارنینگ ذکر شده رو نشون می ده و در عمل از 16 بیت بیشتر شیفت به چپ نمی ده. یعنی:
          دستور زیر مشکلی نداره:
          a |= (0x01 << 20)
          اما دستور زیر وارنینگ میده:
          a |= (0x01 << b)
          که b رو قبلا برابر 20 قرار دادیم
          می خوام این وارنینگ حل بشه. فوریه. ممنون
          با نیکی، آزادها بنده می شوند.(امام علی (ع))

          دیدگاه


            #6
            پاسخ : سوال درباره یک warning در کدویزن

            یه چیزایی فهمیدم ولی چون avr رجیسترا و مدارات شیفت دهنده و عملگر های بیتیش هشت بیتیه ، از این کارتون یک حسی بدی دارم :mrgreen:

            ولی خودتون اگه میدونید میخواید چه کنید من کاره ای نیستم:

            وقتی میخواید یک مقداری رو داخل a بریزید و a هم از نوع long است باید شما قبلش سمت راست عملگر انتساب را به لانگ cast کنید به این صورت:

            کد:
            a |= ((long)0x01 << b);
            دیگه عمرا اگه وارنینگ بده :icon_razz:

            موفق باشید
            راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
            انشالله به زودي تاپيک ها به روز رساني خواهد شد،

            دیدگاه


              #7
              پاسخ : سوال درباره یک warning در کدویزن

              نه مشکلی پیش نمیاد

              کد نهایی به همراه تست:

              کد:
              long int a=0;
               char b=20; 
               DDRA=0xFF;
               DDRB=0xFF;
               DDRC=0xFF;
               a |= ((long)0x01 << b);
               PORTA=(char)a;
               a>>=8;
               PORTB=(char)a;
               a>>=8;
               PORTC=(char)a;
              راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
              کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
              نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
              انشالله به زودي تاپيک ها به روز رساني خواهد شد،

              دیدگاه


                #8
                پاسخ : پاسخ : سوال درباره یک warning در کدویزن

                نوشته اصلی توسط RubeuS
                فکر میکنم اگر دید یک مقدار منطقی داشته باشیم ،به نظر نمیاد به دلیل کرک بودن برای یک کامپایلر چنین مشکلاتی بوجود بیاد.
                به کدش نگاه نکردم.

                دیدگاه


                  #9
                  پاسخ : سوال درباره یک warning در کدویزن

                  واقعا مچکرم، کمک بزرگی بهم کردین. اطلاعات بسیار مفیدی دارین و بالاتر اینکه اونا رو نشر میدین. :applause:
                  راستش برای من هم جالب نیست که به این صورت کار کنم. ولی مجبور شدم.
                  اما سورس این دستور را در کجا و چه کتابی یا چه بخشی میشه پیدا کرد و اون long که در دستور هست به چی اعمال میشه؟
                  با نیکی، آزادها بنده می شوند.(امام علی (ع))

                  دیدگاه


                    #10
                    پاسخ : سوال درباره یک warning در کدویزن

                    نوشته اصلی توسط mahdi3924
                    واقعا مچکرم، کمک بزرگی بهم کردین. اطلاعات بسیار مفیدی دارین و بالاتر اینکه اونا رو نشر میدین. :applause:
                    راستش برای من هم جالب نیست که به این صورت کار کنم. ولی مجبور شدم.
                    اما سورس این دستور را در کجا و چه کتابی یا چه بخشی میشه پیدا کرد و اون long که در دستور هست به چی اعمال میشه؟
                    خواهش میکنم
                    سورس چه برنامه ای؟ اون کدهایی رو هم که گذاشتم، خودم همینجوری برا تست نوشتم(میخواستم ببینم کامپایلر در برخورد با چنین عملی روی یک میکرو 8بیتی چیکار میکنه که دیدم مثل اینکه حالیشه (همچینا که من فکر میکردمم کودن نیست :mrgreen :applause

                    این اطلاعات دیگه مربوط به avr و از این چیزا نمیشه، مربوط به خود زبان سی هست(توصیه من بتون خوندن کتاب دایتل دایتل هست (البته اولش که نگا بش میندازید اینجوری میشید -> :eek: ولی بعدش عادت میکنید(یک مقدار قطوره که نیاز نیست همش رو مطالعه کنید))) :read:

                    در سی شما وقتی دیتا تایپی را داخل پرانتز میزارید یعنی می خواهید مقدار عبارت بعد از اون را به تایپ داخل پرانتز cast کنید که کامپایلر با رسیدن به این دستور موقتا عبارت مورد نظر را مثلا در اینجا long فرض میکنه .

                    پس شما در اینجا اون 0x01 رو 32 بیتی فرض کردید(0x00000001) و به اندازه b تا اونو به چپ شیفت دادید و داخل متغییر a که از نوع 32 بیتی(long) است ریختید.
                    راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                    کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                    نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                    دیدگاه

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