ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.






جهت تبلیغ در وب سایت ECA کلیک کنید.

کاربران برچسب زده شده

صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 12

موضوع: __INLINE static void

  1. #1
    2009/08/26
    146
    2

    __INLINE static void

    INLINE static void__
    اين دستور يعني چي؟
  2. #2
    2008/04/05
    تهران
    1,096
    18

    پاسخ : __INLINE static void

    واقعا یعنی چی؟
    من همیشه تو کدهای C میبینم ولی تو برنامه نویسی میکرو static بودن تابع چه معنی ای میده؟
    ولی inline یعنی که تابع بجای فراخوانی شدن کپی میشه تو محل فراخوانی و اینطوری stack رو اشغال نمیکنه ولی فلش رو بیشتر اشغال میکنه.
    بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
    اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
  3. #3
    2010/04/09
    اسلامشهر
    1,494
    31

    پاسخ : __INLINE static void

    با سلام
    نقل قول نوشته اصلی توسط mostafahk
    واقعا یعنی چی؟
    من همیشه تو کدهای C میبینم ولی تو برنامه نویسی میکرو static بودن تابع چه معنی ای میده؟
    نقل قول نوشته اصلی توسط رضا آقازاده
    مثلا فرض کنین پروژه ما از چند سورس مجزا (که include نشن و جدا گانه کامپایل بشن) تشکیل شده. در این حالت object های هر سورس بعد از کامپایل شدن در فاز لینک بهم وصل میشن تا فایل نهایی رو تولید کنن. در این حالت اگر متغیر عمومی یا تابعی بصورت static معرفی بشه (البته طبق قواعد عمومی زبان C) دیگه به اسم خودش در object نهایی معرفی نمیشه. یعنی نمیشه از object های دیگه شناسایی بشه و نتیجتا قابل صدا کردن هم نیست:


    کد:
    file main.c:
    
    void main(void)
    {
      func1_in_test_c();
      wait_for_response();
    }
    
    
    file test.c
    
    void func1_in_test_c(void)
    {
    }
    
    
    file uart.c
    
    static void wait_for_response(void)
    {
    }
    
    --------
    
    a part of project map file
    
     .text     0x000000a4    0xa main.o
            0x000000a4        main
     .text     0x000000ae    0x2 test.o
            0x000000ae        func1_in_test_c
     .text     0x000000b0    0x0 uart.o
     .text     0x000000b0    0x0 c:/winavr/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
            0x000000b0        . = ALIGN (0x2)
    
    
    --------
    
    compile error
    
    Z:\Projects\test\test\default/../main.c:8: undefined reference to `wait_for_response'



    اگر توجه کنین میبینین که با اینکه تمامی توابع در پروژه موجوده و کامپایلر WinAVR خطا میده که نماد wait_for_response رو نمیشناسه. این بخاطر استفاده از لغت static در هنگام نوشتن تابع هست که به کامپایلر حالی میکنه که object نهایی نباید حاوی اسم این تابع باشه.
  4. #4
    2008/09/02
    اصفهان
    1,897
    37

    پاسخ : __INLINE static void

    ....
    ضمنا inline قید کردن یک تابع؛ الزامی برای inline شدنش ایجاد نمیکنه بلکه شرایطی داره که باید اون شرایط وجود داشته باشه. مثلا یک تابع recursive (تابعی که خودش خودش رو صدا میکنه) رو نمیشه inline کرد حتی اگر Inline معرفی بشه.
  5. #5
    2009/08/26
    146
    2

    پاسخ : __INLINE static void

    ممنون از جوابتون امکانش هست يکم ساده تر توضيح بدين که منم متوجه بشم
  6. #6
    2008/09/02
    اصفهان
    1,897
    37

    پاسخ : __INLINE static void

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


    int next_index(int n)
    {
    n++;
    if( n == limit )
    n = 0;
    return n;
    }


    براحتی میشه در جایی که استفاده شده insert کرد. چون هم رفتارش برای کامپایلر مشخصه و هم میزان استک مورد استفاده و هم کد ساده ای داره. اما این یکی کد رو در نظر بگیرین:

    int fact(int n)
    {
    if(n == 2)
    return 2;
    return fact(n-1)*n;
    }


    اگر این تابع رو به فرم inline تعریف کنیم کامپایلر قراره چکار کنه؟ کامپایلر به اطلاعات زمان اجرا دسترسی نداره. تا این کد هم صدا زده نشه که نمیشه فهمید مقدار n چقدر هست و چند بار باید این کد در محلی که صدا زده شده (من جمله خود تابع) اضافه بشه. پس اگر من این تابع رو inline معرفی کنم و کامپایلر هم بخواد نمیتونه inline استفاده اش کنه.

    بنا براین من توسط استفاده از لغت inline فقط امکان inline کردن یک تابع رو به کامپایلر پیشنهاد میدم. اون ممکنه بتونه یا نتونه. ممکنه انجام بده یا نده. مثلا فرض کنین یک تابع با حجم کدی در حدود 100 بایت 100 جای متفاوت صدا زده شده. اگر قرار باشه inline بشه چیزی نزدیک 10 کیلو به حجم کد اضافه میکنه. حالا میکرویی داریم با 8 کیلو حافظه فلش. بهینه سازی هم روی حجم هست. اگر بخواد این کد رو inline کنه که دیگه این برنامه بدرد هیچی نمیخوره. چون توی فلش جا نمیشه. ولی ممکنه تشخصی بده شما چون گفتی "بهینه سازی حجمی" پس این لغت inline رو برای این تابع ندیده بگیره بهتره. بخاطر همین بعضی کامپایلر ها جدای از inline دستوری بنام forceinline هم دارن. که به کامپایلر میگه تحت هر شرایطی اگر میتونی inline کنی حتما انجام بده.
  7. #7
    2009/08/26
    146
    2

    پاسخ : __INLINE static void

    ممنون از پاسختون من کتاب C++قمي را دارم اما چيزي متوجه نشدم مرجع بهتري هست
  8. #8
    2008/09/02
    اصفهان
    1,897
    37

    پاسخ : __INLINE static void

    جواب من بدرد نخورد یا کتاب بهتری میخوایین؟
  9. #9
    2009/08/26
    146
    2

    پاسخ : __INLINE static void

    نقل قول نوشته اصلی توسط رضا آقازاده
    جواب من بدرد نخورد يا کتاب بهتري ميخوايين؟


    ممنون از جوابتون
    من اينطور متوجه شدم که inline يعني بجاي فراخواني شدن کپي ميشود
    حالا inline__ يعني چي /چه فرقي با inline داره
    در ضمن ماکرو چي هست

    stack چي هست
    حالا چرا تو تعريف تابع inline stack void تعريف شده

    مببيني همه چيش برام سواله
  10. #10
    2008/09/02
    اصفهان
    1,897
    37

    پاسخ : __INLINE static void

    inline__ همون inline هست. چون این دستور یک دستور استاندارد زبان C نیست بخاطر استاندارد کردن موارد توسعه ای زبان C پیشوند __ قبل از اون آورده میشه.
    ماکرو همون فرم هایی مثل تابع هست که شما توسط دستورات پیش پردازشی استفاده میکنین مثل:

    #define min(a,b) (((a)<(b))?(a):(b))


    همونطور که میبینین این یک جورایی عین یک تابع رفتار میکنه اما نوعی برای a و b تعریف نشده. بنا براین آرگومانهای اون بودن نوع هستن. و در اصل وقتی مینویسیم:

    min(5,7)


    کامپایلر قبل از شروع به کامپایل اون رو با عبارت زیر تعویض میکنه:

    (((5)<(7))?(5):(7))


    یک جایگزینی ساده. ولی کارا.

    static مشخص میکنه که این تابع فقط داخل همین سورس جاری استفاده میشه و جای دیگه ای نباید شناخته بشه.

    void یعنی مقدار برگشتی تابع مشخص نیست یا به زبانی دیگه تابع مقدار برگشتی نداره.

    اگر معنی استک یا پشته رو هم نمیدونی که بهتره یک کتاب C (هر چی باشه) گیر بیاری و درست مطالعه کنی چون مشخصا ساختارهای حافظه رو نمیدونی. اگر هم حالش نبود بگو یه جوری از خجالتت در بیاییم.
    :mrgreen:
    فقط یه کمی باید قصه حسن کچل تعریف کنم. منطق هاش ساده هست. مسلما براحتی متوجه میشی. فقط باید قصه رو گوش بدی. همین.
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 12

موضوعات مشابه

  1. interrupt [PCINT1] void pin_change_isr1(void)
    توسط farhadgeraei در انجمن C , C++ , C#
    پاسخ: 0
    آخرين نوشته: 2015/12/11, 21:08
  2. اضافه کردن دستور (int main(void
    توسط sepehr7192 در انجمن پروسسورهای ARM
    پاسخ: 2
    آخرين نوشته: 2015/08/16, 12:34
  3. ip static
    توسط asad2006 در انجمن كامپيوتر ، اينترنت و علوم مرتبط
    پاسخ: 11
    آخرين نوشته: 2013/01/10, 17:15
  4. مشكل در برنامه نويسي با __inline
    توسط galaxy_y در انجمن NXP
    پاسخ: 1
    آخرين نوشته: 2012/07/23, 16:13
  5. extern "C" void DMA_IRQHandler (void); یعنی چی
    توسط mohsen.hex در انجمن پروسسورهای ARM
    پاسخ: 6
    آخرين نوشته: 2011/11/26, 21:27

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •