我有这段代码。 BufferAddress最初是PByteArray类型。 但是,PByteArray仅限于32768个元素,但我需要的不仅仅是。
我在运行时不需要什么是最大限制,所以我将TLargeArrayOfBytes定义为0到2GB。有一个更好的方法吗?
function TBufferedStream.Read(VAR aBuffer; Count: Integer): Longint;
TYPE
TLargeArrayOfBytes = array[0..2000000000] of Byte;
PArrayOfBytes = ^TLargeArrayOfBytes;
VAR
BufferAddress: PArrayOfBytes; // it was PByteArray
begin
...
{ Then refill buffer... }
FillReadBuffer;
{ ...and continue reading }
BufferAddress:= @TLargeArrayOfBytes(aBuffer);
Result:= Result+ ReadFromBuffer(BufferAddress[Result], Count- Result); { Read from RAM buffer }
end;
Delphi 7
答案 0 :(得分:4)
我的定义中没有看到任何错误,唯一的建议是你可以使用MaxInt
const。
type
TLargeArrayOfBytes = array[0..MaxInt-1] of Byte;
或者SysUtils.TBytes
类型
答案 1 :(得分:3)
PByteArray 确实仅限于那么多字节。它可以指向任何大小的数组。如果在将括号运算符应用于数组指针时启用了范围检查,则唯一的问题就出现了。然后编译器检查索引是否在声明的类型的范围内,而不管指针实际指向的字节数。在这样的表达式之前禁用范围检查,然后再将其重新打开。
BufferAddress:= PByteArray(@aBuffer);
{$R-}
// Read from RAM buffer
Result := Result + ReadFromBuffer(BufferAddress[Result], Count - Result);
{$R+}
答案 2 :(得分:0)
使用POINTERMATH指令,您不需要声明指向数组的指针类型。
{$POINTERMATH ON}
procedure TForm1.FormCreate(Sender: TObject);
var
P : PByte;
begin
GetMem(P,1000);
P^ := 42; //Access first/current element
P[999] := 42; //Access last element
FreeMem(P);
end;