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>. Значение целого числа указывает количество повторений постоянного инициализатора при расширении списка инициализаторов.
Далее: СОЮЗ и КАРТА, Предыдущее: Чтение/запись после маркера конца файла, Вверх: Расширения, реализованные в GNU Fortran [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gfortran/STRUCTURE-and-RECORD.html