PDA

View Full Version : سوال: توابع تو در تو



alireza_tavakol
یک شنبه 15 شهریور 1388, 01:00 صبح
با سلام خدمت اساتید محترم

به نظر شما چرا امکان تعریف nested function در زبان های قدرتمندی همچون C و C++ وجود نداد:متفکر:

این در حالی است که زبان Pascal که به بهداشتی بودن کد ها اهمیت وافری میده امکان تعریف توابع تو در تو رو داره!

amiin1364
یک شنبه 15 شهریور 1388, 05:33 صبح
سلام
کد nasted توی c وجود داره اما........!
کد:

float

show(float x)

{

float hide(float y)
{
return x + y;
}
return hide(3);


}


اینم nested function که توی GNU C میشه استفاده کرد.


من توی eclipse با gcc کامپایل کردم.همه جا support نمیشه مثلا c builder


:متفکر:حالا نظرشخصی :وقتی مفاهیمی همچون کلاس و توابع دوست وجود داره این format


نوشتن چیزی نیست جز تلاشی در جهت بی نظمی بیشتر

Salar Ashgi
یک شنبه 15 شهریور 1388, 09:21 صبح
سلام ، فراخوانی تابعی داخل تابع دیگر امکان پذیر است ، همانطورکه ما در داخل تابع main

ممکن است چند تابع جداگانه دیگر را صدا بزنیم ! ولی امکان تعریف تابع داخل تابع دیگر به

هیچ وجه وجود ندارد !

موفق وپیروز باشید !!!

alireza_tavakol
یک شنبه 15 شهریور 1388, 13:31 عصر
در همین تالار پستی در زمینه قابل حمل بودن کد های C (http://www.barnamenevis.org/forum/showpost.php?p=525738&postcount=4) دیدم که به بحث کمک میکرد واسه همین نقل قول گذاشتم

زبان C یک زبان portable هست ، به شرطی که شما از توابع استاندارد C استفاده کنید. یعنی اگه برنامۀ شما فقط از توابع کتابخانۀ استاندارد C (مثل ، printf ، malloc ، و ... scanf) استفاده کنه ، تضمین میشه که روی تمامی سیستم عامل هایی که کامپایلر C براشون موجود هست (and who is not ?) کامپایل بشه. پس این portability در سطح کد هست نه در سطح باینری.



float show ( float x )
{
float hide(float y)
{
return x + y;
}

return hide(3);
}
با تشکر از amiin1364 ، اگه این تعریفی که شما فرمودید در بعضی از کامپایلر ها قابل پیاده سازی باشد ، هیچ نوعی از portability رو نمیشه واسه زبان C قائل بشیم ! چون فرض کن یک برنامه نویس یک برنامه کاملا" ساده ( بدون استفاده از امکانات خاص سیستم عامل ) رو توی محیط لینوکس با GNU C بنویسه و توی برنامش توابع رو تودرتو تعریف کرده باشه ، بعد بخواهد کدش رو واسه سیستم عامل داس کامپایل کنه وقتی قرار میشه توسط کامپایلر Turbo C++‎ Borland این کد کامپایل بشه با syntax error مواجه میشه!

این سناریو و مسئله قابل حمل بودن کد های C چطوری توجیه میشه؟

alireza_tavakol
یک شنبه 15 شهریور 1388, 13:40 عصر
همطوری که مشاهد کردین پس امکان تعریف توابع تودرتو در زبان های مختلف برنامه نویسی وجود داره حتی توی بعضی از کامپایلر های زبان C این قابلیت وجود داره (نمونش پست دوم همین تاپیک ) پس چرا این قاعده در تمام کامپایلر ها قابل پیاده سازی نیست؟

جواب شماره 1 ) یکی از دوستان گفتن باعث آشفتگی و بی نظمی میشه!

جواب شماره 2 ) یکی از دوستان گفتن باعث OverHead میشه!

جواب شماره 3 ) یکی از دوستان گفتن چون امکان صدا زدن توابع به صورت تودرتو وجود داره اصلا" نیازی نداریم به تعریف توابع به صورت تودرتو!


((پاسخ به اتهامات وارد))

جواب جواب شماره 1 ) به نظر من نه تنها باعث بی نظمی نمیشه بلکه تعریف توابع به صورت تودرتو باعث نظم در کد نویسی میشه چون ، شما فرض کن یک تایع داشته باشی برای انجام کلیه محاسبات ریاضی (calculate) حالا من فقط توی این تایع به توابعی همچون محاسبه توان و فاکتوریل و... نیاز دارم و در هیچ کجای دیگه برنامه نیازی به call کردن تابع فاکتوریل ندارم.به نظر شما اگه تابع فاکتوریل به صورت nested تعریف بشه کدهای من منظم تر یا وقتی که تابع فاکتوریل به صورت سراسری صدا زده بشه؟

جواب جواب شماره 2 ) من که بلد نیستم میزان سربار رو به صورت فرمول ریاضی حساب کنم ولی چه طوریه که واسه پاسکال تعریف توابع به صورت تودرتو سربار اضافی نداره اما برای زبان C سربار داره !

