ローカル変数を PChar として渡す

提供: Appmethod Topics
移動先: 案内検索

文字列から 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;

関連項目