Spec-Zone.ru › GNU Fortran 6

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

Структуры записей — это расширение поставщика до Fortran-90 для создания пользовательских агрегированных типов данных. GNU Fortran не поддерживает структуры записей, а только «производные типы» 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. В противном случае они могут не содержать никаких спецификаторов.
  • Структуры могут иметь одинаковые имена с другими символами. Например, следующее недопустимо для производных типов, но допустимо для структур:
    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-6.4.0/gfortran/STRUCTURE-and-RECORD.html

Spec-Zone.ru

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