なぜSetLength(Result, Length(AValue));
は結果に値を与えますか?なぜSetlengthは結果に値を与えますか? (デルファイ)
デルファイのヘルプでは、私は何も読んでいなかったので、setlengthは結果に値を与えます。
これは使用している関数です。
function StripNonAlphaNumeric(const AValue: string): string;
var
SrcPtr, DestPtr: PChar;
begin
SrcPtr := PChar(AValue); //
SetLength(Result, Length(AValue)); // i set your length, but not your value, why do you have a value ?
DestPtr := PChar(Result);
while SrcPtr <> #0 do begin
if SrcPtr[0] in ['0'..'9','A'..'Z','a'..'z','?','.','>','<','+','-','~','!','@','#','$','%','&',
'*','(',')','_','=','{','}','[',']','|','\','/',':',';',' '] then
begin
DestPtr[0] := SrcPtr[0];
Inc(DestPtr);
end;
Inc(SrcPtr);
end;
SetLength(Result, DestPtr - PChar(Result));
end;
文字列は実際には文字の動的配列です。文字列に 'SetLength'を呼び出すことは、それを動的配列で呼び出すことと変わりありません。どちらの場合も、その値の長さを(その名前が示唆するように)設定します。それらの配列要素のそれぞれにどのようなデータが存在しているかは、初期化するまではあなた次第です。 'nil'と' 0'は確かに可能な値です。 –
あなたは(私たちが)問題/質問に集中できるように、コードを最小限に減らすことを検討しましたか? – CWBudde
これは(System.SetLength()のヘルプから)正確に文書化されたとおりに動作します:*長い文字列変数の場合、SetLengthはSによって参照される文字列を指定された長さに再割り当てします。文字列中の既存の文字は保存されますが、新たに割り当てられたスペースの内容は未定義です*注意:*動的配列変数の場合、SetLengthはSで参照される配列を指定された長さに再割り当てします。配列内の既存の要素は保存され、新しく割り当てられた領域は0またはnilに設定されます。* –