ローカル変数を PChar として渡す
文字列から PChar への変換 への移動
PChar をとる関数を呼び出すことによって初期化が必要なローカル文字列変数がある場合を考えます。 一つの方法は、ローカルの char の配列
を作成し、関数に渡し、変数をこの文字列に割り当てることです。
// assume FillBuffer is a predefined function
function FillBuffer(Value:Integer; Buf:PChar; Count:Integer):Integer
begin
// …
end;
// assume MAX_SIZE is a predefined constant
var
i: Integer;
buf: array[0..MAX_SIZE] of char;
S: string;
begin
i := FillBuffer(0, buf, SizeOf(buf));// treats buf as a PChar
S := buf;
//statements
end;
この方法はバッファのサイズが比較的小さい場合に便利です。スタックに割り当てられるからです。 さらに char の配列
と 文字列
間で自動的に変換されるので、安全です。 文字列の長さ
は、buf
が文字列に割り当てられた後に、自動的に正確な値に設定されます。
バッファのコピーによるオーバーヘッドを除外するには、文字列を PChar
にキャストできます(ルーチンで PChar
をメモリ上に残しておく必要がないことが確実な場合)。 ただし、文字列の長さは自動的には同期されません。これは char の配列
を 文字列
に割り当てるときと同様です。 文字列の 長さ
を、文字列の実際の長さを反映するように再設定する必要があります。 コピーされたバイト数を返す関数を使用している場合は、次の 1 行のコードで安全に実行できます。
var
S: string;
begin
SetLength(S, MAX_SIZE);// when casting to a PChar, be sure the string is not empty
SetLength(S, GetModuleFilename(0, PChar(S), Length(S)));
// statements
end;