📄 main.pas
字号:
{
本例用来说明函数的三类参数传递
指向byte的指针pa,pb,px,py 只是为了加深理解,对运行结果无影响;
程序测试中,应Watch这些指针的值,以及它们所指向的地址中的内容(例如 pa^ )
本例用来说明数组作为参数,作为返回值
}
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Math;
//注意: 此处 Math是人工写上的,后面用到的函数sqrt定义于 Math.pas中
type
TfmMain = class(TForm)
btnXY: TButton;
Lb00: TLabel;
btnArr: TButton;
edt1: TEdit;
edt2: TEdit;
btnArr2: TButton;
btnZ: TButton;
procedure btnXYClick(Sender: TObject);
procedure btnArrClick(Sender: TObject);
procedure btnArr2Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var
fmMain: TfmMain;
pa,pb: ^byte;
px,py: ^byte;
type
TArr= array of word;
procedure xxx(var a: byte; b: byte);
procedure yyy(m,n: single; const r: byte);
function zzz(u,v: word; w: byte=2): word;
function Arr_1( ar: array of word): integer;
function Arr_2(i0,i9: Byte): TArr;
////////////////////////////////////////////////////////////////////////////////
implementation
{$R *.dfm}
procedure xxx(var a: byte; b: byte); // a 是变参, b是值参
begin
pa:=@a; pb:=@b;
b:=b+3;
a:=a*10 +b;
end;
procedure yyy(m,n: single; const r: byte);
var
t: single;
begin
// 此时, m,n,r 的值是 ?
m:=m+1;
n:=n+2;
// r:=r+3; 错句 为什么?
t:=m+n+r;
fmMain.Lb00.Caption:=FormatFloat('#.###',t);
end;
function zzz(u,v: word; w: byte=2): word; // 参数缺省值
begin
Result:=u+v+w;
end;
procedure TfmMain.btnXYClick(Sender: TObject);
var
x,y: byte;
tmp: word;
begin
px:=@x; py:=@y;
x:=2; y:=5;
// xxx(x+1,y); 错句 为什么?
xxx(x,y);
// 此时, x,y 的值是 ?
yyy( sqrt(x)+2, 100, x*y);
// tmp:=zzz(10,20,1); // 用完整参数
tmp:=zzz(10,20); // 用缺省参数
fmMain.Lb00.Caption:=IntToStr(tmp);
end;
procedure TfmMain.btnArrClick(Sender: TObject);
var
a: array of word;
i: byte;
i0,i9: byte;
begin
i0:=StrToInt(edt1.Text);
i9:=StrToInt(edt2.Text);
SetLength(a,i9-i0+1);
for i:=i0 to i9 do
a[i-i0]:=i;
Lb00.Caption:=IntToStr(Arr_1(a) );
end;
function Arr_1( ar: array of word): integer; // 数组求和
var
i: byte;
sum: integer;
begin
sum:=0;
for i:=0 to High(ar) do
begin
sum:=sum+ar[i];
end;
Result:=sum;
end;
procedure TfmMain.btnArr2Click(Sender: TObject);
var
a: TArr;
i: byte;
ti0,ti9: byte;
begin
ti0:=StrToInt(edt1.Text);
ti9:=StrToInt(edt2.Text);
// SetLength(a,ti9-ti0+1); // 此句不需要,理由是???
a:=Arr_2(ti0,ti9);
Lb00.Caption:=IntToStr(Arr_1(a) );
end;
function Arr_2(i0,i9: Byte): TArr; // 生成数组
var
i: byte;
tmpArr: TArr;
begin
SetLength(tmpArr, i9-i0+1 );
for i:=i0 to i9 do
tmpArr[i-i0]:=i;
Result:=tmpArr;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -