如何创建一个检索对象最高元素的函数?

时间:2009-09-26 19:23:14

标签: delphi arrays pascal

我的计划是创建一个函数来检索对象的最高元素,可以说是数组的上限。换句话说,我正在尝试获取函数High()的代码。

到目前为止我尝试过:

 function High2(var X):integer;
 begin
   Result:=Pbyte(Cardinal(@X)-1)^-1;
 end;

上面的函数应该读取对象中第一个元素(数组/字符串)的位置之前的值(长度)并返回它减少1.但是它不能在静态或动态数组类型上检索正确的结果

如何在Pascal中重新创建High()函数?

2 个答案:

答案 0 :(得分:5)

High()(和Low())函数被称为“标准函数”,这意味着它们是编译器固有的。像Write和Writeln一样,它们并不像普通的Pascal函数声明那样存在。编译器确保它们在“系统”单元范围内仅仅是为了方便,并允许在其他范围内使用相同名称的函数。这也允许您通过使用System.High()显式引用系统单元版本来限定它们。由于它们是内在的,编译器将自动为正在考虑的类型生成正确的代码序列。这也意味着尝试复制它们的全部功能几乎是不可能的。坚持内在的标准功能。

答案 1 :(得分:4)

当Delphi已经有一个内置的High()编译器魔术函数时,不确定为什么要这样做,但是好的,这就是。

静态数组:无法完成。由于编译器已知大小且无法更改,因此在运行时不会存储大小信息。 High()只是将必要的数字作为常量放入代码中。

动态数组:编译器将High转换为系统单元中对DynArrayHigh的调用,该单元返回DynArrayLength - 1.DynArrayLength从数组的开头退回4个字节(您只退回1)并返回长度作为整数而不是字节。

希望这有帮助。你为什么不使用High,BTW?