2017-08-30 7 views
-2

なぜ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; 
+0

文字列は実際には文字の動的配列です。文字列に 'SetLength'を呼び出すことは、それを動的配列で呼び出すことと変わりありません。どちらの場合も、その値の長さを(その名前が示唆するように)設定します。それらの配列要素のそれぞれにどのようなデータが存在しているかは、初期化するまではあなた次第です。 'nil'と' 0'は確かに可能な値です。 –

+1

あなたは(私たちが)問題/質問に集中できるように、コードを最小限に減らすことを検討しましたか? – CWBudde

+4

これは(System.SetLength()のヘルプから)正確に文書化されたとおりに動作します:*長い文字列変数の場合、SetLengthはSによって参照される文字列を指定された長さに再割り当てします。文字列中の既存の文字は保存されますが、新たに割り当てられたスペースの内容は未定義です*注意:*動的配列変数の場合、SetLengthはSで参照される配列を指定された長さに再割り当てします。配列内の既存の要素は保存され、新しく割り当てられた領域は0またはnilに設定されます。* –

答えて

6

Result変数には常に値があります。抽象的にDelphi言語について言及していない限り、常に値を持つのは変数の性質です。

SetLengthこの場合変更の値。 Resultは長さゼロの文字列として開始し、長さLength(AValue)の文字列になります。しかし、それらはの両方ともの値です。長さは部分のの値です。文字列は値を持たない長さを持つことはできません。

SetLength文字の文字列にの値を定義する場合と定義しない場合があります。それらは#0かもしれないし、未定義かもしれない - 私は覚えていないし、それは本当に重要ではない。いずれにしても、定義されていなくても、の文字はの値を持ちます。

+0

お返事ありがとうございました。 – gemy

関連する問題