تالار گفتمان مانشت
فراخوانی با نام - نسخه‌ی قابل چاپ

فراخوانی با نام - mahsa.tsi - 20 آذر ۱۳۹۱ ۰۹:۵۸ ق.ظ

سلام
در زیر تابع فراخوانی با نام دارد:
B[0]=2;
B[1]=3
I=0;
f(B[I])//call by name
در تابع f مقدار I تغییر بکنه روی I تاثیر نمیزاره نه؟
و اینکه تنها تغییرات بر روی B[0] صورت میگیره؟درسته؟

RE: فراخوانی با نام - mp1368 - 20 آذر ۱۳۹۱ ۱۰:۴۱ ق.ظ

سلام .

شما باید توجه کنی که اینجا تنها آرایه B رو به صورت "فراخونی با نام" به زیر برنامه میفرستی و داخل زیر برنامه هم شما با یه متغیر مثل x که به جای آرایه میشینه میتونی به آرایه اصلی دسترسی داشه باشی . ولی در مورد متغیر i باید بگیم که این متغیر رو که شما به زیر برنامه نفرستادی چطور تابع F باید بهش دسترسی داشته باشه؟
پس برای رجوع به i داخل زیر برنامه باید حتما اونو به صورت سراسری تعریف کنی. مثال زیر رو ببین :

[tex]Var $ i : integer[/tex]

[tex]function $ f(x:integer):interger;[/tex]
[tex] i=1;[/tex]
[tex] x=1;[/tex]
[tex] i=3;[/tex]
[tex] x=3;[/tex]
[tex] end[/tex]

[tex] begin[/tex]
[tex] B:array[1..10] of integer[/tex]
[tex] i=1;[/tex]
[tex] f(B[i]);[/tex]
[tex] End.[/tex]

توی این مثال ما فقط آرایه B رو به صورت "فراخونی با نام" به زیر برنامه F فرستادیم و متغیر i رو هم برای ارتباط این دو تابع به صورت سراسری تعریف کرده ایم . اگر ما متغیر i رو به صورت سراسری تعریف نمیکردیم قطعا خطا وجود داشت چون داخل تابع F متغیر i تعریف نشده است . پس اونو به صورت سراسری تعریف میکنیم و به دلیل اینکه متغیر سراسری هستش پس داخل تابع F یا هر جای دیگه ای که مقدارش رو تغییر بدیم روش تاثیر میگذاره و مقدارش عوض میشه . یعنی بعد از اجرای این برنامه متغیر i هم مقدارش با ۳ تغییر میکنه فقط به خاطر اینکه به صورت سراسری تعریف شده است.

در واقع اگه بخوایم خیلی خلاصه بگیم متغیر i کلید ارتباط این دو تابع است که میخوان به صورت "فراخوانی با نام" و به کمک آرایه B با هم ارتباط داشته باشن و میدونیم برای ایجاد همچین ارتباطی باید i رو به صورت سراسری تعریف کنیم.

RE: فراخوانی با نام - mahsa.tsi - 27 دى ۱۳۹۱ ۰۹:۳۸ ب.ظ

(۲۰ آذر ۱۳۹۱ ۱۰:۴۱ ق.ظ)mp1368 نوشته شده توسط:  سلام .

شما باید توجه کنی که اینجا تنها آرایه B رو به صورت "فراخونی با نام" به زیر برنامه میفرستی و داخل زیر برنامه هم شما با یه متغیر مثل x که به جای آرایه میشینه میتونی به آرایه اصلی دسترسی داشه باشی . ولی در مورد متغیر i باید بگیم که این متغیر رو که شما به زیر برنامه نفرستادی چطور تابع F باید بهش دسترسی داشته باشه؟
پس برای رجوع به i داخل زیر برنامه باید حتما اونو به صورت سراسری تعریف کنی. مثال زیر رو ببین :

[tex]Var $ i : integer[/tex]

[tex]function $ f(x:integer):interger;[/tex]
[tex] i=1;[/tex]
[tex] x=1;[/tex]
[tex] i=3;[/tex]
[tex] x=3;[/tex]
[tex] end[/tex]

[tex] begin[/tex]
[tex] B:array[1..10] of integer[/tex]
[tex] i=1;[/tex]
[tex] f(B[i]);[/tex]
[tex] End.[/tex]

