اطلاعیه

Collapse
No announcement yet.

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

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

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

    دوستان سلام
    من تازه دارم lpc رو یاد میگیرم لطفا کمک کنید
    تو این دستور
    LPC_PINCON->PINSEL3|=(3UL<<30) //p1.31 is adc0.5
    3UL چه معنی میده و برای چی از ,UL استفاده شده?

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

    نوشته اصلی توسط sarlak74 نمایش پست ها
    دوستان سلام
    من تازه دارم lpc رو یاد میگیرم لطفا کمک کنید
    تو این دستور
    LPC_PINCON->PINSEL3|=(3UL<<30) //p1.31 is adc0.5
    3UL چه معنی میده و برای چی از ,UL استفاده شده?
    اجبار به کامپایلر برای اینکه عدد 3 رو بصورت پیش فرض تو کوچیکترین قالبش قرار نده و تو متغییری/رجیستری به اندازه ی UL یا unsigned long یا یه متغییر 32 بیتی قرار بده.
    این اشکال زمانی پیش میاد که نیاز به انجام محاسباتی مث ضرب و تقسیم روی این مقدار کوچیک و چند مقدار بزرگ دیگه باشه و کامپایلر به اشتباه، اینو تو کوچیکترین متغییری که جا بشه قرار بده. اونوقت ممکنه اشکال بگیره که سایز متغییرها یکی نیست.

    برای این خط کد، استفاده از این بسیار ابلهانه س و نویسنده کد، احتمالا بخاطر چند مورد نمونه دستش عادت کرده که دیگه هر عددی نوشت تهش اینو بچسبونه. قطعا هم از دنیای 8 بیتی ها اینو همراه خودش آورده چون بصورت پیش فرض کامپایلرهای 32 بیت، (در مورد کایل مایکروویژن و ام دی ک اطلاع ندارم ولی احتمال زیاد همینطوره) متغییر پیش فرضشونو همون 32 بیت میذارن. خیلی وقت ها تو همون 8 بیتی ها، استفاده بیخودی از این روش اشتباه هم هست.

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

    به عنوان یه توصیه شخصی و نامربوط به بحث، از LPC ها کم کم دور بشید. سعی کنید سویچ کنید به STM32. دلایل خوب برای این کار فراوان و منطقین.
    جدیدترین ویرایش توسط tiranoid; ۱۲:۰۳ ۱۳۹۸/۰۹/۱۶.
    Si vis pacem, para bellum

    دیدگاه


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

      نوشته اصلی توسط tiranoid نمایش پست ها
      اجبار به کامپایلر برای اینکه عدد 3 رو بصورت پیش فرض تو کوچیکترین قالبش قرار نده و تو متغییری/رجیستری به اندازه ی UL یا unsigned long یا یه متغییر 32 بیتی قرار بده.
      این اشکال زمانی پیش میاد که نیاز به انجام محاسباتی مث ضرب و تقسیم روی این مقدار کوچیک و چند مقدار بزرگ دیگه باشه و کامپایلر به اشتباه، اینو تو کوچیکترین متغییری که جا بشه قرار بده. اونوقت ممکنه اشکال بگیره که سایز متغییرها یکی نیست.

      برای این خط کد، استفاده از این بسیار ابلهانه س و نویسنده کد، احتمالا بخاطر چند مورد نمونه دستش عادت کرده که دیگه هر عددی نوشت تهش اینو بچسبونه. قطعا هم از دنیای 8 بیتی ها اینو همراه خودش آورده چون بصورت پیش فرض کامپایلرهای 32 بیت، (در مورد کایل مایکروویژن و ام دی ک اطلاع ندارم ولی احتمال زیاد همینطوره) متغییر پیش فرضشونو همون 32 بیت میذارن. خیلی وقت ها تو همون 8 بیتی ها، استفاده بیخودی از این روش اشتباه هم هست.

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

      به عنوان یه توصیه شخصی و نامربوط به بحث، از LPC ها کم کم دور بشید. سعی کنید سویچ کنید به STM32. دلایل خوب برای این کار فراوان و منطقین.
      سلام
      ببخشید این کار مثل همون تایپ کستینگه یا فرق میکنه؟ اگر فرقی دارن لطفا توضیح بدید.

      دیدگاه


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

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        ببخشید این کار مثل همون تایپ کستینگه یا فرق میکنه؟ اگر فرقی دارن لطفا توضیح بدید.
        دقیقا معادلشه. تایپ کست، تبدیل از یه "تایپ" به تایپ دیگه س. اما برای اعداد ثابت، تایپ کست به کار نمیره. این معادلش هست که بکار میره.

        یه مثال : توی برنامه نویسی سی شارپ یا جاوا، وقتی یه متغییر از نوع float تعریف کنید و بهش مقدار بدید، باید انتهای مقدار کاراکتر f بذارید. مثلا float q = 12.2f
        اگر نذارید کامپایلر ایراد میگیره. چرا ؟

        همه چیز به "قالب" پیش فرض کامپایلر برمیگرده. تو سی شارپ، وقتی که یه عدد نوشته بشه و وسطش نقطه داشته باشه(منظور عدد اعشاریه)، بصورت پیش فرض عدد از نوع اعشاری با دقت دوبرابر یا همون double محسوب میشه. بعد شما بش میگین این عددو بنداز تو یه متغییر کوچیکتر از نوع float اونم ایراد میگیره.
        این f در انتهاش بهش کامپایلر میگه این عدد رو بصورت پیش فرض دابل در نظر نگیر. float در نظر بگیر.

        اون کدی که ایشون نوشته بودن، توی AVR ممکن بود به UL نیاز پیدا کنه. (فقط ممکن بود. بسته به کامپایلر و تنظیماتش). چون میومد عدد رو مینداخت تو یه متغییر/رجیستر موقت پیش فرض 8 بیتی. بعد بهش میگفت مثلا 16 تا شیفتش بده به چپ. سرریز میکرد.
        اما توی کامپایلرهای آرم همه چیز بصورت پیش فرض 32 بیته. پس مشکلی نخواهد بود.
        جدیدترین ویرایش توسط tiranoid; ۲۲:۰۵ ۱۳۹۸/۰۹/۱۶.
        Si vis pacem, para bellum

        دیدگاه

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