4

该类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?然后行为非常奇怪。

有谁知道为什么要添加这些重载以及它们的目的是什么?自然地,我查看了对这些方法无话可说的文档。


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

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

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

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

2 回答 2

1

理论制作

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

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

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

另一个理由是在下一种情况下,变量只需要作为 Int8 保存到流中,但在程序执行期间作为 Int32 处理(因为它被传递给只接受 avar : 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;

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

于 2014-11-26T14:50:48.363 回答
0

对我来说,这段代码似乎使您能够编写一些数据,而不是跳到数据后面很远的位置。

例如,您有一个包含多个整数的流,并且您想每 5 次覆盖一次,您可以这样做:

mData := 15;
WriteData(mData, SizeOf(mData) * 5);
于 2014-11-26T14:05:13.563 回答