function Externalintegrand(data: Pointer; x: Double): Double; cdecl;begin Result := GetAnonMethod(data)(x);end;....var Integrand: TFunc<Double,Double>; Integral: Double;....Integral := CalcIntegral(Externalintegrand,Casttopointer(Integrand),xlow,xhigh);
这里CalcIntegral是调用Externalintegrand的外部函数.这反过来采用传递的无类型指针,检索匿名方法,并让它来完成这项工作.
问题是我无法干净地编写Casttopointer.如果我做:
Pointer(Integrand)
编译器对象:
[dcc32 Error]: E2035 Not enough actual parameters
很明显,编译器正在尝试调用匿名方法.
我能够做到这一点:
function Casttopointer(const F: TFunc<Double,Double>): Pointer; inline;begin Move(F,Result,SizeOf(Result));end;
或这个:
function Casttopointer(const F: TFunc<Double,Double>): Pointer; inline;var P: Pointer absolute F;begin Result := P;end;
但是,当我将动态数组转换为指向数组的指针时,我无法使用简单的转换,这似乎有点令人讨厌.
我意识到我可以传递持有匿名方法的变量的地址.像这样:
function Externalintegrand(data: Pointer; x: Double): Double; cdecl;var F: ^TFunc<Double,Double>;begin F := data; Result := F^(x);end;....Integral := CalcIntegral(Externalintegrand,@Integrand,xhigh);
但是,引入另一个间接层似乎有点奇怪.
有没有人知道将匿名方法变量直接转换为指针的方法?我确实意识到这样的欺骗行为是值得怀疑的,但至少出于好奇,我想知道是否可以做到.
解决方法 你应该能够做Pointer((@ Integrand)^)所以你的电话会是:Integral := CalcIntegral(Externalintegrand,Pointer((@Integrand)^),xhigh);
这是一种额外的间接水平,但不是:)
我通过与您的Casttopointer进行比较测试,它的工作原理如下:
program Project8;{$APPTYPE CONSolE}{$R *.res}{$T+}uses System.SysUtils; function Casttopointer(const F: TFunc<Double,SizeOf(Result));end;var Integrand: TFunc<Double,Double>; Mypointer1: Pointer; Mypointer2: Pointer;begin Integrand := function(x : double) : double begin result := 2 * x; end; Mypointer1 := Pointer((@Integrand)^); Mypointer2 := Casttopointer(Integrand); Assert(Mypointer1 = Mypointer2,'Pointers don''t match!');end.总结
以上是内存溢出为你收集整理的delphi – 有没有一种方法可以将匿名方法强制转换为指针?全部内容,希望文章能够帮你解决delphi – 有没有一种方法可以将匿名方法强制转换为指针?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)