جواب جواب شماره 3 ) به نظر من این جواب نوعی از فرافکنی ( سفسطه - طفره - مغلطه - طقطغه و ...) است!

با تشکر از دوستانی که در بحث شرکت کرده اند و همچنین تشکر از کسانی که زین پس به بحث ما خواهند پیوست:لبخندساده:

deopen
یک شنبه 15 شهریور 1388, 15:27 عصر
توابع لامبدا یا تو در تو فعلا در استاندارد زبان Cpp وجود ندارد , اما با یک جست جوی ساده در اینترنت متوجه خواهید شد که این توابع در استانداردهای بعدی( Cpp 0x) اضافه شده اند , اگر کامپایلری این توابع را پشتیبانی می کند پس از استانداردهای فعلی زبان پیروی نکرده هرچند که مفید باشد, ولی پیش شرط protability بودن پیروی از استانداردها و استفاده از کتابخانه های استاندارد میباشد .

http://en.wikipedia.org/wiki/C%2B%2B0x

deopen
یک شنبه 15 شهریور 1388, 15:29 عصر
این ها را هم مطالعه کنید.


http://blogs.msdn.com/vcblog/archive/2008/10/28/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx

http://msdn.microsoft.com/en-us/library/dd293608%28VS.100%29.aspx

Salar Ashgi
یک شنبه 15 شهریور 1388, 17:10 عصر
اینکه امکان تعریف تابع داخل تابعی دیگر در ++C و C وجود نداره ، بنظرم موردی کاملا منطقی است ، حال

آنکه این مورد خود جمله اصلی کتاب How to program C++‎ Deitel میباشد و صراحتا به این موضوع اشاره

کرده است !!!

amiin1364
دوشنبه 16 شهریور 1388, 01:14 صبح
سلام
با تشکر از dopen و آقای توکل

اینکه امکان تعریف تابع داخل تابعی دیگر در ++C و C وجود نداره ، بنظرم موردی کاملا منطقی است ، حال

آنکه این مورد خود جمله اصلی کتاب How to program C++‎‎‎ Deitel میباشد و صراحتا به این موضوع اشاره

کرده است !!!
دوست عزیز کمی منطق گاهی لازم است.وقتی که یک سند زنده "gcc" و جود داره این حرف بی منطقه .کتاب دایتل چند ساله که چاپ شده و کامپایلر به روز میشه.تازه کتاب ممکنه در چهار چوب خاص باشه.اگه میگی کامپایلر gcc ربطی به c نداره!!!!!!!!! که........
تئوری در کنار عمله که ارزشمنده........... میتونید gcc رو بگیرید test کنید

جواب جواب شماره 1 ) به نظر من نه تنها باعث بی نظمی نمیشه بلکه تعریف توابع به صورت تودرتو باعث نظم در کد نویسی میشه چون ، شما فرض کن یک تایع داشته باشی برای انجام کلیه محاسبات ریاضی (calculate) حالا من فقط توی این تایع به توابعی همچون محاسبه توان و فاکتوریل و... نیاز دارم و در هیچ کجای دیگه برنامه نیازی به call کردن تابع فاکتوریل ندارم.به نظر شما اگه تابع فاکتوریل به صورت nested تعریف بشه کدهای من منظم تر یا وقتی که تابع فاکتوریل به صورت سراسری صدا زده بشه؟

توی c ++ که میشه کلاس تعریف کرد وتابع رو private کرد مشکل چیه ؟ ولی توی c که فکر میکنم حق با شما باشه .طبق شرایط مثال شما:متفکر:

alireza_tavakol
دوشنبه 16 شهریور 1388, 02:10 صبح
با تشکر از دوستانی که در بحث شرکت کرده اند. بعضی از دوستان فکر کردن من پرسیدم که آیا امکان تعریف توابع تودرتو در زبان C وجود داره یا نه ، بعد زحمت کشیدن و جواب دادن که امکان تعریف توابع تودرتو وجود نداره ؛ در حالی که اصلا سوال من این نبوده
_________________________________________________
من فکر میکنم هنوز سوال من واسه دوستان درست مطرح نشده:عصبانی++:

سوال : روز اولی که کامپایلر نویس ( یا طراح یا معمار ) زبان C ، پیاده سازی را شروع کرده ، در ذهن خود به چه چیزی فکر کرده و امکان تعریف توابع تودرتو را در نظر نگرفته؟

در نظر داشته باشین که حتی در زبان VC#‎‎‎‎.Net 2008 نیز امکان تعریف متدهای* تودرتو وجود ندارد . وقتی علت رو جویا می شیم چماغ معماری زبان C رو محکم تو سرمون خورد میکنن:گریه: و میگن چون زبان C امکان تعریف توابع تودرتو را نداشته است پس C# هم چون نواده C است و باید تابع معماری C باشه !

*پاورقی: متد :( همان توابع زبان C که در بدنه کلاس ها تعریف میشوند و به منظور رفتار های یک شی در نظر گرفته می شوند )