gpt4 book ai didi

delphi - 需要有关 JCL TEvaluator 有趣调用的帮助

转载 作者:行者123 更新时间:2023-12-03 15:51:15 26 4
gpt4 key购买 nike

我正在使用 JCL 的表达式评估器 TEvaluator(由 barry kelly 捐赠的奇妙作品)。 (谢谢巴里!)

背景

我使用了 AddFunc 方法。

function MyFunc:double;
begin
// calculations here
Result:=1;
end;

您可以使用 AddFunc 方法使该函数可用:

  AddFunc('MyFunc', MyFunc);

问题来了...

我需要调用对象上的方法而不是独立的例程。

原因是我有一个提供值的对象列表。

假设我们有一个车辆对象列表。每个对象都有一个权重函数。我希望能够在公式中使用每个对象的重量。

一个愚蠢的例子,但很容易解释:

type
TVehicle=class
private
public
function Weight:double;
end;

function StrangeCalculation:double;
var
vehicle:TVehicle;
begin
for iVehicle = 0 to Count - 1 do
begin
vehicle:=GetVehicle(iVehicle);
// E2250 There is no overloaded version of 'AddFunc' that can be called with these arguments
eval.AddFunc(vehicle.Name, vehicle.Weight);
end;

Result:=eval.Evaluate('JeepTJWeight + FordF150Weight * 2');
end;

我的选择:

  1. AddVar( ) 或 AddConst( ) ——但这并不是很好,因为如果值不可用,我需要能够引发异常。

  2. AddFunc( ) 具有独立函数。无法做到这一点,因为变量的名称(和数量)在运行时之前是未知的。

  3. 修改对象以在未找到变量时添加回调。我实际上已经做到了这一点,但需要编辑源代码的副本以回调以使其执行此操作。

  4. 创建一个能够使用方法函数的 AddFunc( )。

选项 #3 实际上已构建,但附加一个 AddFunc 会更好。问题是我不知道要提供什么方法​​原型(prototype)。我认为 TMethod 会是这样,但我的知识在这里太有限了...这是我不成功的尝试,但我仍然在 eval.AddFunc 处得到“E2250 没有可以用这些参数调用的‘AddFunc’的重载版本” () 像以前一样调用。

TFloat64MethodFunc = function(c:pointer): TFloat64;

procedure TEasyEvaluator.AddFunc(const AName: string; AFunc: TFloat64MethodFunc);
begin
FOwnContext.Add(TExprFloat64MethodFuncSym.Create(AName, AFunc));
end;

TExprFloat64MethodFuncSym = class(TExprAbstractFuncSym)
private
FFunc: TFloat64MethodFunc;
public
constructor Create(const AIdent: string; AFunc: TFloat64MethodFunc);
function Evaluate: TFloat; override;
// not using function Compile: TExprNode; override;
end;

感谢您的帮助!

MP

最佳答案

明白了...

TFloat64MethodFunc = 函数:对象的 TFloat;

关于delphi - 需要有关 JCL TEvaluator 有趣调用的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/691553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com