关于将指针记录为函数变量的问题

问题描述 投票:0回答:1

如果我定义以下过程:

procedure get_String(var aStringPtr: PAnsiChar);
  function set_ReturnValue(aInputValue: AnsiString) : PAnsiChar; overload;
  var
    iLen: Integer;
  begin
    iLen   := Length(aInputValue);
    Result := AnsiStrAlloc(iStringLen + 1);
    System.AnsiStrings.StrPLCopy(Result, aInputValue, iLen);
  end;

var
  iData: AnsiString;
begin
  iData := 'Hello World';
  aStringPtr:= set_ReturnValue(iData);
end;

我可以调用“get_String()”过程并通过执行以下代码获取字符串:

var
  iMyStr: PAnsiChar;
begin
  get_String(iMyStr);

我正在尝试创建一个返回正确填充的记录指针的“get_Record()”过程,但没有成功:

  TMyDataRec = record
    ProductID: Integer;
    DownloadURL: WideString;
    MaintenanceDate: AnsiString;
  end;

type
  TMyDataRecPtr = ^TMyDataRec;

procedure get_Record(var aRecordPtr: TMyDataRecPtr);
var
  iData: TMyDataRec;
begin
  iData.ProductID       := 1;
  iData.DownloadURL     := 'www.thisisatest.com';
  iData.MaintenanceDate := '02/29/2023';

  aRecordPtr := <...>
end;

如何填充“aRecordPtr”以便调用“get_Record()”过程返回正确的数据?

到目前为止,我的所有尝试都导致了访问冲突。

pointers delphi record
1个回答
0
投票

通常记录和记录指针一起声明,如下所示:

type
  PMyDataRec = ^TMyDataRec;
  TMyDataRec = record
    ProductID: Integer;
    DownloadURL: WideString;
    MaintenanceDate: AnsiString;
  end;

// Note that the `PMyDataRec` pointer can be defined before the 
// `TMyDataRec` record, if done in the same 'type' block.

您会遇到访问冲突,因为您依赖堆栈内存,当过程退出时堆栈内存不再存在。 您需要使用

New()
方法为记录分配内存。

procedure get_Record(var aRecordPtr: PMyDataRec);
var
//  iData: TMyDataRec;
  iData: PMyDataRec;
begin
  new(iData); // this is missing
  iData.ProductID       := 1;
  iData.DownloadURL     := 'www.thisisatest.com';
  iData.MaintenanceDate := '02/29/2023';

  aRecordPtr := iData; //<...>
end;

还要注意,不需要

iData
记录指针,可以直接对
aRecordPtr
参数进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.