6.1.20 СТРУКТУРА и ЗАПИСЬ
Структуры записей — это расширение поставщика до Fortran-90 для создания пользовательских агрегатных типов данных. Поддержка структур записей в GNU Fortran может быть включена с помощью флага компиляции -fdec-structure. Если у вас есть выбор, вы должны использовать вместо этого «производные типы» Fortran 90, которые имеют другой синтаксис.
Во многих случаях структуры записей можно легко преобразовать в производные типы. Для преобразования замените STRUCTURE /имя_структуры/ на TYPE имя_типа. Кроме того, замените RECORD /имя_структуры/ на TYPE(имя_типа). Наконец, в доступе к компонентам замените точку (.) на знак процента (%).
Вот пример кода, использующего непереносимый синтаксис структуры записи:
! Declaring a structure named ``item'' and containing three fields: ! an integer ID, an description string and a floating-point price. STRUCTURE /item/ INTEGER id CHARACTER(LEN=200) description REAL price END STRUCTURE ! Define two variables, an single record of type ``item'' ! named ``pear'', and an array of items named ``store_catalog'' RECORD /item/ pear, store_catalog(100) ! We can directly access the fields of both variables pear.id = 92316 pear.description = "juicy D'Anjou pear" pear.price = 0.15 store_catalog(7).id = 7831 store_catalog(7).description = "milk bottle" store_catalog(7).price = 1.2 ! We can also manipulate the whole structure store_catalog(12) = pear print *, store_catalog(12)
Этот код можно легко переписать в синтаксисе Fortran 90 следующим образом:
! ``STRUCTURE /name/ ... END STRUCTURE'' becomes ! ``TYPE name ... END TYPE'' TYPE item INTEGER id CHARACTER(LEN=200) description REAL price END TYPE ! ``RECORD /name/ variable'' becomes ``TYPE(name) variable'' TYPE(item) pear, store_catalog(100) ! Instead of using a dot (.) to access fields of a record, the ! standard syntax uses a percent sign (%) pear%id = 92316 pear%description = "juicy D'Anjou pear" pear%price = 0.15 store_catalog(7)%id = 7831 store_catalog(7)%description = "milk bottle" store_catalog(7)%price = 1.2 ! Assignments of a whole variable do not change store_catalog(12) = pear print *, store_catalog(12)
GNU Fortran реализует СТРУКТУРЫ как производные типы со следующими правилами и исключениями:
- Структуры ведут себя как производные типы с атрибутом
SEQUENCE. В противном случае они могут не содержать спецификаторов. - Структуры могут содержать специальное поле с именем
%FILL. Это создаст анонимный компонент, к которому нельзя получить доступ, но который занимает место так же, как если бы в нём был объявлен компонент того же типа, что полезно для выравнивания. Например, следующая структура будет состоять как минимум из шестнадцати байт:structure /padded/ character(4) start character(8) %FILL character(4) end end structure
- Структуры могут иметь одинаковые имена с другими символами. Например, следующее недопустимо для производных типов, но допустимо для структур:
structure /header/ ! ... end structure record /header/ header
- Типы структур могут быть объявлены вложенными внутри другой родительской структуры. Синтаксис:
structure /type-name/ ... structure [/<type-name>/] <field-list> ...Имя типа может быть опущено, в этом случае тип структуры анонимный, и другие структуры того же типа не могут быть созданы. Ниже приведены некоторые примеры:
structure /appointment/ ! nested structure definition: app_time is an array of two 'time' structure /time/ app_time (2) integer(1) hour, minute end structure character(10) memo end structure ! The 'time' structure is still usable record /time/ now now = time(5, 30) ... structure /appointment/ ! anonymous nested structure definition structure start, end integer(1) hour, minute end structure character(10) memo end structure - Структуры могут содержать блоки
UNION. Для получения более подробной информации см. раздел СОЮЗ и КАРТА. - Структуры поддерживают инициализацию компонентов старого стиля, как описано в Инициализация переменных старого стиля. Для инициализаторов массивов инициализатор может содержать спецификацию повторения вида
<literal-integer> * <constant-initializer>. Значение целого числа указывает количество раз, которое нужно повторить константу инициализатора при расширении списка инициализаторов.
Далее: СОЮЗ и КАРТА, Предыдущий: Чтение/Запись после маркера EOF, Вверх: Реализованные расширения в GNU Fortran [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.4.0/gfortran/STRUCTURE-and-RECORD.html