[関数と手続き]
◆関数と引数・戻り値
◎関数定義
function 関数名(仮引数1: 変数型 ;仮引数2 : 変数型): 戻り値の変数型;
begin
実行文1;
Result:=戻り値;
end;
◎関数呼び出し
変数:=関数名(引数1,引数2);
・仮引数が複数ある場合は、セミコロン(;)で区切って記述します
・関数を呼び出して複数の引き数を記述する場合はカンマ(,)で区切ります
・仮引数がない場合は、関数定義、関数呼び出しともに()を省略します
・戻り値は Result変数 に設定します
・関数定義は、その関数が呼ばれる前に定義するか、fowardキーワードを付けてプロトタイプ宣言します
・プロトタイプ宣言では、forwardキーワードを付けた上で、引数や戻り値を宣言します。そのかわり、関数宣言では、引数や戻り値の宣言を省略できます
例1)
program tips0044_1;
{$APPLTYPE CONSOLE}
var
a,b,c:integer;
function sumFunc(x:integer; y:integer):integer;
begin
Result:= x + y;
end;
begin
a:=1000;
b:=500;
c:=sumFunc(a,b);
WriteLn(a,'+',b,'=',c);
end.
例2)
function sumFunc(x:integer; y:integer):integer; forward;
procudure TForm1.FormCreate(Sender: TObject);
var
a,b,c:integer;
begin
a:=1000; b:=500;
c:=sumFunc(a,b);
ShowMessage(IntToStr(a) + '+' + IntToStr(b) + '=' +IntToStr(c));
end;
function sumFunc
begin
Result:= x + y;
end;
◆手続きと引数
◎手続き定義
procedure 手続き名(仮引数1: 変数型 ;仮引数2 : 変数型);
begin
実行文1;
end;
◎手続き呼び出し
手続き名(引数1,引数2);
・仮引数が複数ある場合は、セミコロン(;)で区切って記述します
・関数を呼び出して複数の引き数を記述する場合はカンマ(,)で区切ります
・仮引数がない場合は、関数定義、関数呼び出しともに()を省略します
・手続き定義は、その手続きが呼ばれる前に定義するか、fowardキーワードを付けてプロトタイプ宣言します
・プロトタイプ宣言では、forwardキーワードを付けた上で、引数や戻り値を宣言します。そのかわり、手続き宣言では、引数や戻り値の宣言を省略できます
例1)
program tips0044_2;
{$APPLTYPE CONSOLE}
procedure msgProc(str:string);
begin
ShowMessage(str + ' Hello World');
end;
begin
msgProc('Delphi');
end.
例2)
procedure msgProc(str);forward;
procedure TForm1.FormCreate(Sender:TObject);
var
s:string;
begin
msgProc(s);
end.
procedure msgProc;
begin
ShowMessage(str + ' Hello World');
end;
◆関数、手続きからの脱出
関数や手続きから脱出するには、Exit手続きを使用します
◆値渡しと参照渡し
引数の記述で、なにも付けないと「値渡し」、varを付けると「参照渡し」、constを付けると「定数渡し」になります
値渡し:変数を変更しても、呼び出し側の値は変わらない
参照渡し:変数を変更すると、呼び出し側の値が変わる
例1)
program tips0044_1;
{$APPLTYPE CONSOLE}
var
a,b,c:integer;
function sumFunc(var x:integer; var y:integer):integer;
begin
x:=1; y:=1;
Result:= x + y;
end;
begin
a:=1000;
b:=500;
c:=sumFunc(a,b);
WriteLn(a,'+',b,'=',c);
end.
◆再帰的呼び出し
ある関数や手続きから、自分自身を呼び出すことを、再帰的呼び出しといいます。
◆関数や手続きのスコープ
関数・手続きを他のユニットから参照可能にする
(方法1)
・interface部に関数のプロトタイプを記述する
・呼び出し側は、Implementation部のusesに呼び出したい関数が定義されたユニットを指定する
(方法2)フォームのメンバ関数にする方法
・Interface部のPublicに関数のプロトタイプを記述する
・Implementation部で関数本体を定義する
・呼び出し側で、「フォームクラス名.関数名」(TForm2.myFunc)で呼び出します
プライベート関数 | Implementation部 |
グローバル関数 | Interface部 |
メンバ関数 | フォーム名を付加 |
◆手続き型へのポインタ
関数名を変数に代入したり、関数名を別の関数に渡すことも可能です
◆関数のオーバーロード
同名の関数・手続きを複数定義することができます。これをオーバーロードといいます
但し、引数の型、または、引数の個数が異なっていることが条件で、コンパイラは関数・手続きが呼び出されたときに、引数の型・個数を確認して、どの関数を呼び出すか決定します。
Copyright c 2009, ohishi,All rights reserved.