gpt4 book ai didi

string - 如何将字符串传递给 PAnsiChar 数组?

转载 作者:行者123 更新时间:2023-12-03 15:50:29 27 4
gpt4 key购买 nike

当我尝试将字符串从 TMemo 控件的 Lines 传递到 PChar 数组时,出现了一些奇怪的情况。在例程结束时,数组中的最后一个字符串将被复制。我能够用这个简单的代码复制这个:

procedure Test;
var
i: smallint;
arr: array of PAnsiChar;
strarr: array[0..1] of string;
begin
SetLength(arr, 2);
strarr[0] := 'abbb';
strarr[1] := 'baaa';

for i := 0 to Length(strarr) do
arr[i] := PAnsiChar(AnsiString(strarr[i]));
end;

如果我逐步运行此过程,我可以看到 arr[0] = 'abbb' 但是,在程序末尾,两个值 arr[0]arr[1] 等于 baaa。我猜这与类型转换有关。

谁能看出问题所在吗?

最佳答案

您的代码有两个问题:

  1. 您的循环超出了数组的上限。它需要使用for i := 0 to Length(strarr)-1 dofor i := 0 to High(strarr) do相反。

  2. 更重要的是,当您输入 AnsiString 时到 PAnsiChar ,它返回一个指向 AnsiString 的指针的内部数据如果 AnsiString不为空。您正在输入 UnicodeStringAnsiString并抓取一个指向它的指针,因此编译器必须使用编译器生成的局部变量 AnsiString数据。换句话说,您的代码实际上执行与以下相同的操作:

    procedure Test;
    var
    i: smallint;
    arr: array of PAnsiChar;
    strarr: array[0..1] of string;
    compiler_temp: AnsiString;
    begin
    SetLength(arr, 2);
    strarr[0] := 'abbb';
    strarr[1] := 'baaa';
    for i := 0 to Length(strarr) do
    begin
    compiler_temp := AnsiString(strarr[i]);
    arr[i] := PAnsiChar(compiler_temp);
    end;
    end;

取决于compiler_temp的内存如何arr[0] 在运行时由 RTL 内存管理器管理,这当然是可能的和arr[1]在这种情况下最终指向同一个物理内存块。

如果你想要一个 PAnsiChar 的数组值,那么您需要从 Ansi 的数组开始他们指向的数据:

procedure Test;
var
i: Integer;
arr: array of PAnsiChar;
strarr: array[0..1] of AnsiString;
begin
SetLength(arr, 2);
strarr[0] := 'abbb';
strarr[1] := 'baaa';
for i := 0 to Length(strarr)-1 do
arr[i] := PAnsiChar(strarr[i]);
end;

关于string - 如何将字符串传递给 PAnsiChar 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794431/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com