ورود

View Full Version : سوال: فرق پارامترهای var و out دقیقاً چیست؟



BORHAN TEC
پنج شنبه 04 شهریور 1389, 13:12 عصر
سلام.

فکر می کنم سوال به قدر کافی واضح باشه.

با تشکر. :قلب:

SAASTN
پنج شنبه 04 شهریور 1389, 15:16 عصر
پارامترهای var هم ورودی و هم خروجی هستند، یعنی مقادیری که به تابع پاس داده می شن داخل تابع معتبرن و در مقابل تغییراتی که روی این مقادیر صورت می گیریه به محل فراخوانی هم ارجاع می شه (تا اینجا که شد همون Call By Reference معمولی) اما پارامترهای out فقط خروجی هستند یعنی مقادیر متغیرهایی که به عنوان پارامتر ارسال شدن به تابع انتقال پیدا نمی کنه و مقادیر این پارامترها در ابتدای تابع معتبر نیست و باید داخل تابع مقداردهی بشن.

BORHAN TEC
پنج شنبه 04 شهریور 1389, 18:47 عصر
اما پارامترهای out فقط خروجی هستند یعنی مقادیر متغیرهایی که به عنوان پارامتر ارسال شدن به تابع انتقال پیدا نمی کنه و مقادیر این پارامترها در ابتدای تابع معتبر نیست و باید داخل تابع مقداردهی بشن.
میشه واضح تر توضیح بدین. مقادیر این پارامترها در ابتدای تابع معتبر نیست یعنی چی؟

Felony
پنج شنبه 04 شهریور 1389, 21:24 عصر
توابع زیر رو در نظر بگیرید :
function TestByOut(Out A: String): String;
begin
Result:= A;
end;

function TestByVar(Var A: String): String;
begin
Result:= A;
end;

حالا کد زیر رو تو یه دکمه بنویسید :
var
Temp_Out, Temp_Var: String;
begin
Temp_Out:= 'Out temp';
Temp_Var:= 'Var temp';
ShowMessage(TestByOut(Temp_Out));
ShowMessage(TestByVar(Temp_Var));
end;

فکر میکنم تفاوتش الان براتون کاملا روشن شده باشه ، پارامترهایی که به صورت Var و Out ارجاع داده میشن هر دو byRef هستند ، یعنی به متغییر پاس داده شده به عنوان پارامتر ؛ ارجاع دارند ولی در ارجاع با Out مقدار اولیه اون متغیر مهم نیست چی باشه ، در داخل تابع وقتی پارامتر به صورت Out ارجاع داده بشه مقدار اولیش در نظر گرفته نمیشه ( مثل نمونه کد بالا ) پس فقط میتونید ازشون به عنوان محلی برای Result تابعتون استفاده کنید ، ولی پارامترهایی که به صورت Var ارجاع داده میشن مقدار اولیشون در زمان ارجاع به تابع معتبر هست و میتونید با مقدارشون در تابع محاسباتی انجام بدید و در آخر هم به عنوان Result تابع یا ... ازشون استفاده کنید .

vcldeveloper
جمعه 05 شهریور 1389, 03:27 صبح
Different Parameter Modifiers in Delphi (http://vcldeveloper.com/articles/different-function-parameter-modifiers-in-delphi/)

h4sh3m
جمعه 05 شهریور 1389, 03:38 صبح
عزيز براي اينكه فرقشونو بدوني بايد بگم كه به عنوان مثال شما يك پارامتر براي Var ارسال كنيد بايد اول اونو مقدار دهي كنيد اما براي OUT وقتي شما يك پارامتر رو ارسال مي كنيد تابع مورد نظر بعد از انجام محاسبات اونو براي شما مقداردهي مي كنه .
دقيقا همون كاري كه قفل سخت افزاري نگهبان ميكنه و با نوشتن يه فايل 28 كيلو بايتي به راحتي كرك شد.