关于过程类型的疑惑 ( 积分: 20 )

  • 主题发起人 主题发起人 wuqvei
  • 开始时间 开始时间
W

wuqvei

Unregistered / Unconfirmed
GUEST, unregistred user!
Type
SwapProc=Procedure(Var X,Y:Integer);
MathFunc=Function(X:Double):Double;

{以上是类型声明部分}

Var
P:SwapProc;
F:MathFunc;

{以上把P说明为SwapProc 类型的变量,把F说明为MathFunc类型的变量}

Procedure Swap(var A,B:integer);
Var
Temp:Integer;
Begin
Temp:=A;
A:=B;
B:=Temp;
End;

Function Tan(Angle:Double);
Begin
Tan:=Sin(Angle)/Cos(Angle);
End;

{以上定义了一个过程和一个函数}

{以上把Swap过程赋给P变量,把Tan函数赋给F变量}
P:=Swap;
F:=Tan;

P(I,J)
{相当于调用Swap(I,J)}
X:=F(X)
{相当于X:=tan(X)}

1 既然过程变量是指针类型,为什么P:=Swan 和F:=Tan 不应该时P := @Swan 和F := @Tan,就是所取函数的地址
2 另外@P操作是返回无类型指针(Delphi操作手册里讲到)吗,而且返回的这个指针是指向Swap的 也就是 @P = @Swap 这种说法对吗? 而不是返回P变量的地址吗?
谢谢!
 
Type
SwapProc=Procedure(Var X,Y:Integer);
MathFunc=Function(X:Double):Double;

{以上是类型声明部分}

Var
P:SwapProc;
F:MathFunc;

{以上把P说明为SwapProc 类型的变量,把F说明为MathFunc类型的变量}

Procedure Swap(var A,B:integer);
Var
Temp:Integer;
Begin
Temp:=A;
A:=B;
B:=Temp;
End;

Function Tan(Angle:Double);
Begin
Tan:=Sin(Angle)/Cos(Angle);
End;

{以上定义了一个过程和一个函数}

{以上把Swap过程赋给P变量,把Tan函数赋给F变量}
P:=Swap;
F:=Tan;

P(I,J)
{相当于调用Swap(I,J)}
X:=F(X)
{相当于X:=tan(X)}

1 既然过程变量是指针类型,为什么P:=Swan 和F:=Tan 不应该时P := @Swan 和F := @Tan,就是所取函数的地址
2 另外@P操作是返回无类型指针(Delphi操作手册里讲到)吗,而且返回的这个指针是指向Swap的 也就是 @P = @Swap 这种说法对吗? 而不是返回P变量的地址吗?
谢谢!
 
要把函数名理解成指针
 
你可以把函数名其实就象一个指针,保存的地址其实就是函数的入口,指针赋值给指针当然不用@啦,@P是获得P所在内存的地址,而并不是改地址的内容(改地址的内容指向函数的入口)
 
,@P是获得P所在内存的地址,而并不是改地址的内容(改地址的内容指向函数的入口)
这句好像错了 delphi手册说@@p才是P所在内存的地址 @p是改地址的内容
 
//1 既然过程变量是指针类型,为什么P:=Swan 和F:=Tan 不应该时P := @Swan 和
//F := @Tan,就是所取函数的地址
从直观上说,应该是 P := @Swan,不过,Delphi 的编译器为我们提供了一些便利,如果发现赋值号(注意,是赋值号,不是等号)左边的变量是函数指针的类型,那么 P := Swan 就相当于 P := @Swan。


//2 另外@P操作是返回无类型指针(Delphi操作手册里讲到)吗,而且返回的这个指针是
//指向Swap的 也就是 @P = @Swap 这种说法对吗? 而不是返回P变量的地址吗?
是的,另外,if @P = @Swap 是比较的 P 指向的函数的地址与 Swap 函数的地址,要取得函数返回值的地址,需要用 @@P 或 @@Swap,这些在手册里也有提到的 :)
 
SwapProc=Procedure(Var X,Y:Integer);
MathFunc=Function(X:Double):Double;
改一下就好了
SwapProc=Procedure(Var X,Y:Integer) of Object;
MathFunc=Function(X:Double):Double Of Object;
 
后退
顶部