gpt4 book ai didi

delphi - 如何将通用记录作为参数传递给 TFileStream.Read 函数?

转载 作者:行者123 更新时间:2023-12-03 15:38:16 26 4
gpt4 key购买 nike

例如,我有多种记录类型可以从文件中读取

  PDescriptorBlockHeader = ^TDescriptorBlockHeader;
TDescriptorBlockHeader = packed record

BlockType: UInt32;
BlockAttributes: UInt32; // +4
OffsetToFirstEvent: UInt16; // +8
OsId: byte; // +10
OsVersion: byte;
DisplayableSize: UInt64; // +12
FormatLogicalAddress: UInt64; // +20
SessionId: UInt64; // +28
ControlBlockID: UInt32; // +36
StringStorage: MTF_TAPE_ADDRESS; // +40
OsSpecificData: MTF_TAPE_ADDRESS; // +44
StringType: byte; // +48
Reserved: byte; // +49
HeaderChecksum: UInt16; //+50
end;

我想使用通用函数从文件中读取

type
TReaderHelper = class
class procedure ReadToStruct<T:record>(stream: TFileStream; offset: Int64);
end;

implementation

class procedure TReaderHelper.ReadToStruct<T>(stream: TFileStream; offset: Int64);
var
rd: integer;
begin
stream.Position := offset;
if stream.Position <> offset then
raise Exception.Create('Seek error');
rd := stream.Read(T, sizeof(T));
if rd <> sizeof(T) then
raise Exception.Create('Read ' + IntToStr(rd) + ' instead of ' + IntToStr(sizeof(T)));
end;

编译器给我错误E2571类型参数'T'没有类或接口(interface)约束rd := stream.Read(T, sizeof(T));。是否可以将该通用记录作为参数传递给 TFileStream.Read 函数?

最佳答案

您正在尝试直接读取类型T。您需要提供要读取的该类型的变量

type
TReaderHelper = class
class procedure ReadToStruct<T: record>(stream: TStream; offset: Int64; out Data: T);
end;

class procedure TReaderHelper.ReadToStruct<T>(stream: TStream; offset: Int64; out Data: T);
begin
stream.Position := offset;
stream.ReadBuffer(Data, sizeof(T));
end;

与提供像 TFileStream 这样的特定流类相比,提供通用流类更加灵活。这允许您将此方法与不同的流实现一起使用。

您提出的查找异常没有任何作用,因为可以在文件末尾之外进行查找。后续读取或写入操作中出现任何错误。

另一个异常很好,但使用 ReadBuffer 并让流类在无法读取请求的数据量时引发异常可能更简单。

关于delphi - 如何将通用记录作为参数传递给 TFileStream.Read 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56865303/

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