関数で値を二つ戻すには?

解決


あれ  2006-03-29 01:33:02  No: 20714

関数で値を一つだけ戻すのは、
Function DH(d: String): String;  
var
modosuatai: String;
begin
処理    
Result:= modosuatai; 
end;
でいいかと思いますが、値を二つ戻すにはどのように書けばいいのでしょうか?
また受け取る側は、
modorichi:=DH('abc');戻り値が一つの場合にはこれでよいと思いますが、二つ受け取るにはどのように書けたよいのでしょうか?
よろしくお願いします。


えーと  2006-03-29 01:45:51  No: 20715

いろんな方法があります。

レコード型にして一つにまとめて返す。
out パラメータを使う。
var パラメータを使う。

のがすぐに思い浮かびます。


あれ  2006-04-24 23:37:05  No: 20716

すみません。えーとさん。
うまくいかないのです。
できれば具体例を書いていただけませんでしょうか?


igy  2006-04-24 23:50:00  No: 20717

>うまくいかないのです。

実際に、書いたコードを示せば、
どこが悪いのか、(他の方からも)回答があるかもしれませんよ。


fo  2006-04-25 00:22:39  No: 20718

軽く説明します。
レコード
■record .. 古くからPASCALにある型で、Cの構造体のようなもの。

interface部で
  type
    TMyRecord = record
      a1: integer;
      a2: integer;
    end

と定義しておけば、

  TForm1 = class
  省略
   function MyFunction: TMyRecord;
  end;

implementation部
function TForm1.MyFunction: TMyRecord;
begin
  Result.a1:=0;
  Result.a2:=1;
end;

使う時
var
  MyRec: TMyRecord;
begin
  MyRec:=MyFunction;
  ShowMessage( IntToStr(MyRec.a1));
  ShowMessage( IntToStr(MyRec.a2));

あるいは
  ShowMessage( IntToStr( MyFunction.a1));
  ShowMessage( IntToStr( MyFunction.a2));

ただし、後者の場合、関数が2回呼ばれます。
ので、通常レコードは、値をコピーして操作したほうが良いでしょう。

■var
下記のようにパラメータに var をつけると、
関数の呼び出しもとで、値を再取得できるようになります。
procedure MyProcedure( var a1,a2: integer);
begin
  //a1,a2の値に応じて a1,a2 を再設定できます。
  if a1=0 then a1:=1;
  if a2=1 then a2:=2;
end;

var
  a,b: integer;
begin
  a:=0;
  b:=1; //a,b の値は関数内部からも参照できます。
  MyFunction(a,b);
  //この位置で MyFunctionが操作した a,b の値が取得できます。
end;

■out
outは、varのように値を返せますが、呼び出し時に渡した値が
関数内部で読めることが保証されません。

procedure MyProcedure( out a1,a2:integer);
begin
  // a1の値は不定です。
  if a1=1 then
  begin
    //ので、このような処理は書いても動作が保証されません。
    a1:=2;
  end;
end;

var
  a:integer;
begin
   a:=1; //この指定は無効
   MyProcedure(a);
   //この位置で a の値は取得できます。
end;

こんなところで、いいでしょうか。


あれ  2006-04-25 00:26:32  No: 20719

こんな感じで分りますでしょうか?
よろしくお願いします。

procedure TForm1.Button1Click(Sender: TObject);
var
    a, b, c: Integer;

begin
    a:=2;
    b:=keisan(a);
    //値を一つだけ受け取るのであれば、上記でOKだが、二つ受け取って
    //bとcに代入するにはどのように書けばよいか?

end;

Function keisan(a: Integer): Integer;
begin
   Result:= a+2;
   //ここで値を一つだけ戻すには上記でOKだが、二つ戻すにはどうすればよいか?
   //例えば、a+2の値とa+5の値を戻したい。
end;


HOta  2006-04-25 00:39:25  No: 20720

foさんが詳しく書いていますよ。


あれ  2006-04-25 01:08:19  No: 20721

foさんありがとうございました。
よく分りました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加