我的代码:
</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;
我不明白如何修复此错误!!!
答案 0 :(得分:4)
错误是因为@cstr[1]
的类型为Pointer
且重载决策不知道您想要的重载(PAnsiChar
或PWideChar
)。
在任何情况下,使用@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
仅与指向该类型的指针兼容变量。
这似乎与
相矛盾