delphi – 有没有一种方法可以将匿名方法强制转换为指针?

delphi – 有没有一种方法可以将匿名方法强制转换为指针?,第1张

概述我正在将匿名方法传递给外部函数.匿名方法是一个被积函数,外部函数将计算一个定积分.因为集成功能是外部的,所以它不了解匿名方法.所以我必须将匿名方法作为无类型指针传递.为了更清楚,它运行如下: function ExternalIntegrand(data: Pointer; x: Double): Double; cdecl;begin Result := GetAnonMethod(dat 我正在将匿名方法传递给外部函数.匿名方法是一个被积函数,外部函数将计算一个定积分.因为集成功能是外部的,所以它不了解匿名方法.所以我必须将匿名方法作为无类型指针传递.为了更清楚,它运行如下:

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 – 有没有一种方法可以将匿名方法强制转换为指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248969.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存