gpt4 book ai didi

delphi - 在 Delphi 10.2 中写入 MemoryStream 有何变化?

转载 作者:行者123 更新时间:2023-12-03 18:25:42 30 4
gpt4 key购买 nike

我正在将我的代码从 10.1 移植到 10.2,这给了我错误:

procedure TForm4.FormCreate(Sender: TObject);
const
CFourBytes: array[0..3] of Byte = (1, 2, 3, 4);
var
LStream: TMemoryStream;
LBuffer: array of Byte;
begin
SetLength(LBuffer, 4);
LStream := TMemoryStream.Create;
LStream.Write(@CFourBytes[0], 4); // E2036 Variable required

LStream.Position := 0;
LStream.ReadData(@LBuffer[0], 4);
end;

我不得不将违规行更改为 LStream.Write(CFourBytes[0], 4);

有什么变化?我一直做错了吗?

最佳答案

您问题中的代码确实可以在旧版本中编译,但不应该编译。在 10.2 中看到的行为是正确的。

旧版本中发生的事情非常奇怪。编译器在 TStream 中选择这个重载:

function Write(const Buffer: TBytes; Count: Longint): Longint; overload;

这尤其令人震惊,因为传递给此方法的是静态数组 CFourBytes 的地址。这绝对不是 TBytes 对象。

现在碰巧 TBytes 变量是数组第一个元素的地址。 TMemoryStream.WriteTBytes 覆盖中没有任何内容指向那个伪造的 TBytes 对象的 Length()。所以你的代码恰好按预期工作。这很明显是一个已修复的编译器错误。

你的代码总是被破坏,直到现在,你只是侥幸逃脱了它。你应该修复你的代码。像这样:

LStream := TMemoryStream.Create;
try
LStream.WriteBuffer(CFourBytes, SizeOf(CFourBytes));

SetLength(LBuffer, LStream.Size);
LStream.Position := 0;
LStream.ReadBuffer(LBuffer[0], LStream.Size);
finally
LStream.Free;
end;

请注意,我使用的是 WriteBufferReadBuffer 而不是 WriteRead。这些是与 TStream 一起使用的首选方法。原因是它们执行错误检查并在出现错误时引发异常,这与 WriteRead 不同。

关于delphi - 在 Delphi 10.2 中写入 MemoryStream 有何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53534820/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com