Spec-Zone.ru › GNU Fortran 12

5.1.22 СТРУКТУРА и ЗАПИСЬ

Структуры записей являются расширением поставщика до 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-12.1.0/gfortran/STRUCTURE-and-RECORD.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API