这是我的功能:
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美元,依此类推.这就是我的函数所做的,但不幸的是它只适用于第一个参数.
首先,您的声明指定它只返回一个字节,而不是一个字节数组,当然也不是指向数组的指针.在当前状态下,你将覆盖堆栈并严重崩溃.您可以使用无类型的"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'中的给定偏移量处,您打算写入的字节有足够的剩余空间.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |