gpt4 book ai didi

delphi - GetMem 用于一个 PChar 变量更改其他 PChar 变量的内容

转载 作者:行者123 更新时间:2023-12-03 19:44:21 27 4
gpt4 key购买 nike

所以,我有以下问题。我有 2 个 PChar 变量。我首先分配内存,执行一些操作,为第二个变量分配内存 - 在这一步中,第一个变量包含错误值(我在调试时看到它)。这是代码:

procedure TReadThread.Execute;
Var
iRead, temp, i, count : Integer;
header, params : PChar;
begin
try
GetMem(header, 12);
iRead := recv(FSocket, header^, 12, 0);

if (iRead<>12) then
raise Exception.Create('Header recieving problem!');

temp := StrToIntDef(String(copy(header,3,4)),0);

if (temp=0) then
raise Exception.Create('Body receiving problem!');

count := temp*SizeOf(Char);

if (count+12<=16384) then
begin
GetMem(params, count);
iRead := recv(FSocket, params^, count, 0);

if (iRead<>count) then
raise Exception.Create('Cant recieve messsage fully!');
end
else
raise Exception.Create('Bad message size (>16 KB)!');

GetMem(FText, temp*SizeOf(Char)+12);
FText := PChar(String(header) + String(params));

FreeMem(header);
FreeMem(params);
except
on E : Exception do
ShowMessage(E.Message);
end;
end;

在线上
iRead := recv(FSocket, params^, count, 0);

当我寻找变量 HEADER 值时 - 我看到了一些令人惊奇的东西 - 与我在程序开始时看到的不同。我该如何解决?

最佳答案

我认为 FTextPChar .既然您说您使用的是 Delphi 2010,您应该知道 Char实际上是 WideChar 的同义词并且是 2 个字节宽。我怀疑你真的想使用 AnsiChar .

最明显的问题是您为 FText 分配内存。然后将其分配给 FText 将其丢弃.更何况FText的内存指在程序结束时被销毁。

我认为您可能应该执行以下操作:

  • 切换到AnsiChar对于recv来电。
  • 更改FText进入 AnsiString .
  • 停止使用GetMem完全使用堆栈分配。

  • 也许是这样的:
    procedure TReadThread.Execute;
    Var
    iRead, count: Integer;
    header: array [0..12-1] of AnsiChar;
    params: array [0..16384-1] of AnsiChar;
    begin
    try
    iRead := recv(FSocket, header, 12, 0);

    if (iRead<>12) then
    raise Exception.Create('Header receiving problem!');

    count := StrToIntDef(Copy(header,3,4),0);

    if (count=0) then
    raise Exception.Create('Body receiving problem!');

    if (count+12<=16384) then
    begin
    iRead := recv(FSocket, params, count, 0);
    if (iRead<>count) then
    raise Exception.Create('Cant receive messsage fully!');
    end
    else
    raise Exception.Create('Bad message size (>16 KB)!');

    SetLength(FText, 12+count);
    Move(header, FText[1], 12);
    Move(params, FText[13], count);
    except
    on E : Exception do
    ShowMessage(E.Message);
    end;
    end;

    关于delphi - GetMem 用于一个 PChar 变量更改其他 PChar 变量的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084097/

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