۰
subtitle
ارسال: #۱
  
روش های فراخوانی توابع by name/value/ref
۱
ارسال: #۲
  
انواع ارسال پارامتر به توابع
ALGOL ، فراخوانی با نام(NAME)
==
FORTRAN ،با ارجاع (REF)
==
C ، با مقدار (Val)
==
در CPP و PASCAL فراخوانی با ByVal+ByRef
==
در CPP اگر قبل از نام پارامتر & بگذاریم ، فراخوانی با آدرس(ارجاع) انجام می شود.
==
در الگول_w فراخوانی با مقدار_نتیجه معرفی شده است.
==
منبع :جزوه ی قبایی
۱
ارسال: #۳
  
روش های فراخوانی توابع by name/value/ref
در عمل اینطور نیست
در زبان C شما نمیتونید با &, call by ref کنید چون اصلا این کاربرد & که به عنوان ref به یه متغیر هست تو C++ اضافه شد. وقتی ما از & در توابع استفاده می کنیم، عملا داریم از این ویژگی که مربوط به C++ (و نه C) هست استفاده می کنیم.
اینکه شما میگید تو عمل فرقی نداره چون ما از کامپایلر های C++ استفاده می کنیم که تمامی C رو هم ساپورت میکنن.
در زبان C شما نمیتونید با &, call by ref کنید چون اصلا این کاربرد & که به عنوان ref به یه متغیر هست تو C++ اضافه شد. وقتی ما از & در توابع استفاده می کنیم، عملا داریم از این ویژگی که مربوط به C++ (و نه C) هست استفاده می کنیم.
اینکه شما میگید تو عمل فرقی نداره چون ما از کامپایلر های C++ استفاده می کنیم که تمامی C رو هم ساپورت میکنن.
۰
ارسال: #۴
  
روش های فراخوانی توابع by name/value/ref
تا جایی که من میدانم در عمل c و cpp مثل هم هستند!
۰
ارسال: #۵
  
روش های فراخوانی توابع by name/value/ref
پس تابع scanf زبان c چگونه کار می کند؟
۰
ارسال: #۶
  
روش های فراخوانی توابع by name/value/ref
& برای آدرس تو C بوده ولی شما این گد رو در نظر بگیرید:
int x;
int& foo = x;
foo = 56;
این کاربرد برای & تو سی++ اضافه شد. شما وقتی دارید یه تابع رو call by ref میکنید دارید از این کاربرد & استفاده می کنید. شما تو تعریف تابع int& foo رو مینویسید و تو صدا زدن عملا دارید = x رو مینویسید. اینه که هر دو متغیر به یه مکان از حافظه اشاره میکنن.
به اینجا یه نگاهی بندازید:
مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمیباشید. جهت مشاهده پیوندها ثبت نام کنید.
int x;
int& foo = x;
foo = 56;
این کاربرد برای & تو سی++ اضافه شد. شما وقتی دارید یه تابع رو call by ref میکنید دارید از این کاربرد & استفاده می کنید. شما تو تعریف تابع int& foo رو مینویسید و تو صدا زدن عملا دارید = x رو مینویسید. اینه که هر دو متغیر به یه مکان از حافظه اشاره میکنن.
به اینجا یه نگاهی بندازید:
مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمیباشید. جهت مشاهده پیوندها ثبت نام کنید.
۰
ارسال: #۷
  
