Spec-Zone.ru › GNU Fortran 11

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

Далее: СОЮЗ и КАРТА, Предыдущее: Чтение/Запись после маркера EOF, Вверх: Расширения, реализованные в GNU Fortran [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gfortran/STRUCTURE-and-RECORD.html

Spec-Zone.ru

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