- PICK/UniVerse データベースで定数値を宣言する方法は?
- 定数参照によって関数に引数を渡す方法は?
IBM の UniVerse データベースのマニュアルには、定数に関する情報がいくつかありますが、特に何もありません。
その点に注意してください:
DEFINE ステートメントの値
コンパイル時にステートメントを値に置き換え、値の実際の定数を提供しないため、私が探しているものではありません。
それらを宣言する方法を知っている人はいますか?
ありがとう。
IBM の UniVerse データベースのマニュアルには、定数に関する情報がいくつかありますが、特に何もありません。
その点に注意してください:
DEFINE ステートメントの値
コンパイル時にステートメントを値に置き換え、値の実際の定数を提供しないため、私が探しているものではありません。
それらを宣言する方法を知っている人はいますか?
ありがとう。
これは、UniData (UniVerse の姉妹データベース。両方をまとめて U2 と呼びます) と同じステートメントであり、次のとおりですEQU
。EQUATE
例えば:
EQU statement TO value
ポイント2の意味がよくわかりませんが、掘り下げてみます。デフォルトでは、すべてのパラメーターは「参照渡し」ですが、const 引数の形式はありません。関数/サブルーチンでパラメータ値を内部的に変更することは引き続き可能ですが、結果は呼び出し元のプログラム/関数/サブルーチンの等式の値には影響しません。
サイドノート:サブルーチン/関数が渡した実際の変数の値を変更しないようにしたい場合(値渡し)、それを一時変数に割り当てて渡すか、括弧で囲むことができます
例えば:
CALL MySub(PassByRef, (PassByValue))
()
の一時コピーを作成し、そのPassByValue
一時コピーを参照渡しします。これにより、変更の伝播が停止しますPassByValue
で使用する前に変数を定義する必要はありませんPick/Universe
。
コンパイル時に定義された変数を割り当てるには
EQU PI TO 3.14
実行時に割り当てるには
PI = 3.14
ここでの主な違いは、一度コンパイル時に EQUATE を使用して割り当てられると、変数を再割り当てできないのに対し、実行時に割り当てられると再割り当てできることです。したがって、コンパイル時のコンパイルは通常定数のみに予約されますが、実行時の代入は定数と標準変数値の両方に使用できます。
私は EQUATE ステートメントを使用して定数を作成します。それらを複数のプログラムで使用できるようにする場合は、それらを独自のレコードに配置し、$INCLUDE ステートメントを使用して定義を他のプログラムにプルする必要があります。すべての値はコンパイル時に確立されることに注意してください。
コンパイル時以外の時点で確立される、またはタグを介して間接的に値を参照する (定数参照を渡す) 「定数」に関しては、ほとんどの U2 プログラマーは何らかの制御レコードを使用します。U2 のファイル システムとプログラミング言語は非常に絡み合っているため、このことについて深く考える人はいません。私が使用したほとんどのシステムには、自由形式のレコード構造を持つ「SOMETHING.OR.OTHER.CTRL」のような名前のファイルが 1 つ以上あります。エディターは、"INVENTORY.CONSTANTS" のような機能を説明するキーを使用して、制御ファイル内のレコードにデータを詰め込むために使用されます。
間接参照の場合、複数値の「定数」名を持つ最初の属性と、同じく多値の「定数」値を持つ 2 番目のフィールドを使用してレコードを設定します。このような:
INVENTORY.CONSTANTS:
001: JOHN*PAUL*GEORGE*RINGO
001: 100*57*83*19833
(「*」は実際には値のマークです)。
次に、プログラムは次のことを行います。
SUBROUTINE SAMPLE(CONSTANT.NAME)
.
.
.
OPEN "","SOMETHING.OR.OTHER.CONTROL" TO CTRL.FILE ELSE BOMB
READ CONST.REC FROM CTRL.FILE, "INVENTORY.CONTSTANTS" THEN
LOCATE CONSTANT.NAME IN CONST.REC<1> SETTING CONST.POS THEN
CONST.VALUE = CONST.REC<2,CONST.POS>
END ELSE
BOMB
END
END ELSE
BOMB
END