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

Delphi 获取数组类型的记录字段的长度,delphi,Delphi,我正在编写一个与外部二进制API通信的包装器。API使用PDU(压缩二进制记录)进行通信。字符串是AnsiChar数组,以零结尾: type TSomePDU = packed record //... StringField: array[0..XYZ] of AnsiChar; //... end; PSomePDU = ^TSomePDU; 我想编写一个FillPDUString过程,该过程将接受字符串并填充字符数组,但我想避免在使用该过程的任何地方

我正在编写一个与外部二进制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);

这可能吗?

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

以下是获取长度的方法:

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

要获取数组包含的元素数,请使用
Length

ElementCount := Length(ARecord.StringField);
使用
low
high
获取任何Delphi数组的边界

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

使用后一种方法,即
,可以避免假设数组是基于0的。

+1对于低和高,通常人们会假设数组是基于零的,只要我有机会,我会将它们设置为非基于零的,这样会让生活更愉快。^非常感谢,多林用同样的答案比我快了一分钟,我不得不选一个。很高兴看到你奖励速度而不是质量!;-)认真地说,接受最好的答案。我不评论这两个答案中的哪一个,但是你应该总是选择最好的答案,无论它何时到来。我也会这么说,而且我已经做了很多次了,即使我的答案很快,但后来的答案更好。
Length(a)=High(a)-Low(a)+1
(我的2美分)@BorisB。David是对的,速度不是关键,而是答案的质量。只需稍加更正,签名应该是
函数GetMaxSize(const Field:array of AnsiChar)
,正文
结果=长度(Field)
,因为这一点是为了获得任何给定字段指针的任意字段的最大长度,因此是
const field:array of AnsiChar
@BorisB。这取决于您如何看待它,但我更喜欢传递整个记录,这样我就不必为每个调用执行GetMaxSize(APDURecord.StringField)……是的,但是可以有许多不同的PDU,一个PDU中可以有许多不同的字符串字段,以您的方式写入会将您限制为一个特定记录的一个特定字段。此外,现在我知道简单的
Length
是一个解决方案,反正我不需要func,因为它只用于
FillPDUString
func,在填充之前检查溢出。