Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 免费Pascal中的函数Copy()_Delphi_Copy_Freepascal - Fatal编程技术网

Delphi 免费Pascal中的函数Copy()

Delphi 免费Pascal中的函数Copy(),delphi,copy,freepascal,Delphi,Copy,Freepascal,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似乎只编译第1个(3-arg)版本;对于其他的,我有编译时错误 Error:

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似乎只编译第1个(3-arg)版本;对于其他的,我有编译时错误

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

我是否缺少一些FPC编译器开关,或者在Free Pascal中没有重载功能?

因为我知道Free Pascal支持默认值参数,所以不需要重载功能。您可以编写新的
复制
函数,例如

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;

“复制”节点生成器代码位于FPC源的
inline\u copy
函数中。仅对于动态阵列,变量1和3有效(对于变量3,生成代码将第二个和第三个参数的-1传递给
fpc\u dynarray\u copy
)。对于所有其他情况(ansi字符串、宽字符串、unicode字符串、字符(*)和短字符串),需要3个参数(编译器生成对其中一个复制函数的调用(例如
fpc\u ansistr\u copy
in
astrings.pas
)不检查参数,因为被调用函数没有重载或默认参数,所以需要参数的精确匹配)。不涉及开关/指令


(*)这个有点奇怪,它返回本身或“”的短字符串;这里有一个答案。然而,这并不意味着它在当前RTL代码中是实际的。@TLama-我认为RTL代码无关紧要,编译器决定调用什么函数Fpc_Ansistr_Copy'在astrings.inc中,因为它没有重载。注意到一个错误+1。报告为(参见Sertac答案中的注释)我认为,您甚至不需要关心计数是否超过字符串长度(但尚未验证)。您不需要检查长度。我经常用更长的长度。(假设MaxInt不是那么大,它会在副本的某个地方导致int溢出)我认为这并不能回答这个问题,因为这个问题并没有问如何解决这个问题。即使情况并非如此,由于您的函数不是编译器的固有函数,它也需要对字符串以外的其他类型进行重载,这将再次导致这一结果为非答案。+1良好评估。基本上,三个参数字符串是原始的,后来添加了动态数组版本。奇怪的是,它从未被发现过(因为从2005年起可能就是这样)。请归档一个bug。@Marco-谢谢!你指的是哪个bug?“我觉得这一切都是按照设计的。塞尔塔克并没有问在哪里归档这个bug,@Marco。”。他问要归档哪个bug。我看这里没有虫子。Free Pascal要求字符串版本的
Copy
的所有三个参数,这与Delphi的要求相同。只有数组版本使后面的参数成为可选的。Delphi(XE)接受字符串的第二种形式,FPC(所有当前版本,在Delphi模式下)不接受,错误出现在原始帖子中。当我编写它时,我假设Delphi也允许字符串的第三种形式,但测试表明它不允许。也许我的话应该是针对顶级职位的,而不是Sertac的。无论如何,我自己提交了这个bug以避免混淆,奇怪的是,我非常确定
Copy
函数的无参数版本也允许用于字符串,并且它是
UniqueString
过程的功能版本。但是的,德尔福(Delphi)不允许这样做。