Array[0..99] of PChar
というPCharの配列を扱いたいのですが、
これの割当と解放の方法をお教え願えませんでしょうか。
各要素には30文字(固定)の文字列を格納するようになっております。
(DLLに渡す変数であるため、どうしてもPCharである必要があります)
よろしくお願いします。
こんな感じでしょうか。
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;
ありがとうございます。
しかしながらArray of PCharの形でDLLに受け渡せないので解決とはなりません。
var
MyPCharArray : Array[0..99] of PChar;
これの割当・解放を知りたいです。
> 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;
とでもしてください。
ありがとうございます。
私自身、PChar自体を使うことがほとんどなく、
知識がないために色々と勘違いしていた部分がありました。
最初Array[0..199] of PCharと定義してうまくいかず、
これ自体が悪いのかと思っておりましたが、
値の受け渡し方の方を間違えていたようです。
同じ要素数のString配列を用意し、
単純にPChar()でキャストして渡すことによってうまくいきました。
にしのさんの書込内容では、私にとっては今度は値の受渡しの仕方が
分からず試せませんでしたが、
> この定義だと、静的配列ですので、実行時にメモリは割り当てられていますし、スコープ外に出れば解放されます。
が大いに役に立ちました。
ありがとうございました。
ツイート | ![]() |