Использование асинхронного атрибута в производных типах

В программе Fortran2003 я хочу создать производный тип, который включает в себя размещаемый массив с атрибутом asynchronous:

module async_in_type
  type async_array
    integer, dimension(:), allocatable, asynchronous :: a
  end type async_array
end module async_in_type

Когда я пытаюсь скомпилировать приведенный выше код с помощью GCC, я получаю следующее сообщение об ошибке:

$ gfortran -c -Wall -Wextra async_in_type.F90
GNU Fortran (GCC) 4.10.0 20140718 (experimental)
async_in_type.F90:3.52:

    integer, dimension(:), allocatable, asynchronous :: a
                                                1
Error: Attribute at (1) is not allowed in a TYPE definition

С NAG Fortran сообщение похоже:

$ nagfor -c async_in_type.F90 
NAG Fortran Compiler Release 6.0(Hibiya)
Product NPL6A60NA for x86-64 Linux
Error: async_in_type.F90, line 3: Syntax error
       detected at ,@ASYNCHRONOUS
[NAG Fortran Compiler pass 1 error termination, 1 error]

В чем причина такого ограничения? Можно ли обойти это ограничение?


person Alexander Pozdneev    schedule 19.12.2014    source источник
comment
Не многие люди подписаны на тег fortran2003.   -  person Vladimir F    schedule 19.12.2014


Ответы (2)


Сообщение компилятора точное и очень ясное, позвольте мне повторить его:

Error: Attribute at (1) is not allowed in a TYPE definition

Так что это просто не разрешено стандартом.

Вы должны поставить атрибут asynchronous к переменным типа async_in_type.

type(async_in_type), asynchronous :: x
person Vladimir F    schedule 19.12.2014
comment
Добавление атрибута «асинхронный» к переменным типа «async_in_type» не меняет семантику, не так ли? Могу ли я использовать «x%a» в контексте, требующем атрибута «асинхронный»? - person Alexander Pozdneev; 19.12.2014
comment
Да, вы можете использовать его, он действителен для всех компонентов. - person Vladimir F; 19.12.2014

Я добавлю поддержку к ответу Владимира Ф со ссылками (и некоторыми предположениями). Да, стандарт (Fortran 2008) не разрешает такое использование атрибута asynchronous.

Для компонентов производного типа см. 4.5.4.1, где указаны разрешенные атрибуты для компонента (R437). asynchronous просто нет в списке (dimension и allocatable вопроса есть).

Атрибут asynchronous описан в 5.3.4.

Сущность с атрибутом ASYNCHRONOUS — это переменная, которая может подвергаться асинхронному вводу/выводу.

Это частично мотивирует ограничение: определяемый компонент сам по себе не является переменной. Возможно, размещением атрибута в определении вы хотите сказать, что все переменные этого типа имеют компоненты с этим атрибутом.

Как говорит Владимир Ф., атрибут указывается (возможно, даже неявно — см. 9.6.2.5 — так что это явное подтверждение не может быть слишком хлопотным бременем) в объекте производного типа. Даже если бы это было не так, скажем

asynchronous :: x%a ! Using Vladimir F's terminology

затем в 5.3.4 также говорится, что базовый объект переменной с этим атрибутом также должен иметь этот атрибут. Кроме того, мы знаем, что подобъекты объекта с этим атрибутом имеют атрибут, поэтому «братья» асинхронного компонента также должны быть асинхронными.

Если мы придем к вопросу «почему у нас не может быть некоторых компонентов с атрибутом, а некоторых без?» тогда мы должны размышлять, но здесь по крайней мере представлены доказательства того, что авторы стандарта думали об этой возможности, прежде чем отвергнуть ее.

Наконец, R427 (в 4.5.2.1) исключает случай type, asynchronous :: async_array

person francescalus    schedule 13.03.2015
comment
Если вы хотите знать, почему это не разрешено, лучше всего задать вопрос на форуме comp.lang.fortran , где вы найдете множество членов комитета по стандарту Fortran. - person ; 14.03.2015