اطلاعیه

Collapse
No announcement yet.

سوال در مورد زبان C

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

    سوال در مورد زبان C

    سلام
    از دوستان کسی هست که بدونه
    1-چطور میشه آدرس محل اجرای یی تابع رو تو زبان c بدست آورد.
    2-چطور میشه یه ویژگی برای تابع تعریف کرد مثل
    [code=c]__task void task1(void)
    {
    led1=on;
    }

    __task void task2(void)
    {
    led2=on;
    }[/code]
    تو این مثال ویژگی ___task رو چطور ایجاد کرده؟
    ممنون

    #2
    پاسخ : سوال در مورد زبان C

    سلام
    شما میخواید که به جای این که به مقادیر تابع دسترسی داشته باشید،به یک قطعه کد قابل اجرا دسترسی داشته باشید که میشه همون آدرس تابع مورد نظر.
    همونطور که پیداست باید از اشاره گر به تابع استفاده شود.حالا تعریف اشاره گر به تابع اینه که :: اشاره گر به تابع، یه نوع اشاره گر هست که در زبان های نسل سه و شیءگرا وجود داره و همونطور که گفتم به جای اشاره به مقادیر داده ای به قطعه کد تابعت در فضای حافظه اشاره میکنه.و از این طریق میتوان به طور غیر مستقیم تابع مورد نظر را فراخوانی کرد و همچنین اگر تابع دارای آرگومان یا ورودی باشد میتوان آنرا طبق روال قبلی (فراخوانی مستقیم) به تابع ارسال کرد.
    حالا یک مثال:
    [code=c]double (*point) (double);[/code]
    تو قطعه کد بالا اشاره گر به نام point اعلان شده است که میتواند پارامتری از نوع دابل و برگشتی هم از نوع دابل را برگرداند.
    رای اینکه اشارهآ‌گر بالا به تابعی اشاره کند، باید آدرس تابع مورد نظر در داخل اشارهآ‌گر قرار گیرد. در زبان سی، نام یک تابع، آدرس ابتدای محلی از حافظه است که کدهای تابع در آنجا قرار دارند؛ بنابراین برای مقدار دهی به یک اشارهآ‌گر به یک تابع (مثلاً test()‎) میآ‌توان به صورت زیر عمل کرد.
    [code=c]piont = test;[/code]
    با استفاده از نامش به آدرش دسترسی پیدا کردیم.حالا برای این که کد ها گنگ نشن ، این نوع اشاره گرها رو به صورت typdef تعریف میکنیم به صورت زیر:
    [code=c]typdef int (*function_t) (int);
    function_t f1 , f2;
    [/code]
    تو مثال بالا f1 و f2 اشاره گ به تابعی هستند که یک ورودی از نوع int و یک خروجی از نوع int را برمیگرداند.حال میتوان خود این اشاره گر به تابع را به عنوان بک آرگومان به یک تابع ارسال کرد،فرض کن که در یک تابع قرار است که برای محاسبات از توابع مثلثاتی استفاده کنی مثلا به دو تابع سینوس و کسینوس احتیاج هست ولی تو تابع هر بار یکی از این توابع باید فراخوانی بشه تو حالت عادی این دو تابع رو پشت سر هم فراخوانی میکنیم و یا دو متغییر براش تعریف میکنیم و مقدار سینوس و کسینوس رو داخلش میریزیم، شاید اگه بخوای از حافظه بیشترین استفاده رو بکنی به صرفه نباشه.
    خیلی خوب میشد اگه میتونستیم به تابعمون بگیم که کدوم یک از توابع سینوس یا کسینوس رو فراخوانی کنه،خوشبختانه بوسیله این اشاره گر ها میتوان این عمل را انجام داد.
    به این برنامه توجه کن:
    [code=c]# include <math.h>
    # include <stdio.h>

    /* Function taking a function pointer as an argument */
    double compute_sum(double (*funcp)(double), double lo, double hi)
    {
    double sum = 0.0;

    /* Add values returned by the pointed-to function '*funcp' */
    for (int i = 0; i <= 100; i++)
    {
    double x, y;

    /* Use the function pointer 'funcp' to invoke the function */
    x = i/100.0 * (hi - lo) + lo;
    y = (*funcp)(x);
    sum += y;
    }
    return (sum/100.0);
    }

    int main(void)
    {
    double (*fp)(double); /* Function pointer */
    double sum;

    /* Use 'sin()' as the pointed-to function */
    fp = sin;
    sum = compute_sum(fp, 0.0, 1.0);
    printf("sum(sin): %f\n", sum);

    /* Use 'cos()' as the pointed-to function */
    fp = cos;
    sum = compute_sum(fp, 0.0, 1.0);
    printf("sum(cos): %f\n", sum);
    return 0;
    }[/code]
    در این برنامه تابع compute_sum برای دسترسی به سینوس و کسینوس از اشاره گر به تابع استفاده میکنه، اگه توجه شود اولین پارامتر این تابع همان اشاره گر مورد نظر است و در تابع main دو بار compute_sum فراخوانی شده، یک بار اشاره گری به sin و باردیگر اشاره گری به cos به تابع ارسال شده است و تابع compute_sum هم هر بار یکی از این دو تابع را به روش غیر مستقیم و با داشتن اشاره گری به آنها، این توابع را فراخوانی میکند.
    [img width=281 height=100]http://cdn.persiangig.com/preview/acPBCNLNNr/images.jpg[/img]

    دیدگاه

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