関数で値を一つだけ戻すのは、
Function DH(d: String): String;
var
modosuatai: String;
begin
処理
Result:= modosuatai;
end;
でいいかと思いますが、値を二つ戻すにはどのように書けばいいのでしょうか?
また受け取る側は、
modorichi:=DH('abc');戻り値が一つの場合にはこれでよいと思いますが、二つ受け取るにはどのように書けたよいのでしょうか?
よろしくお願いします。
いろんな方法があります。
レコード型にして一つにまとめて返す。
out パラメータを使う。
var パラメータを使う。
のがすぐに思い浮かびます。
すみません。えーとさん。
うまくいかないのです。
できれば具体例を書いていただけませんでしょうか?
>うまくいかないのです。
実際に、書いたコードを示せば、
どこが悪いのか、(他の方からも)回答があるかもしれませんよ。
軽く説明します。
レコード
■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;
こんなところで、いいでしょうか。
こんな感じで分りますでしょうか?
よろしくお願いします。
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;
foさんが詳しく書いていますよ。
foさんありがとうございました。
よく分りました。
ツイート | ![]() |