如何获得结果的地址?

时间:2009-07-13 13:52:36

标签: 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;

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

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

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

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

我知道我可以使用指向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;

第二个例子应该可以工作。如果ar [0]的价格是400000美元,那么ar [1]应该是$ 400001,依此类推。这就是我的函数所做的,但不幸的是它只适用于第一个参数。< / p>

2 个答案:

答案 0 :(得分: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;

然后这样称呼:

c.ReadArray<byte>(4, ar[5]);

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

答案 1 :(得分:1)

在第一个函数中,如果移动到b,则移动到存储结果指针的位置(B),而不是结果(pansichar(b)^)

您对dataread的定义也不明确。 “byte of array”都可以是一个动态数组(high()没有意义)作为一个开放数组(其中high()确实有意义。)

表达式中的一些括号也伤害了任何人,但我不知道这是否是问题。