OpenVMS инициализация типов записей
У меня есть какой-то унаследованный код, который я пытаюсь улучшить... один из подходов, который мне нравится использовать, - это использование структур для организации данных, а не операций эквивалентности.... дрожь. Это на OpenVMS Fortran 6.4, который я понимаю как Fortran77 плюс кое-что (может быть неправильно).
Я хочу инициализировать переменную записи следующим образом:
structure /my_data/
integer*2 var1
integer*2 var2
character*5 NameTag
end structure
record /my_data/ OrganizedData
data OrganizedData /1, 2, 'Fred '/
Я знаю, что утверждение данных является ошибкой, так сказал мне компилятор. Проверка в файлах справки, кажется, что DATA не поддерживает переменные записи в этой версии. Кто-нибудь может подтвердить? Любые предложения для инициализации чего-то подобного, кроме прямых назначений?
3 ответа
У меня есть только руководство по Oracle (Sun), но не от OpenVMS, но оно реализует то же расширение VAX (совершенно нестандартное!). Там нет описанного конструктора структуры, который вы могли бы использовать для создания значений структуры в одном выражении.
Это также говорит:
Поля записи не допускаются в общих операторах.
Записи и поля записей не допускаются в состояниях DATA,EQUIVALENCE или NAMELIST.
Поля записи не допускаются в операторе SAVE.
Если вы можете использовать компилятор, который принимает Fortran 90, вы можете использовать
type my_data
integer*2 var1
integer*2 var2
character*5 NameTag
end type
type(my_data) :: OrganizedData
OrganizedData = my_data(1, 2, 'Fred')
(Я оставил там также нестандартные * обозначения.)
Вот как вы делаете это в DEC Fortran:
structure /my_data/
integer*2 var1 /1/
integer*2 var2 /2/
character*5 NameTag /'Fred'/
end structure
record /my_data/ OrganizedData
end
Обратите внимание, что инициализации имеют тип - это даст одинаковые начальные значения для всех переменных этого типа.
Для этой версии DEC FORTRAN, если вы хотите разные значения для каждого экземпляра, я думаю, вам нужно инициализировать поля записи во время выполнения.
OrganizedData.var1 = 1 ! etc.
Есть хитрости, такие как использование COMMON и создание PSECT MACRO Assembler, который инициализирует значения во время компиляции, но я предполагаю, что это не то, что вы ищете. (Дайте мне знать, если вы).
Кроме того, я забываю, если это 6.4 или нет, но получение переданного аргумента со статической инициализацией вызовет ошибку или предупреждение компилятора.