Free Pascal中的函数Copy()

6

Delphi允许使用3个版本的Copy函数:

function CopyTest(const S: string): string;
begin
  Result:= Copy(S, 1, 5);
  Result:= Copy(S, 1);
//  Result:= Copy(S);   //  not allowed for strings, allowed for dyn arrays
end;

FreePascal似乎只编译第一个(3个参数)版本,对于其他版本,我遇到了编译时错误。

Error: Wrong number of parameters specified for call to "$fpc_ansistr_copy"

我是否错过了一些FPC编译器开关或Free Pascal中没有可用的Copy重载函数?


1
只是补充一下;这里有一个参考链接。但这并不意味着它与当前的RTL代码实际相符。 - TLama
@TLama - 我认为 RTL 代码并不重要,编译器决定调用哪个函数。'Fpc_Ansistr_Copy' 已经在 astrings.inc 中了,据我所知它没有重载。 - Sertac Akyuz
2
+1 表示发现了一个错误。已报告至 http://bugs.freepascal.org/view.php?id=22964(请参见 Sertac 的回答中的评论)。 - Marco van de Voort
2个回答

6
'copy'节点生成器代码在FPC源代码的pinline.pas中的inline_copy函数中。仅对动态数组变体1和3有效(在第3个变体情况下,会生成将-1传递给第二个和第三个参数以调用fpc_dynarray_copy的代码)。对于所有其他情况(ansi字符串、宽字符串、unicode字符串、char(*)和短字符串),需要3个参数(编译器生成对其中一个复制函数(例如astrings.pas中的fpc_ansistr_copy)的调用,而不检查参数,因为被调用的函数没有重载或默认参数,要求参数完全匹配)。没有涉及开关/指令。
(*)这个有点奇怪,它返回一个shortstring,可以是它本身或''。

+1 个好评价。基本上,三个参数的字符串是原始版本,后来添加了动态数组版本。奇怪的是,它从未被发现(因为它可能一直存在自2005年以来)。请提交一个错误报告。 - Marco van de Voort
@Marco - 谢谢!你指的是哪个错误?我认为所有的都是按设计来的。 - Sertac Akyuz
Sertac并不是在问在哪里提交错误,@Marco。他在问要提交哪个错误。我这里没有发现错误。Free Pascal对于字符串版本的Copy需要所有三个参数,这与Delphi的要求相同。只有数组版本才会使后面的参数变成可选项。 - Rob Kennedy
Delphi(XE)接受字符串的第二种形式,FPC(所有当前版本,在Delphi模式下)不接受,并在原始帖子中出现错误。当我写这篇文章时,我假设Delphi也允许字符串的第三种形式,但测试表明它不允许。也许我的评论应该针对顶层帖子而不是Sertac's。无论如何,我自己提交了错误报告以避免混淆,http://bugs.freepascal.org/view.php?id=22964 - Marco van de Voort
奇怪,我很确定Copy函数的无参数版本也适用于字符串,并且它是UniqueString过程的功能版本。但是,Delphi(XE)确实不允许这样做。 - kludg

4

据我所知,Free Pascal支持默认值参数,因此不需要重载函数。您可以编写新的Copy函数,例如...

function Copy(const S: string; From: integer = 1; Count: integer = MaxInt): string;
begin
//There is no need to check the string length
//      if Count > Length(S) then
//        Count := Length(S);
        result := system.Copy(S, From, Count);
end;

我认为,你甚至不需要关心如果计数超过了字符串的长度(但还没有验证这一点)。 - TLama
1
你不需要检查长度。我经常使用更长的长度。(假设MaxInt不是那么大,否则会在复制过程中导致int溢出) - BeniBela
6
我认为这并不能回答问题,因为问题并没有询问如何解决该问题。即使这不是情况,由于您的函数不是编译器内置函数,它需要为除字符串以外的其他类型进行重载,否则这仍将不是一个答案。 - Sertac Akyuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接