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 или нет, но получение переданного аргумента со статической инициализацией вызовет ошибку или предупреждение компилятора.

Другие вопросы по тегам