PDA

View Full Version : سوال: یک تابع با دو خروجی



Mask
یک شنبه 18 دی 1390, 20:40 عصر
با سلام.
میخاستم بدونم آیا میشه تابعی نوشت که 2 خروجی یا بیشتر داشته باشه.
ممنون.

MohsenB
یک شنبه 18 دی 1390, 21:00 عصر
سلام


تابع فقط یه خروجی برمیگردونه ولی میتونید با کارهایی مثل "خاص بودن نوع برگشتی( مثلا نوع برگشتی یک ساختار باشد)" و یا "فراخوانی با ارجاع" تابع چندین برگشتی داشته باشید


موفق باشید

یوسف زالی
یک شنبه 18 دی 1390, 22:16 عصر
سلام.
یه کار دیگه هم می شه کرد.
این که به جای استفاده از تابع از پروسیجری استفاده کنی که متغیرهاش به روش آدرس پاس می شن. حالا یا آبجکت هستند یا اینکه با کلمه کلیدی var می فرستیم.
procedure P(var a:integer; var s: string); begin a := 10; s := 'salam'; end
.
.
P(x, y); // test

البته در این روش نمی شه به اون داده های مستقیم مثل عدد 3 پاس داد. باید حتما متغیر باشه.
برادر Gold کاری که می خوای انجام بدی چی هست؟

mostafa69d
یک شنبه 18 دی 1390, 22:17 عصر
با سلام،
همون طور که دوستمون فرمودن و معمول ترین کار هست باید از متغیر ها ref یا out (تقریبا یکسان اند!) استفاده کنید.
مثال:

public void clac(ref int a,ref int b)
{
a=3;
b=4;
}
//call
int x,y;
calc(ref x,ref y);
//result is x=3,y=4

MohsenB
یک شنبه 18 دی 1390, 22:25 عصر
سلام.
یه کار دیگه هم می شه کرد.
این که به جای استفاده از تابع از پروسیجری استفاده کنی که متغیرهاش به روش آدرس پاس می شن. حالا یا آبجکت هستند یا اینکه با کلمه کلیدی var می فرستیم.
procedure P(var a:integer; var s: string); begin a := 10; s := 'salam'; end
.
.
P(x, y); // test

البته در این روش نمی شه به اون داده های مستقیم مثل عدد 3 پاس داد. باید حتما متغیر باشه.
برادر Gold کاری که می خوای انجام بدی چی هست؟


با سلام،
همون طور که دوستمون فرمودن و معمول ترین کار هست باید از متغیر ها ref یا out (تقریبا یکسان اند!) استفاده کنید.
مثال:

public void clac(ref int a,ref int b)
{
a=3;
b=4;
}
//call
int x,y;
calc(ref x,ref y);
//result is x=3,y=4



سلام


تابع فقط یه خروجی برمیگردونه ولی میتونید با کارهایی مثل "خاص بودن نوع برگشتی( مثلا نوع برگشتی یک ساختار باشد)" و یا "فراخوانی با ارجاع" تابع چندین برگشتی داشته باشید


موفق باشید


من که فرق اینا رو نفهمیدم

Mahmood_M
یک شنبه 18 دی 1390, 23:23 عصر
اگر خروجی ها از یک نوع باشند می تونید از آرایه استفاده کنید ، به عنوان مثال :

type
TMyArray = Array[1..2] of Integer;

...

implementation

function Calc(X, Y : Integer) : TMyArray;
var
Sum, Sub : Integer;
begin
Sum := X + Y;
Sub := X - Y;
Result[1] := Sum;
Result[2] := Sub;
end;

...

var
M : TMyArray;
begin
M := Calc(3, 2);
// M[1] = 5;
// M[2] = 1;
end;


اما اگر نوع خروجی ها یکسان نیست ، میتونید از روشهای دیگه مثل " رکورد " استفاده کنید ، مثال :

type
TMyRecord = Record
MyStr : String;
MyInt : Integer;
end;

...

implementation

function MyFunc(Name, Family : String) : TMyRecord;
var
S : String;
L : Integer;
begin
S := Name + ' ' + Family;
L := Length(S);
Result.MyStr := S;
Result.MyInt := L;
end;

...

var
R : TMyRecord;
begin
R := MyFunc('Mahmood', 'Mehri');
// R.MyStr = Mahmood Mehri
// R.MyInt = 13
end;


راه ساده تر اینه که به جای تابع از Procedure استفاده کنید و در پایان عملیات ، مقادیر مورد نظر رو درون چند متغیر عمومی قرار بدید
راه های زیادی برای حل این مسئه وجود داره

موفق باشید ...

arkia
دوشنبه 19 دی 1390, 01:04 صبح
اینم میشه اما آرایه و رکورد آقا محمود قشنگ تره



function FullName(FirstName, LastName : String) : String;
var SpecialSeperator:string;
begin
Result:=FirstName+ SpecialSeperator+ LastName;
end;

function GetFirstName( FullName('FirstName', 'LastName') ) : String;
var SpecialSeperator:string;
begin
// اینجا هم یه کدی مینویسی که هر کاراکتری قبل از رشته جدا کننده باشه رو بازگشت بده
end;