gpt4 book ai didi

delphi - TStream.WriteData 和 TStream.ReadData 的 Count 参数的用途是什么?

转载 作者:行者123 更新时间:2023-12-03 15:34:51 31 4
gpt4 key购买 nike

TStream类包含许多 WriteData 的重载其形式如下:

function WriteData(const Buffer: Int32; Count: Longint): Longint; overload;

所有常见的嫌疑人都有重载,AnsiChar , Char , UInt32 , Double等等。 ReadData 类似。我试图了解Count的目的是什么参数服务。上述重载的实现如下:

function TStream.Skip(Amount: Integer): Integer;
var
P: Integer;
begin
P := Position;
Result := Seek(Amount, soCurrent) - P;
end;

function TStream.WriteData(const Buffer: Int32; Count: Longint): Longint;
const
BufSize = SizeOf(Buffer);
begin
if Count > BufSize then
Result := Write(Buffer, BufSize) + Skip(Count - BufSize)
else
Result := Write(Buffer, Count)
end;

我显然可以看到这段代码的作用,但我无法理解为什么执行部分写入有意义。为什么使用 Count < BufSize 调用此函数有意义? ?当时的行为非常奇怪。

有谁知道为什么添加这些重载以及它们的目的是什么?当然,我看过documentation对于这些方法没有什么可说的。

<小时/>

顺便说一句,我将提交有关此行的错误报告:

Result := Write(Buffer, BufSize) + Skip(Count - BufSize);

假设对 Write 的调用是错误的将发生在调用 Skip 之前。操作数的求值顺序为 +运算符未定义。这段代码应该这样写:

Result := Write(Buffer, BufSize);
inc(Result, Skip(Count - BufSize));

最佳答案

理论构建

如果 TStream 早于 overload 的引入关键字(Delphi 3 IIRC),他们可能引入了一个单一的方法来写入整数,可能是 int32。当使用“byte”变量调用函数时,它将作为 Integer 传递给函数,然后 Count 参数将只允许写入单个字节。现在他们支持这一点是为了向后兼容。

在某些情况下(如下一个),支持 Count < Bufsize确实特别傻:

function WriteData(const Buffer: Int8; Count: Longint): Longint; overload;

另一个理由是在下一种情况下,当一个变量只需要作为 Int8 保存到流中,但在程序执行期间作为 Int32 处理时(因为它被传递给一个只需要 var : Int32 作为的函数)参数)。

procedure SomeProc(var MyInt : Integer);

procedure DoSomeStream;
var
iVal : Integer;
// bVal : ShortInt;
begin
SomeProc(iVal);
Stream.WriteData(iVal, SizeOf(Byte));
//Instead of
// SomeProc(iVal);
// bVal := iVal;
// Stream.WriteData(bVal)
end;

我并不是说这是必需的(可以解决),但在某些极端情况下,它可能很有用。

关于delphi - TStream.WriteData 和 TStream.ReadData 的 Count 参数的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27150816/

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