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() コンパイラ マジック関数が既にある場合に、なぜそれを行う必要があるのか​​ わかりませんが、OK、ここに行きます。

静的配列: 実行できません。サイズはコンパイラに認識されており、変更できないため、実行時にサイズ情報は保存されません。High() は、必要な数を定数としてコードにドロップするだけです。

動的配列: コンパイラは High を System ユニットの DynArrayHigh の呼び出しに変換し、DynArrayLength - 1 を返します。DynArrayLength は、配列の先頭から 4 バイト戻り (1 だけ戻ります)、長さを整数として返します。バイトの代わりに。

これが役に立てば幸いです。ところで、High だけを使用しないのはなぜですか?

于 2009-09-26T20:26:48.537 に答える