基底ポインター・データ・タイプ

基底ポインターは、基底付き変数の記憶域を見付けるために使用します。 フィールド、配列、またはデータ構造を特定の基底ポインター変数を基礎とするように定義 し、基底ポインター変数が必要な記憶位置を指すように設定することによって、 記憶域がアクセスされます。

たとえば、ポインター PTR1 を基礎とし、長さが 5 の文字フィールド である基底付き変数 MY_FIELD について考えてみます。 基底付き変数には、記憶域内に固定した位置がありません。 ポインターを使用して、この変数の記憶域内での現在位置を指示する必要が あります。

次が記憶域のある区域のレイアウトであるとします。

-------------------------------------------------------------
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
-------------------------------------------------------------

ポインター PTR1 を G を指すように設定すると、

               PTR1-------------------.
                                |
                                      V
-------------------------------------------------------------
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
-------------------------------------------------------------

MY_FIELD は、'G' で始まる記憶域内の位置に置かれるように なり、その値は 'GHIJK' です。ポインターが 'J' を指すように移動される と、MY_FIELD は 'JKLMN' になります。

               PTR1-------------------.
                                      |
                                      V
-------------------------------------------------------------
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
-------------------------------------------------------------

MY_FIELD が EVAL ステートメントによって 'HELLO' に変更されると、'J' で始まる 記憶域は変更されます。

               PTR1-------------------.
                                      |
                                      V
-------------------------------------------------------------
| A | B | C | D | E | F | G | H | I | H | E | L | L | O | O |
-------------------------------------------------------------

フィールドの基底ポインターを定義するためには、定義仕様書 の BASED キーワード (BASED(基底ポインター名)を参照) を 使用してください。 基底ポインターは、基礎となっているフィールドと同じ有効範囲を持っています。

基底ポインター・フィールドの長さは 16 バイトでなければならず、16 バイト境 界で位置合わせされていなければなりません。 境界位置合わせについてのこの要件によって、データ構造のポインター・サブフィ ールドが前のフィールドに直接続かない原因となったり、また、複数オカレンス・データ 構造で発生が連続しない原因となる可能性があります。 サブフィールドの位置合わせの詳細については、データ構造サブフィールドの位置合わせを参照して ください。

基底ポインターのデフォルトの初期化値は *NULL です。

注:
基底ポインターをコーディングする場合には、十分な大きさの記憶域を指示し、 基礎となっているフィールドに正しいタイプのポインターが設定されたことを 確認しなければなりません。 図 97 は、基底ポインターをコーディングしない 方 法を示しています。

注:
EVAL ptr = ptr + offset のように、式の中の ポインターにオフセットを加算したり、減算したりすることができます。ポインターの算術を実行する場合には、指している項目の記憶域外をポインター が指し示さないようにするのは、ユーザーの責任であることに注意してください。 多くの場合、項目の前または後を指しても、 例外は発行されません。

2 つのポインターに減算を行って、両ポインター間のオフセットを決定する場合、 両ポインターは同じスペースまたは同じタイプの記憶域を指していなければなりません。 たとえば、静的記憶域内の 2 つのポインター、または自動記憶域内の 2 つの ポインター、または同じユーザー・スペース内の 2 つのポインターに対して 減算を行うことができます。

注:
データ構造にポインターが含まれていて、そのデータ構造が文字フィールドにコピーされる場合、 またはポインター・サブフィールドが定義されていない別のデータ構造にコピーされる場合には、 コピーされた値からポインター情報が脱落する可能性があります。 ポインターの実際の 16 バイト値はコピーされますが、 システムには、16 バイト領域にポインターが含まれていることを示す追加の情報があります。 コピーされた値では、この追加の情報が設定されない可能性があります。

コピーされた値がオリジナルの値にコピーして戻されると、 オリジナルの値からポインターが脱落する可能性があります。

読み取り専用参照 (CONST キーワード) または値 (VALUE キーワード) を使用して、 ポインターを含むデータ構造をプロトタイプ・パラメーターとして渡した場合、 そのパラメーターが LIKEDS キーワードを使用してプロトタイプ化されるのではなく、 文字値としてプロトタイプ化されると、受け取られたパラメーターからポインター情報が脱落する可能性があります。 ポインターを含むデータ構造を戻した場合にも、似たような問題が発生する可能性があります。