تالار گفتمان مانشت

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

شما باید توجه کنی که اینجا تنها آرایه 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 رو به صورت سراسری تعریف کنیم.
(20 آذر 1391 10:41 ق.ظ)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 رو به صورت سراسری تعریف کنیم.

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

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.
(20 آذر 1391 10:41 ق.ظ)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 رو به صورت سراسری تعریف کنیم.
ببخشید آخرش اگه فراخوانی با نام بشه جوابش چی میشه؟
نه تاثیر نمیذاره چون ورودی B[0 جایگزینه میشه نه b[I
لینک مرجع