نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

عملگر ## و ارسال آدرس تابع در زبان c++

به نام خدا : تو این مطلب میخوام دو تا موضوع رو توضیح کوچیک بدم و از هر کدوم یه مثال ساده بزنم : 1- عملگر ## 2-ارسال آدرس تابع / که حالا این دو مورد کجا بکار میاد و … در میاد و توضیحات در ادامه مطلب میگم؛ مورد اول رو بیشتر برا اطلاعات عمومی میگم، بیشتر مورد دوم مهم هستش ( ارسال آدرس تابع ) که تو کتابخونه نویسی خیلی کمک میکنه. ( کامپایار DEV_CPP رو دانلود کنید – باید حدود 50 میگ باشه / برا تمرین کدنویسی به زبون C/CPP خوب هستش، منظورم از CPP همون ++C هستش! کدهای زیر داخل این نرم افزار نوشته شده اند / البته بهتر بود میگفتم IDE DEV_CPP – بگذریم زیاد مهم نی )

عملگر ## و ارسال آدرس تابع در زبان c++

عملگر ## و ارسال آدرس تابع در زبان c++

عملگر ## در زبان c++

خب ساده بگم این عملگر ( که شاید هم تا حالا بکارتون نیومده باشه و بعد از این هم بکارتون نیاد خخخخ ) کارش اینه که دوتا چیز رو به هم وصل میکنه مثلا :

که در واقع معادل زیر هستش :

که خب کارای جالبی میشه باهاش کرد، مثلا تعریف متغییر ( اینایی که من میگم بیشتر برا آشنایی و چند تا کاربرد ساده هستش، وگرنه کاربرد اصلیشو نمیدونم کجا هستش – تو نت بودم که این عملگر یا ماکرو – هر چی هستش حالا – رو دیدم و گفتم اینجا هم بزارمش )  :

یه مثال دیگه :

و مثال آخر :

مطالعه بیشتر  ( منابع ) :

1) ## macro operator

2) Replacing text macros

 

ارسال آدرس تابع در زبان c++

توجه : نام تابع = آدرس تابع هستش؛ همون طور که نام آرایه بیانگر آدرس خونه اول آرایه هستش.
خب هدف از تهیه این مطلب بیشتر این مورد بود، بعضا دیدید که کتابخونه مینویسید یا از کتابخونه های آماده توی نت استفاده میکنید، تابع وقفه ( مثلا تابع وقفه UART0 ) داخل کتابخونه تعریف شده، حالا میخوایم داخل این تابع وقفه یه سری کد بزاریم، باید برید کتابخونه رو ویرایش کنیم، حالا فرض کنید کتابخونه رو نوشتید و یه تازه کار میخواد یه کدی به تابع وقفه ( که داخل کتابخونه تعریف شده ) اضافه کنه، برای راحتی کاربر میایم از روش زیر استفاده میکنیم :
خب کاربر در پروژش یه تابع تعریف میکنه و مثلا در تابع init یا begin کتابخونه شما ( یا هر اسمی که برا تابع راه انداز گزاشتید یا کلا هر تابعی که دوس دارید ) میاد آدرس تابع خودشو به تابع begin کتابخونه شما میده، و وقفه مد نظر هر موقع رخ داد، کتابخونه میاد این تابع وقفه ای که کاربر بهش داده رو اجرا میکنه ( کتابخونه قبلا آدرس تابع مد نظر کاربر رو ازش گرفته ) – خب بریم سراغ کد، اینطور بهتره – حتما قبل خودن توضیحات – کد رو هم تست کنید.
کد “فایل main” کاربر : به اسم main.cpp ذخیره کنید.

کد “فایل کتابخونه ما” : مثلا کتابخونه یه lcd serial رو نوشتیم خخخ ( به اسم lcd.h ذخیره کنید )

خب برید این کد رو تست کنید و بعد توضیحات! زیر رو بخونید :
خب اون تابع main تابع کاربر هستش مثلا، و اون فایل lcd.h مثلا کتابخونه lcd seial ما هستش؛ من کد فوق رو تو کیل تست کردم – موردی نبوده؛ فقط باید نکات زیر رو رعایت کنید تا به مشکل نخورید :
خب تو فایل lcd.h من اومدم نوع تابع ( که کاربر میخواد بهمون بده، نوع ورودی خروجی این تابع زیر با اونی که کاربر ایجاد میکنه تو فایل main اش باید یکسان باشه ) رو typedef کردم، اگه نمیدونید typedef چیه تو نت سرچ کنید، تو سایت هم قبلا مطالبی دربارش گزاشتم، کد زیر رو شما باید در فایل h. کتابخونتون و قبل تعریف class قرار بدید :

بعد میایم یه متغییر از این typedef فوق ایجاد میکنیم، تا آدرس تابع کاربر در این متغییر ذخیره بشه، این کد رو شما باید در فایل cpp. کتابخونتون قرار بدید :

