PChar配列の割当・解放のしかた

解決


スプリ  2005-04-06 11:45:53  No: 14128

Array[0..99] of PChar
というPCharの配列を扱いたいのですが、
これの割当と解放の方法をお教え願えませんでしょうか。
各要素には30文字(固定)の文字列を格納するようになっております。
(DLLに渡す変数であるため、どうしてもPCharである必要があります)
よろしくお願いします。


Fusa  2005-04-06 15:21:19  No: 14129

こんな感じでしょうか。

var
  My_PChar:PChar;
  i:Integer;
begin
  GetMem(My_PChar,Length('ABCDEFG')+1);
  StrPCopy(My_PChar,'ABCDEFG');

  for i:=0 to 6 do
  begin
    ListBox1.Items.Add(My_PChar+i);
  end;

  FreeMem(My_PChar);
end;


スプリ  2005-04-06 22:51:30  No: 14130

ありがとうございます。
しかしながらArray of PCharの形でDLLに受け渡せないので解決とはなりません。

var
  MyPCharArray : Array[0..99] of PChar;

これの割当・解放を知りたいです。


にしの  2005-04-06 23:19:12  No: 14131

> var
>   MyPCharArray : Array[0..99] of PChar;

> これの割当・解放を知りたいです。
この定義だと、静的配列ですので、実行時にメモリは割り当てられていますし、スコープ外に出れば解放されます。

以下は、PCHARの配列を、PCHARへのポインタと考えて確保・解放する場合です。
基本的には、Fusaさんの方法と同じです。
PCHARの配列の各要素の内容は考慮していませんのでご注意を。

procedure TForm1.Button1Click(Sender: TObject);
var
  MyPCharArray : PPChar;
begin
  //PCHAR配列を確保
  GetMem(MyPCharArray, SizeOf(PChar) * 100);

  //関数呼び出し
  func(MyPCharArray);

  //PCHAR配列を解放
  FreeMem(MyPCharArray);
end;

でよろしいかと。
PPCHARはSystemユニットに定義されていますが、もし存在しない場合は
type
  PPChar = ^PChar;
とでもしてください。


スプリ  2005-04-06 23:59:57  No: 14132

ありがとうございます。
私自身、PChar自体を使うことがほとんどなく、
知識がないために色々と勘違いしていた部分がありました。
最初Array[0..199] of PCharと定義してうまくいかず、
これ自体が悪いのかと思っておりましたが、
値の受け渡し方の方を間違えていたようです。
同じ要素数のString配列を用意し、
単純にPChar()でキャストして渡すことによってうまくいきました。

にしのさんの書込内容では、私にとっては今度は値の受渡しの仕方が
分からず試せませんでしたが、
> この定義だと、静的配列ですので、実行時にメモリは割り当てられていますし、スコープ外に出れば解放されます。
が大いに役に立ちました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加