这是我的功能:
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>
答案 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()确实有意义。)
表达式中的一些括号也伤害了任何人,但我不知道这是否是问题。