2

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

到目前为止我已经尝试过:

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

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

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

4

2 回答 2

5

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

于 2009-09-26T21:13:45.177 回答
4

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

静态数组:做不到。运行时不存储大小信息,因为编译器知道大小并且无法更改。High() 只是将必要的数字作为常量放入代码中。

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

希望这会有所帮助。顺便说一句,你为什么不只是使用高?

于 2009-09-26T20:26:48.537 回答