Константы в пике / база данных UniVerse - PullRequest
3 голосов
/ 11 февраля 2011
  1. Как объявить постоянное значение в базе данных PICK / UniVerse?
  2. Как передать аргумент функции с помощью ссылки на константу?

Некоторая информация содержится вруководство IBM по базе данных UniVerse о константах, но ничего конкретного.

Обратите внимание, что:

Значение оператора DEFINE

- это не то, что я ищу, потому что оно заменяетоператор со значением во время компиляции и не обеспечивает реального соответствия значения.

Кто-нибудь знает, как их объявить?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2011

Это то же утверждение, что и в UniData (родственная база данных UniVerse; оба вместе обозначаются как U2), а именно: EQU и EQUATE

Например:

EQU statement TO value

Я не совсем уверен, что вы имеете в виду под пунктом 2, но я раскрою это. По умолчанию все параметры передаются по ссылке, но в качестве аргумента const не используется. Это все еще позволит вам изменить значение параметра внутри функции / подпрограммы, но результаты не будут влиять на значения уравнений в вызывающей программе / функции / подпрограмме.


Примечание: Если вы хотите убедиться, что подпрограмма / функция не изменяет значение фактической переменной, которую вы передаете (передача по значению), вы можете либо присвоить ее временной переменной и передать ее, либо заключить в скобки

Например:

CALL MySub(PassByRef, (PassByValue))

() создает временную копию PassByValue, а затем передает временную копию по ссылке. Это останавливает изменения, распространяющиеся обратно в PassByValue

2 голосов
/ 15 января 2013

Вам не нужно определять переменные, прежде чем они будут использованы в Pick/Universe.

Чтобы назначить переменную, определенную во время компиляции, используйте

EQU PI TO 3.14

Чтобы назначить его во время выполнения, используйте

PI = 3.14

Основным отличием здесь является то, что однажды назначенная во время компиляции, используя EQUATE, переменная не может быть переназначена, тогда как когда она назначена во время выполнения, это может быть. Поэтому компиляция во время компиляции обычно резервируется исключительно для констант, тогда как присваивание во время выполнения может использоваться как для констант, так и для стандартных значений переменных.

1 голос
/ 07 апреля 2011

Я бы использовал операторы EQUATE для создания констант, и если вы хотите, чтобы они были доступны нескольким программам, вы должны поместить их в свои собственные записи и использовать оператор $ INCLUDE для переноса определений в другие программы.Обратите внимание, что все значения будут установлены во время компиляции.

Что касается «констант», которые устанавливаются в другое время, отличное от времени компиляции, или косвенно ссылаются на значения через теги (передавая постоянную ссылку),большинство программистов U2 используют какие-то контрольные записи.Поскольку файловая система и язык программирования в U2 настолько взаимосвязаны, никто никогда не задумывается об этом.В большинстве систем, которые я использовал, есть один или несколько файлов, называемых что-то вроде «SOMETHING.OR.OTHER.CTRL» со структурами записи в свободной форме.Редактор используется для вставки данных в записи в управляющем файле с помощью клавиш, описывающих функцию, например, «INVENTORY.CONSTANTS».

Для косвенных ссылок установите запись с первым атрибутом, имеющим «константу»Имена многозначные и второе поле с «постоянными» значениями, также многозначными.Например:

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
...