روش های فراخوانی توابع by name/value/ref
فکر کنم اینجا موضوع بحث در مورد فراخوانی هایی توابع هست.
البته با اشاره گر ها و یونین ها هم می توان چنین چیزی در زبان C پیاده ساری کرد
به خط های اول نوشته دقت کن....
C++ references allow you to create a second name for the a variable that you can use to read or modify the original data stored in that variable. While this may not sound appealing at first,
خوب این بیشتر برای دسترسی به یک متغییر با ۲ نام هست و به قول نویسنده اول کاربردی به نظر نمی آید و ....
فکر نمی کنم به موضوع تایپیک هم این رابطه داشته باشد.
به جز اینکه چون عنوانش C++ References هست ممکن است در لحظه اول اشتباه شود که در مورد موضوع تایپیک کار برد دارد!!!!
البته با اشاره گر ها و یونین ها هم می توان چنین چیزی در زبان C پیاده ساری کرد
به خط های اول نوشته دقت کن....
C++ references allow you to create a second name for the a variable that you can use to read or modify the original data stored in that variable. While this may not sound appealing at first,
خوب این بیشتر برای دسترسی به یک متغییر با ۲ نام هست و به قول نویسنده اول کاربردی به نظر نمی آید و ....
فکر نمی کنم به موضوع تایپیک هم این رابطه داشته باشد.
به جز اینکه چون عنوانش C++ References هست ممکن است در لحظه اول اشتباه شود که در مورد موضوع تایپیک کار برد دارد!!!!
۰
ارسال: #۸
  
روش های فراخوانی توابع by name/value/ref
سلام
ببخشید احساس می کنم قسمت خروجی جوابتون اشتباهه
ببخشید احساس می کنم قسمت خروجی جوابتون اشتباهه
۰
-۲
ارسال: #۱۰
  
فراخوانی با نام _ call by name
مثالی از فراخوانی با نام/اسم (call by name)
نکته : این روش همان روش فراخوانی با ارجاع(آدرس)(by reference) است. در فراخوانی با ارجاع(آدرس)،مقدار پارامتر ها از داخل تابع دستکاری نمی شوند ولی در فراخوانی با نام ابتدا نام پارامترهای ورودی به جای متغیرهای تابع جایگزین شده و سپس مقداردهی و دستکاری می شوند.
=
تست :
در زبان فرضی زیر اگر فراخوانی با نام (call by name) باشد خروجی را بیابید
=
تست :
در زبان فرضی زیر اگر فراخوانی با نام (call by name) باشد خروجی را بیابید.
void function Exchange(x,y:integer);
BEGIN
temp=x
x=y
y=temp
END;
i=4;A[1]=8;A[2]=6;A[3]=4;A[4]=2;
Exchange(i,A[i]);
print(i,A[i],A[2],A[3],A[4]);
خروجی از چپ به راست:
۲,۸,۴,۴,۲
==
مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمیباشید. جهت مشاهده پیوندها ثبت نام کنید.
==
منبع :
گسترش علوم پایه
مقسمی
طراحی و پیاده سازی زبان های برنامه سازی(چاپ مهر ۸۷)(ص۹۳)
==
ویرایش : ۶۸ تا بازدید داریم حتی یه تشکر هم نزدین.خیلی با انصافین
نکته : این روش همان روش فراخوانی با ارجاع(آدرس)(by reference) است. در فراخوانی با ارجاع(آدرس)،مقدار پارامتر ها از داخل تابع دستکاری نمی شوند ولی در فراخوانی با نام ابتدا نام پارامترهای ورودی به جای متغیرهای تابع جایگزین شده و سپس مقداردهی و دستکاری می شوند.
=
تست :
در زبان فرضی زیر اگر فراخوانی با نام (call by name) باشد خروجی را بیابید
=
تست :
در زبان فرضی زیر اگر فراخوانی با نام (call by name) باشد خروجی را بیابید.
void function Exchange(x,y:integer);
BEGIN
temp=x
x=y
y=temp
END;
i=4;A[1]=8;A[2]=6;A[3]=4;A[4]=2;
Exchange(i,A[i]);
print(i,A[i],A[2],A[3],A[4]);
خروجی از چپ به راست:
۲,۸,۴,۴,۲
==
مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمیباشید. جهت مشاهده پیوندها ثبت نام کنید.
==
منبع :
گسترش علوم پایه
مقسمی
طراحی و پیاده سازی زبان های برنامه سازی(چاپ مهر ۸۷)(ص۹۳)
==
ویرایش : ۶۸ تا بازدید داریم حتی یه تشکر هم نزدین.خیلی با انصافین
Can I see some ID?
Feeling left out?
نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. رمزت رو فراموش کردی؟ اینجا به یادت میاریم! close