PChar
버전의 측면에서 string
버전을 구현하거나 그 반대로 구현하는 것이 좋습니다.난 당신이, 독립적으로 조정할 수 있습니다 그들 이렇게 별도로 보관 것 예 :
procedure RemoveX(source : PChar); overload;
procedure RemoveX(var source : string); overload;
procedure RemoveX(source : PChar);
var
P: PChar;
Len: Integer;
begin
if source = nil then Exit;
Len := StrLen(source);
repeat
P := StrScan(source, 'X');
if P = nil then Exit;
StrMove(P, P+1, Len - Integer(P-source));
Dec(Len);
source := P;
until False;
end;
procedure RemoveX(var source : string);
begin
source := StringReplace(source, 'X', '', [rfReplaceAll]);
end;
업데이트 : 당신은 정말 당신에게 다음 두 PChar
및 String
입력을위한 하나의 구현을 사용하려면
function RemoveX(source : PChar; sourceLen: Integer): Integer; overload;
procedure RemoveX(source : PChar); overload;
procedure RemoveX(var source : string); overload;
: 같은 것을 할 수 있습니다
function RemoveX(source : PChar; sourceLen: Integer): Integer;
var
P: PChar;
begin
Result := 0;
if (source = nil) or (sourceLen = 0) then Exit;
repeat
P := StrScan(source, 'X');
if P = nil then Exit;
StrMove(P, P+1, sourceLen - Integer(P-source));
Dec(sourceLen);
source := P;
until False;
Result := sourceLen;
end;
procedure RemoveX(source : PChar);
begin
RemoveX(source, StrLen(source));
end;
procedure RemoveX(var source : string);
begin
UniqueString(source);
SetLength(source, RemoveX(PChar(source), Length(source)));
end;
Remy의 답변에 따르면 다양한 유형의 단일 범용 함수를 작성하려고하면 합병증이 발생한다는 것을 알 수 있어야합니다. 이것은 ** overload ** 지시문의 요점입니다. 그것은 당신이 처리하고자하는 특정 유형에 맞춘 각각의 기능을 작성할 수 있도록합니다. 이점은 함수 이름이 동일하므로 사용자가 전달할 유형에 따라 다른 이름을 기억할 필요가 없다는 것입니다 (참고 : 이는 다른 유형이있는 모든 상황에서 적용됩니다. 비슷한 방법 - 문자열/PChar뿐 아니라 –
과부하 개념을 알고 있습니다. 그러나 당신은 그 요점을 놓치고 있습니다. 문자열 길이를 수정하지 않는 함수의 경우 PCHAR 버전 만 필요하며 PCHAR에 캐스팅 된 문자열로 호출합니다. 정말 모든 문자열 함수에 과부하를 제공합니까? 나는 그렇지 않다. –
아니요, 요점을 놓치고있는 것 같습니다. 'PChar'와 ** string **은 근본적인 차이점이 있습니다. 특히 문자열의 끝을 결정하는 방법. 그리고 문제는 길이를 수정하는 것이 아닙니다. 할당 된 메모리의 범위 내에서 작동하는 것입니다. (_ 버퍼 오버런 오류에 대해 들었습니까 _ _) 그리고 함수 호출자가 길을 지나갈 것을 기대하는 것은 정말로 빡빡합니다. (_WinAPI 스타일 델파이 문자열을 성공적으로 피할 수 있습니다 ._)에 관해서는 *** 내가 *** *** 모든 문자열 함수에 대한 과부하를 제공 할 것이라고? 두 버전이 모두 필요한 경우 예! 그러나 드물게 'PChar'가 전혀 필요하지 않습니다. –