توی این مثال ما فقط آرایه B رو به صورت "فراخونی با نام" به زیر برنامه F فرستادیم و متغیر i رو هم برای ارتباط این دو تابع به صورت سراسری تعریف کرده ایم . اگر ما متغیر i رو به صورت سراسری تعریف نمیکردیم قطعا خطا وجود داشت چون داخل تابع F متغیر i تعریف نشده است . پس اونو به صورت سراسری تعریف میکنیم و به دلیل اینکه متغیر سراسری هستش پس داخل تابع F یا هر جای دیگه ای که مقدارش رو تغییر بدیم روش تاثیر میگذاره و مقدارش عوض میشه . یعنی بعد از اجرای این برنامه متغیر i هم مقدارش با ۳ تغییر میکنه فقط به خاطر اینکه به صورت سراسری تعریف شده است.

در واقع اگه بخوایم خیلی خلاصه بگیم متغیر i کلید ارتباط این دو تابع است که میخوان به صورت "فراخوانی با نام" و به کمک آرایه B با هم ارتباط داشته باشن و میدونیم برای ایجاد همچین ارتباطی باید i رو به صورت سراسری تعریف کنیم.

ببخشید که خیلی دیر تشکر میکنم توضیحتون خیلی خوب بودممنون

فراخوانی با نام - csharpisatechnology - 28 دى ۱۳۹۱ ۰۳:۳۶ ق.ظ

اولا باید مشخص کنی توی تابع دقیقا چه چیزهایی داریم.
چون ممکنه I متغیری سراسری بیرون تابع باشه.ممکن هست یه I دیگه داخل خودشم تعریف کرده باشیم.
به نظر میاد سراسری هست و توی تابع تعریف نشده.پس اگه از توی تابع بیایم دستکاریش کنیم باید دستکاری اعمال بشه.
ضمنا فراخوانی با نام به جای ورودی تابع شما عبارت [۰]B دقیقا ابتدا جایگزین تمام متغیرهای منتسب میشه. و در نهایت روی خود [۰]B هم تغییرات اعمال میشه(زیرا شبیه فراخوانی ارجاعی هست)
---
مثال اگه میخواید :

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.


فراخوانی با نام - Engineer - 04 بهمن ۱۳۹۱ ۰۵:۳۷ ب.ظ

(۲۰ آذر ۱۳۹۱ ۱۰:۴۱ ق.ظ)mp1368 نوشته شده توسط:  
[tex]Var $ i : integer[/tex]

[tex]function $ f(x:integer):interger;[/tex]
[tex] i=1;[/tex]
[tex] x=1;[/tex]
[tex] i=3;[/tex]
[tex] x=3;[/tex]
[tex] end[/tex]

[tex] begin[/tex]
[tex] B:array[1..10] of integer[/tex]
[tex] i=1;[/tex]
[tex] f(B[i]);[/tex]
[tex] End.[/tex]

توی این مثال ما فقط آرایه B رو به صورت "فراخونی با نام" به زیر برنامه F فرستادیم و متغیر i رو هم برای ارتباط این دو تابع به صورت سراسری تعریف کرده ایم . اگر ما متغیر i رو به صورت سراسری تعریف نمیکردیم قطعا خطا وجود داشت چون داخل تابع F متغیر i تعریف نشده است . پس اونو به صورت سراسری تعریف میکنیم و به دلیل اینکه متغیر سراسری هستش پس داخل تابع F یا هر جای دیگه ای که مقدارش رو تغییر بدیم روش تاثیر میگذاره و مقدارش عوض میشه . یعنی بعد از اجرای این برنامه متغیر i هم مقدارش با ۳ تغییر میکنه فقط به خاطر اینکه به صورت سراسری تعریف شده است.

در واقع اگه بخوایم خیلی خلاصه بگیم متغیر i کلید ارتباط این دو تابع است که میخوان به صورت "فراخوانی با نام" و به کمک آرایه B با هم ارتباط داشته باشن و میدونیم برای ایجاد همچین ارتباطی باید i رو به صورت سراسری تعریف کنیم.
ببخشید آخرش اگه فراخوانی با نام بشه جوابش چی میشه؟

فراخوانی با نام - csharpisatechnology - 15 بهمن ۱۳۹۱ ۰۵:۳۵ ق.ظ

نه تاثیر نمیذاره چون ورودی B[0 جایگزینه میشه نه b[I