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コンパイラスイッチCopyがないか、Free Pascalでオーバーロードを使用できませんか?

4

2 に答える 2

6

「コピー」ノードジェネレータコードは、FPCソースのinline_copy機能です。pinline.pas動的配列の場合のみ、バリアント1および3が有効です(fpc_dynarray_copyバリアント3の場合、2番目と3番目のパラメーターに-1を渡すコードを生成します)。他のすべての場合(ansi文字列、ワイド文字列、ユニコード文字列、char(*)、および短い文字列)3つのパラメータが必要です(fpc_ansistr_copy呼び出さastrings.pasれた関数はオーバーロードやデフォルトのパラメータはなく、パラメータの完全一致は必要ありません)。関係するスイッチ/ディレクティブはありません。

(*)これは少し奇妙です。それ自体または''のいずれかの短い文字列を返します。

于 2012-09-22T14:27:37.600 に答える
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;
于 2012-09-22T09:05:40.973 に答える