E2251对“' TextToFloat'”的模糊超载调用

时间:2017-09-18 06:37:47

标签: delphi

我的代码:

</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

在Delphi 10.2中,它给出了一个错误:

function  Str2Dbl(const str: string; var v: double): boolean;
var
  dp: integer;
  cstr: string;
  xv: extended;
begin
  if FormatSettings.DecimalSeparator <> '.' then
  begin
    dp := pos('.', str);
    if dp <> 0 then
    begin
      cstr := str;
      cstr[dp] := FormatSettings.DecimalSeparator;
    end
    else
      cstr := str;
  end
  else
    cstr := str;
  if cstr <> '' then
    result := TextToFloat(@cstr[1], xv, fvExtended, FormatSettings)
  else
    result := false;
  if result then
    v := xv;
end;

我不明白如何修复此错误!!!

1 个答案:

答案 0 :(得分:4)

错误是因为@cstr[1]的类型为Pointer且重载决策不知道您想要的重载(PAnsiCharPWideChar)。

在任何情况下,使用@cstr[1]通常都是错误的,如果cstr为空,则会因运行时错误而失败。请改用PChar(cstr)。这也将允许重载解析工作。

我感谢您测试cstr是否为空,但如果您使用PChar(...)强制转换法术,则无需进行该测试。即使字符串为空,PChar(...)也会给出一个指向以null结尾的字符数组的有效指针。

documentation值得就此主题进行咨询。关键声明是:

  

PChar(S)总是返回一个指向内存块的指针;如果S为空,则返回指向#0的指针。

所以,你将能够取代:

if cstr <> '' then
  result := TextToFloat(@cstr[1], xv, fvExtended, FormatSettings)
else
  result := false;

无论如何都没有编译,用:

result := TextToFloat(PChar(cstr), xv, fvExtended, FormatSettings)

编译并避免使用if语句样板。

<强>除了

我最初期望使用{$T+}启用typed address operator会使@cstr[1]成为类型指针并帮助重载解析。但事实并非如此。令我惊讶的是,这个程序编译:

{$T+}

var
  PA: PAnsiChar;
  PW: PWideChar;
  s: string;

begin
  PA := @s[1];
  PW := @s[1];
end.

关联的documentation说:

  

@应用于{$T+}状态的变量引用时,结果的类型为^T,其中T仅与指向该类型的指针兼容变量。

这似乎与

相矛盾