تابع زیر هم مثلا تابع راه انداز کتابخونه شما هستش، که کاربر میاد نام تابع مد نظرشو به کتابخونه ما میده، البته از هر تابع دیگه برا این کار میشه استفاده کرد ولی خب بهتره برای سادگی کار بهتره این پارامتر رو تو همون تابع راه انداز کتابخونتون بزارید ( تعریف تابع init در فایل h. کتابخونه و خود کد init در فایل cpp. قرار میگیره لذا کد زیر باید در فایل cpp. کتابخونه قرار بگیره – اینو برا تازه کارا گفتم ^_^ ) :

کد زیر هم مثلا تابع وقفه توی کتابخونه ما هستش، که تابع کاربر رو داخلش قرار میدیم تا هر وقفه رخ داد، تابع کاربر هم اجرا بشه :

کد های داخل main هم نیازی به توضیح نداره دیگه، تو خط 4 تا 6 کاربر اومده تابع مد نظرشو ایجاد کرده، تو خط 10 اومده نام تابع ( که همون آدرس تابع میشه ) رو به تابع راه انداز کتابخونه lcd ما داده و تمام؛ البته چون کد فوق داخل DEV_CPP نوشته شده، از وقفه مقفه خبری نیست، لذا خودمون میایم تو تابع MAIN تابع وقفه رو یکبار اجرا میکنیم تا ببینیم که تابع تعریف شده توسط کاربر اجرا میشه یا نه ( که خب تست کردم اجرا شد خخخ )

خب امیدوارم از این مطلب خوشتون اومده باشه – هر چند که چیزی نگفتم – فقط داستانو پیچوندم – یه کلاس آموزشی الکترونیک رفیقم تو تهران میرفت – من یه جلسه باهاش رفتم، دقیقا همین طور که در بالا من داستانو پیچوندم ( البته چون حسشو داشتم اینقدر توضیح دادم وگرنه فقط کدو میزاشتم ^_^ ) استاد هم میاد یکم بیشتر داستانو ساده تر بیان میکنه و بیشتر میپیچونه و زمان بیشتر صرف میشه برا هر آموزش – البته نمیگم همه اینطور هستنا – ولی خب این مدلی هم داریم، اینم گفتم تا یه وقت فک نکنید اینایی که میرن کلاس خبری هستش و … – هر جایی کلاس آموزشی نرید – اینطوری بگم بهتره – اون کلاسی که من با رفیقتم رفتیم – 2-3 بار این اتفاق افتاد که استاده!!! یه مدار با پروژکتور رو صفحه انداخت و به بچه های اون کلاس ( 20-30 سالشون بود ) گفت این مدارو رسم کنید تا من بر گردم ( میرفت چای میخورد، با منشی چت میکرد و … الله اعلم من ندیدم – فقط میرفت بیرون از کلاس ) – جالبش اینجا بود که میگفت این مدارو رسم کنید تا دستتون راه بیوفته 😀  focus قبل شروع کلاس هم کلی ژست پدرانه میگرفت که من دوست دارم شما پیشرفت کنید – حیفه بخونید و فلان و بسال  shout  crazy
خب دیگه پر حرفی بسته، فعلا یا علی؛ ( راسی مطلب مفید بود براتون یه فاتحه برا اموات خودمو خودتون بخونید )

مهمترین ویژگی کوفیان ( نهج البلاغه ) :
حدیث تصویری

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ السارِچین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
2

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    Reza.zx

    سلام
    برا ## یکم بد توضیح دادی.
    طبق همون رفرنسی ک دادی من رفتم:
    #define DECLARE_AND_SET(type, varname, value) type varname = value; type orig_##varname = varname;
    Now you can write code like
    DECLARE_AND_SET( int, area, 2 * 6 );
    and orig_area always has the original value of area no matter how the variable is changed.
    کاربرد جالبی داره استفاده میکنه.
    درواقع یجوری بصورت پویا داره یه سری متغییر جدید ایجاد میکنه مثلا:
    DECLARE_AND_SET( int, widthA, 40 );
    DECLARE_AND_SET( int, WidthB, 50);
    بعد از این دو خط کد ما دوتا متغییر جدید به اسم orig_widthA , orig_whidthB داریم که مقدار 40 و 50 توش إخیره شده و تغییر توی متغییرای widhtA , whidthB دیگه تاثیری رو اونا نمیزاره…
    برنامه زیر رو تست کن :
    #include
    #include
    using namespace std;
    #define DECLARE_AND_SET(type, varname, value) type varname = value; type orig_##varname = varname;
    int main()
    {
    DECLARE_AND_SET(int,w1,40);
    DECLARE_AND_SET(int,w2,50);
    w1=33;w2=44;
    cout<<"w1= "<<w1<<"\nw2= "<<w2<<endl;
    cout<<"orig_w1= "<<orig_w1<<"\norig_w2= "<<orig_w2<<endl;
    return 0;
    }
    خروجی برنامه میشه :
    w1= 33
    w2= 44
    orig_w1= 40
    orig_w2= 50
    به هر حال مرسی داری heart

  2. Avatar

    مهمان

    K1

    سلام و خسته نباشید
    مثل همیشه عالی بود
    Cpp خیلی ویژگیهای خوبی داره که اگر به آموزشش پرداخته بشه پیشرفت خوبی رو حاصل میکنه