获取类型为数组的记录字段的长度

4

我正在编写与外部二进制API通信的包装器。该API使用PDU(打包的二进制记录)进行通信。字符串是AnsiChar数组,并以零结尾:

type 
  TSomePDU = packed record
    //...
    StringField: array[0..XYZ] of AnsiChar;
    //...
  end;
  PSomePDU = ^TSomePDU;

我想编写一个 FillPDUString 程序,它将接受一个字符串并填充字符数组,但我想避免在使用该程序时跟踪 MaxLength,因此我需要以某种方式获取给定字段指针的声明数组大小。
function GetMaxSize(const Field: array of AnsiChar): Integer;
begin
  // ???
end;

//...
GetMaxSize(ARecord.StringField);

这是可能的吗?
2个回答

6

如果我理解正确,那么您可以使用Delphi的Length函数。

以下是获取长度的方法:

function GetMaxSize(const Value: PSomePDU): Integer; 
begin
  Result := Length(Value.StringField);
end;

只是一个小错误更正,签名应该是 function GetMaxSize(const Field: array of AnsiChar) 而且主体部分应该是 Result=Length(Field); ,因为目的是找到任何任意字段的最大长度,给予 field 指针,因此有 const Field: array of AnsiChar. - Boris B.
@BorisB。这取决于你的看法,但我更喜欢传递整个记录,这样我就不必在每次调用时执行GetMaxSize(APDURecord.StringField)。 - user497849
是的,但可能会有许多不同的PDU,并且一个PDU中可以有许多不同的字符串字段,按照您的方式编写将限制您仅使用一个特定记录的特定字段。此外,现在我知道简单的“长度”就是解决方案,我不需要该函数,因为它仅用于“FillPDUString”函数,该函数在填充之前检查溢出。 - Boris B.

6
要获取数组包含的元素数量,请使用Length
ElementCount := Length(ARecord.StringField);

使用 lowhigh 可以获取任何 Delphi 数组的边界。

MinIndex := low(ARecord.StringField);
MaxIndex := high(ARecord.StringField);

使用后者的方法,通过lowhigh,可以避免假定数组从0开始。


3
对于 Low 和 High,通常人们认为数组是以零为基础的。每当我有机会时,我会将它们变成非零基础,这样生活会更加有趣。^_^ (注:原文带有表情符“^_^”,翻译时可以忽略不翻译) - user497849
非常感谢,Dorin比我快了一分钟给出了相同的答案,所以我不得不选择他。 - Boris B.
1
很高兴看到你重视速度而不是质量!;-) 说真的,接受最佳答案。我不评论哪个是最好的答案,但无论何时到达,您都应该选择最佳答案。即使我的回答很快,但后来的答案更好,我也会这样说,并且已经多次这样做过。 - David Heffernan
Length(a) = High(a) - Low(a) + 1 (我的2分钱) - kobik
@BorisB。David是正确的,速度并不是关键,而是回答的质量。 - user497849

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接