ورود

نسخه کامل مشاهده نسخه کامل : فراخوانی با ارجاع



iranch
12-05-2014, 19:46
درود بر همه
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

وقتی با ref صدا میزنیم بهمون خروجی 3 3 3 3 میده و اگر ref رو برداریم خروجی 6 5 4 3 میده
سوال اینجاست که وقتی تابع بازگشتی صدا زده میشه
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و خط
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
فرصت چاپ نداشته خوب خط writeline با مقدار فعلی a میره داخل استک.
مثلا 6 میره داخل استک
سری بعدی مقدار a که 5 باشه میره داخل استک.
اما چطور هست که ref همه مقادیر استک رو عوض میکنه؟ آخه عدد رفته داخل استک و تمام!!

Msba
13-05-2014, 12:04
فرصت چاپ نداشته خوب خط writeline با مقدار فعلی a میره داخل استک.
مثلا 6 میره داخل استک
سری بعدی مقدار a که 5 باشه میره داخل استک.

منظور شما را کامل متوجه نشدم اما می توانم اتفاقاتی را که می افتد توضیح دهم.
خوب در ابتدای شروع کار:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این خط یک متغیر x تعریف می کند، کجا؟ درون استک، چرا؟ چون درون تابع تعریف می شود حتی تابع main . حالا در خط بعد ما این متغیر را به صورت Ref می فرستیم به یک تابع دیگر. ارسال متغیر به وسیله ref متغیر را درون استک کپی نمی کند لذا شما تمام تغییرات را درون همان آدرس استک قبلی خواهید داشت: مثلا اگر Stack Pointer یا همان SP به خانه ی 0 اشاره می کرده ( هر Process یک استک اختصاصی دارد) و در این خانه ی صفر عدد 7 قرار داده باشید. پس از ارسال با Ref به تابع نیز آدرس SP فرستاده می شود اما اگر Ref قرار ندهید این مقدار 7 به آدرس SP+1 کپی می شود لذا تغییرات این بار در آن اتفاق می افتد و در فراخوانی بعدی نیز SP+2 و این است که شما اعداد 3و4و5و6 را می بینید. اما در صورتی که Ref باشد همگی یک خانه را نمایش می دهند و این یعنی همه ی آن ها عدد 3 را نمایش خواهند داد.
چرا تمامی Console.WriteLine ها پشت هم اجرا می شوند، پس از اجرای هر تابع و بازگشت از آن به خط WriteLine می رسد و پس از نمایش نیز به تابع فراخواننده بر می گردد و آن هم یک WriteLine دارد پس مجدد چاپ می شود و این در برنامه ی شما یعنی نمایش همه ی حاصل ها پس از محاسبه ی آخرین مقدار مورد نظر.



اما چطور هست که ref همه مقادیر استک رو عوض میکنه؟ آخه عدد رفته داخل استک و تمام!!

اصلا کارش این است، مقادیر ارسالی بتوانند تغییر کنند.

موفق باشید.