如何获得结果的地址?

Iva*_*nov 0 delphi

这是我的功能:

class function TCelebrity.ReadArray<T>(length:integer): byte;
var b:pointer;
begin
  b := @Result;
  if IndexR + SizeOf(T) * length > High(DataRead) + 1 then
    raise Exception.Create('error');
  Move(DataRead[IndexR],b,SizeOf(T) * length);
  Inc(IndexR,SizeOf(T) * length);
end;
Run Code Online (Sandbox Code Playgroud)

IndexR是一个整数,DataRead是一个byte数组.

该函数从IndexR(位置)的DataRead读取长度.在我的情况下,它在位置0读取4个字节.

问题是我想调用这样的函数:

ar[5] := c.ReadArray<byte>(4); or - @ar[5] := c.ReadArray<byte>(4); //ar is Byte array
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用指向Byte数组的指针创建一个参数,但我想知道是否可以这样做?

编辑:

我也试过这个函数,它只改变了ar [5],它应该从ar [5]变为ar [8].

class function TCelebrity.ReadArray<T>(length:integer): byte;
var b:^byte; i:integer;
begin
  b := @Result;
  for I := 0 to length - 1 do
  begin
    b^ := DataRead[IndexR];
    Inc(IndexR);
    Inc(b);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

第二个例子应该可以工作.如果ar [0]被放置在400000美元,那么ar [1]应该放在400001美元,依此类推.这就是我的函数所做的,但不幸的是它只适用于第一个参数.

All*_*uer 6

首先,您的声明指定它只返回一个字节,而不是一个字节数组,当然也不是指向数组的指针.在当前状态下,你将覆盖堆栈并严重崩溃.您可以使用无类型的"var"参数而不是函数结果.

class procedure TCelebrity.ReadArray<T>(length:integer; var Result);
var b:pointer;
begin
  b := @Result;
  if IndexR + SizeOf(T) * length > High(DataRead) + 1 then
    raise Exception.Create('error');
  Move(DataRead[IndexR],b^,SizeOf(T) * length);
  Inc(IndexR,SizeOf(T) * length);
end;
Run Code Online (Sandbox Code Playgroud)

然后像这样称呼它:

c.ReadArray<byte>(4, ar[5]);
Run Code Online (Sandbox Code Playgroud)

但是,这仍然非常危险.您必须确保在数组'ar'中的给定偏移量处,您打算写入的字节有足够的剩余空间.