اطلاعیه

Collapse
No announcement yet.

تفاوت بین define و pre define چیست؟؟؟

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

    تفاوت بین define و pre define چیست؟؟؟

    با سلام خدمت همه اساتید.
    من تازه کار با پردازنده های dsp شرکت ti رو شروع کردم. هنگام خواندن دیتاشیت به مفهوم pre defined برخورد کردم. میخواستم بدونم فرق define و pre defined در چیست ؟؟؟
    و ایا اینکه در سایر پردازنده ها نیز چنین مفهومی وجود دارد یا نه؟؟؟
    عکس قسمتی از دیتاشیت که مربوط به این موضوع هست را در ادامه قرار داده ام.
    با تشکر.

    #2
    پاسخ : تفاوت بین define و pre define چیست؟؟؟

    سلام - یه چیزی فعلا میگم - تا یه کسی که کارش اینه بیاد نظری درست حسابی بده - البته طبق چیزی که تو میکروکنترلر ها فهمیدم - شاید تو پروسسورها داستان فرق داشته باشه.
    define : یه سری ماکرو که کاربر تعریف میکنه ( کاربرد ماکرو define هم تو نت بزنی هستش )
    pre defined : یه سری ماکرو که توسط نرم افزار ( IDE ) یی که داری باهاش کار میکنی تعریف شده که برا دیدن لیست این موارد به اسناد نرم افزار فوق مراجعه میکنی.

    ماکروهای از پیش تعریف شده در دو نرم افزار/IDE معروف میکروکنترلرها
    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

    اگه دوس دارید سریع به جواب برسید :
    1) قبل از پرسیدن سوال، بسرچید.
    2) سوالاتون رو با جزئیات کامل مطرح کنید.

    دیدگاه


      #3
      پاسخ : تفاوت بین define و pre define چیست؟؟؟
      • به اینا میگن preprocessor directive
      • هردو چیزی که مورد سواله، یه مفهوم هستن
      • هیچ ارتباط خاصی به میکروکنترلرها ندارن و یه مفهوم یا ابزار کلی تو C هستن.


      دو موردی که توی سوال پرسیدین، یکی هستن فقط محل اعمالشون فرق میکنه.
      #define فقط تو همون فایل سورسی که توش نوشته شده اثر داره. بصورت عمومی تو کل پروژه وجود نداره.
      به عنوان یه مثال میکروکنترلری، وقتی شما میخواید توی چند فایل سورس، از delay استفاده کنید و میخواید فرکانس cpu رو بنویسید، مجبورید تو همه سورس ها اینو #define کنید.
      اما این امکان هم وجود داره که یجوری تعریفش کرد که همه ی سورس ها بهش دسترسی داشته باشن. که روشش همونطوریه که تو عکس مشخصه.
      مثلا برای اتمل، که باید F_CPU رو تعریف کنید میتونید از همین روش استفاده کنید. برید تو همون بخش مشخص شده بنویسید
      کد:
      -D F_CPU=12000000
      البته نیاز نیست -D رو بنویسید و صرفا همون تساوی کفایت میکنه. -D زمانی که از کامند لاین استفاده میکنید یا دستی میخواید تنظیمات build رو وارد کنید استفاده میشه.

      یکی دیگه از کاربردای تعریف عمومیش ، تعریف مدل کامپایلره (منظور شرکت سازنده س) تا سورس های مختلف که نیاز به دسترسی به یه سری ویژگی های تعریف شده خاص دارن، بفهمن که کاربر داره از کدوم IDE یا کامپایلر استفاده میکنه و مناسب اون، از دستورات خاص اون محیط استفاده کنن. این رو معمولا خود شرکت سازنده اعمال میکنه.
      همونطور که تو عکس هم مشخصه، شرکت ti گفته که اگر از یه لانچ پد استفاده میکنید، اسمشو اینجا اضافه کنید که تو همه سورس ها (اگر تمهیداتی برای این مدل لانچپد در نظر گرفته شده باشه) شناخته بشه و توابع اضافی مربوط به اون استفاده بشن. مثلا پایه ای که یه ال ای دی داره واس بلینک، واس این برد پایه 12 ه ولی برای بردای دیگه پایه 14 ه . اگر شما این روش رو استفاده نکنید، تو همه ی سورس ها باید برید عوضش کنید (یا #define محلیش رو عوض کنید).
      جدیدترین ویرایش توسط tiranoid; ۱۳:۱۳ ۱۳۹۸/۰۴/۳۱.
      Si vis pacem, para bellum

      دیدگاه


        #4
        پاسخ : تفاوت بین define و pre define چیست؟؟؟

        نوشته اصلی توسط tiranoid نمایش پست ها
        • به اینا میگن preprocessor directive
        • هردو چیزی که مورد سواله، یه مفهوم هستن
        • هیچ ارتباط خاصی به میکروکنترلرها ندارن و یه مفهوم یا ابزار کلی تو C هستن.


        دو موردی که توی سوال پرسیدین، یکی هستن فقط محل اعمالشون فرق میکنه.
        #define فقط تو همون فایل سورسی که توش نوشته شده اثر داره. بصورت عمومی تو کل پروژه وجود نداره.
        به عنوان یه مثال میکروکنترلری، وقتی شما میخواید توی چند فایل سورس، از delay استفاده کنید و میخواید فرکانس cpu رو بنویسید، مجبورید تو همه سورس ها اینو #define کنید.
        اما این امکان هم وجود داره که یجوری تعریفش کرد که همه ی سورس ها بهش دسترسی داشته باشن. که روشش همونطوریه که تو عکس مشخصه.
        مثلا برای اتمل، که باید F_CPU رو تعریف کنید میتونید از همین روش استفاده کنید. برید تو همون بخش مشخص شده بنویسید
        کد:
        -D F_CPU=12000000
        البته نیاز نیست -D رو بنویسید و صرفا همون تساوی کفایت میکنه. -D زمانی که از کامند لاین استفاده میکنید یا دستی میخواید تنظیمات build رو وارد کنید استفاده میشه.

        یکی دیگه از کاربردای تعریف عمومیش ، تعریف مدل کامپایلره (منظور شرکت سازنده س) تا سورس های مختلف که نیاز به دسترسی به یه سری ویژگی های تعریف شده خاص دارن، بفهمن که کاربر داره از کدوم IDE یا کامپایلر استفاده میکنه و مناسب اون، از دستورات خاص اون محیط استفاده کنن. این رو معمولا خود شرکت سازنده اعمال میکنه.
        همونطور که تو عکس هم مشخصه، شرکت ti گفته که اگر از یه لانچ پد استفاده میکنید، اسمشو اینجا اضافه کنید که تو همه سورس ها (اگر تمهیداتی برای این مدل لانچپد در نظر گرفته شده باشه) شناخته بشه و توابع اضافی مربوط به اون استفاده بشن. مثلا پایه ای که یه ال ای دی داره واس بلینک، واس این برد پایه 12 ه ولی برای بردای دیگه پایه 14 ه . اگر شما این روش رو استفاده نکنید، تو همه ی سورس ها باید برید عوضش کنید (یا #define محلیش رو عوض کنید).
        ممنون از پاسختون.
        الان چند چیز برام مبهم شد.
        1- الان با توجه به چیزی گفتیدوتو عکسی که من قرار دادم جلوی pre-defined name داخل پرانتز نوشته شده define-- و D- یعنی میتونیم به جای اینکه وارد منوی properties بشیم در همون جایی که برنامه را مینوسیم از دو عبارت define-- و D- استفاده کنیم؟؟؟؟
        2-در اتمل استودیو وقتی D F_CPU=12000000 - را مینویسم خطا میگیرد. مشکل کجاست؟؟
        3-عکسی در زیر قرار دادم که مربوط به اتمل استودیو هست. ایا در قسمتی که درعکس مشخص کردم باید pre-defined ها رو مشخص کنم؟؟؟؟


        باز هم سپاس گذارم.

        دیدگاه


          #5
          پاسخ : تفاوت بین define و pre define چیست؟؟؟

          نه نه . نباید -D بذارید. اون -D مخصوص یه توضیح کلی بود کم پیش میاد نیاز باشه بنویسیدش.
          جایی که انتخاب کردین درسته.
          تو قسمتی که مشخص کردین، همونطور که بالاش نوشته شده خودش -D رو میذاره تو کامند لاین. اینجا فقط شما همون + رو بزنید و F_CPU=1200000 رو بنویسید. بدون هیچگونه فاصله یا علامت اضافه ای. اضافه ش میکنه زیر DEBUG تو تصویر
          Si vis pacem, para bellum

          دیدگاه


            #6
            پاسخ : تفاوت بین define و pre define چیست؟؟؟

            نوشته اصلی توسط tiranoid نمایش پست ها
            نه نه . نباید -D بذارید. اون -D مخصوص یه توضیح کلی بود کم پیش میاد نیاز باشه بنویسیدش.
            جایی که انتخاب کردین درسته.
            تو قسمتی که مشخص کردین، همونطور که بالاش نوشته شده خودش -D رو میذاره تو کامند لاین. اینجا فقط شما همون + رو بزنید و F_CPU=1200000 رو بنویسید. بدون هیچگونه فاصله یا علامت اضافه ای. اضافه ش میکنه زیر DEBUG تو تصویر
            باز هم ممنون از توضیح خوبتون.
            اگر امکان داره یه توضیحی بدید که چه مواقعی باید D- را قرار بدیم.(من تو اینترنت هم سرچ کردم ولی چیزی در این مورد ننوشته بود.)
            یه قسمت دیگه هم در همین کامپایلر code composer studio هست به اسم pre-include. میخواستم ببینم وقتی فایل ها را در اینجا include کنیم مثل pre-defined اون فایل به کلیه فایل های موجو در پروژه include میشه یا نه؟؟؟ (عکسش رو در ادامه قرار دادم.)


            باز هم سپاس گذارم.

            دیدگاه


              #7
              پاسخ : تفاوت بین define و pre define چیست؟؟؟

              تصویر زیر رو از کایل (keil) ببینید :




              ببینید اون پایین چی نوشته. کامپایلر کنترل استرینگ. اگه توجه کنید بخش های بالایی صفحه، صرفا یه نمایش گرافیکی برای متن پایین هستن. کاربرد اون -D زمانیه که بخوایم مستقیما تو اون متن بنویسیم.
              البته دقت کنید که keil C51 که برای 8051 هست، بجای -D ، میاد تعاریف رو به شکل DEFINE(def1,def2, ...) مینویسه ولی مشابه همون -D هست.

              در مورد سوال دوم، pre include فایل:

              همه ی چیزهایی که در مورد #define گفته شد، این بار برای #include بکار ببرید. توجه کنید #include بخاطر داشتن # در ابتداش، مثل #define ، یه preprocessor directive محسوب میشه.
              اما مشکلی که برای اینکلود ها پیش میاد به مراتب بزرگتره.
              یه مثال براتون میزنم.

              ممکنه تا حالا به کتابخونه هایی، مثلا کتابخونه LCD کاراکتری معمولی برخورد کرده باشید که فقط یه فایل .h هستن. یعنی فایل سورس ندارن. خیلی از کسانی که دور و بر میکروکنترلر هستن، متاسفانه برنامه نویسی چندان اهمیت نمیدن و فایل سورس نمینویسن.
              وقتی فایل هدر رو اینکلود کنیم این مشکلات پیش میاد :

              1) همه ی توابع نوشته شده در اون اضافه میشن به میک فایل، و همه لینک میشن و در نتیجه همه حجم میگیرن از میکرو. بدون اینکه استفاده شدن باشن. البته یه سری از کامپایلرها (لینکرها) باهوشن و اینم تشخیص میدن. ولی خیلیا هم تشخیص نمیدن.
              2) فقط به یه فایل میشه اضافه ش کرد ! مثلا تو همون فایل اصلی که تابع main داره. اگر مثلا بخواید تو یه سورس دیگه اضافه ش کنید برنامه بهتون ارور میده و میگه همه ی این چیزایی که تو این فایل هست، قبلا یه بار نوشته شده (همون باری که تو مین وارد شده).
              نکته مهم : مشکل دوم ربطی به نوشتن یا ننوشتن فایل سورس نداره. در هر حال امکان اتفاق افتادن داره ولی وقتی فایل سورس نباشه، بیشتر احتمال اتفاقش هست چون کامپایلر نمیتونه از راه حل های گفته شده در زیر استفاده کنه.

              برای مشکل دوم چی میشه کرد ؟
              1) استفاده از پری پروسسور هایی مث #pragma once و #ifndef که میگه این فایل هدر رو فقط یه بار تو برنامه شامل کن نه چن بار.
              2) استفاده از روشی که شما مطرح کردین. یعنی اضافه کردن یه فایل هدر کلی. اینطوری تو هر سورسی بدون اینکلود کردنش قابل استفاده س. اما حواستون رو جمع کنید. اگر فایل هدر، سورس نداره و مثل کتابخونه های درپیتی نوشته شده س (اتفاقا زیاد هم تو ایران هست) و لینکر هم مثلا به پیشرفته بودن ویژوال استودیو نیست، فایل به اندازه ی همه سورس ها کپی میشه .

              به عنوان یه راهنمایی عمومی در مورد انتخاب محیط برنامه نویسی همیشه دقت کنید :

              1) بهترین محیط، محیط رسمیه. اصلا رو محیط های دیگه مث کدویژن و اینا حساب نکنید. برای آرم کمی عمومی تره چون همه تقریبا یه کامپایلر دارن. برا آرم هم ترجیحا به همون کایل مایکروویژن بچسبید.
              2) هرچیزی که ویژوال استودیو داره، از ویژوال استودیو استفاده کنید. ویژوال استودیو (با اینکه سنگینه و دشمن زیاد داره !) نماد برنامه نویسی پیشرفته س. اصن مایکروسافت یه شرکت "کاملا برنامه نویس" محسوب میشه. اتمل استودیو بر پایه ویژوال استودیوه.
              Si vis pacem, para bellum

              دیدگاه


                #8
                پاسخ : تفاوت بین define و pre define چیست؟؟؟

                نوشته اصلی توسط tiranoid نمایش پست ها
                تصویر زیر رو از کایل (keil) ببینید :




                ببینید اون پایین چی نوشته. کامپایلر کنترل استرینگ. اگه توجه کنید بخش های بالایی صفحه، صرفا یه نمایش گرافیکی برای متن پایین هستن. کاربرد اون -D زمانیه که بخوایم مستقیما تو اون متن بنویسیم.
                البته دقت کنید که keil C51 که برای 8051 هست، بجای -D ، میاد تعاریف رو به شکل DEFINE(def1,def2, ...) مینویسه ولی مشابه همون -D هست.

                در مورد سوال دوم، pre include فایل:

                همه ی چیزهایی که در مورد #define گفته شد، این بار برای #include بکار ببرید. توجه کنید #include بخاطر داشتن # در ابتداش، مثل #define ، یه preprocessor directive محسوب میشه.
                اما مشکلی که برای اینکلود ها پیش میاد به مراتب بزرگتره.
                یه مثال براتون میزنم.

                ممکنه تا حالا به کتابخونه هایی، مثلا کتابخونه LCD کاراکتری معمولی برخورد کرده باشید که فقط یه فایل .h هستن. یعنی فایل سورس ندارن. خیلی از کسانی که دور و بر میکروکنترلر هستن، متاسفانه برنامه نویسی چندان اهمیت نمیدن و فایل سورس نمینویسن.
                وقتی فایل هدر رو اینکلود کنیم این مشکلات پیش میاد :

                1) همه ی توابع نوشته شده در اون اضافه میشن به میک فایل، و همه لینک میشن و در نتیجه همه حجم میگیرن از میکرو. بدون اینکه استفاده شدن باشن. البته یه سری از کامپایلرها (لینکرها) باهوشن و اینم تشخیص میدن. ولی خیلیا هم تشخیص نمیدن.
                2) فقط به یه فایل میشه اضافه ش کرد ! مثلا تو همون فایل اصلی که تابع main داره. اگر مثلا بخواید تو یه سورس دیگه اضافه ش کنید برنامه بهتون ارور میده و میگه همه ی این چیزایی که تو این فایل هست، قبلا یه بار نوشته شده (همون باری که تو مین وارد شده).
                نکته مهم : مشکل دوم ربطی به نوشتن یا ننوشتن فایل سورس نداره. در هر حال امکان اتفاق افتادن داره ولی وقتی فایل سورس نباشه، بیشتر احتمال اتفاقش هست چون کامپایلر نمیتونه از راه حل های گفته شده در زیر استفاده کنه.

                برای مشکل دوم چی میشه کرد ؟
                1) استفاده از پری پروسسور هایی مث #pragma once و #ifndef که میگه این فایل هدر رو فقط یه بار تو برنامه شامل کن نه چن بار.
                2) استفاده از روشی که شما مطرح کردین. یعنی اضافه کردن یه فایل هدر کلی. اینطوری تو هر سورسی بدون اینکلود کردنش قابل استفاده س. اما حواستون رو جمع کنید. اگر فایل هدر، سورس نداره و مثل کتابخونه های درپیتی نوشته شده س (اتفاقا زیاد هم تو ایران هست) و لینکر هم مثلا به پیشرفته بودن ویژوال استودیو نیست، فایل به اندازه ی همه سورس ها کپی میشه .

                به عنوان یه راهنمایی عمومی در مورد انتخاب محیط برنامه نویسی همیشه دقت کنید :

                1) بهترین محیط، محیط رسمیه. اصلا رو محیط های دیگه مث کدویژن و اینا حساب نکنید. برای آرم کمی عمومی تره چون همه تقریبا یه کامپایلر دارن. برا آرم هم ترجیحا به همون کایل مایکروویژن بچسبید.
                2) هرچیزی که ویژوال استودیو داره، از ویژوال استودیو استفاده کنید. ویژوال استودیو (با اینکه سنگینه و دشمن زیاد داره !) نماد برنامه نویسی پیشرفته س. اصن مایکروسافت یه شرکت "کاملا برنامه نویس" محسوب میشه. اتمل استودیو بر پایه ویژوال استودیوه.
                ممنون از پاسخ و راهنمایی هاتون.

                دیدگاه

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