2014-12-19 180 views
2

在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] 

這種限制的原因是什麼?是否有可能克服這個限制?

+0

沒有多少人訂閱了fortran2003標籤的情況。 – 2014-12-19 11:56:38

回答

3

編譯器的消息是準確和清晰的,讓我再說一遍:

所以它根本不被標準所允許。

你必須把asynchronous屬性async_in_type類型的變量。

type(async_in_type), asynchronous :: x 
+0

將「異步」屬性置於類型爲「async_in_type」的變量不會更改語義,請執行此操作嗎?我可以在需要'異步'屬性的上下文中使用'x%a'嗎? – 2014-12-19 12:35:27

+1

是的,您可以使用它,它適用於所有組件。 – 2014-12-19 12:48:17

0

我會添加支持Vladimir F's answer與引用(和一些猜測)。是的,(Fortran語言2008)標準不允許這種使用asynchronous屬性。

對於派生類型的組分,看4.5.4.1其中對於一個部件的允許的屬性給出(R437)。 asynchronous只是沒有列出(dimension和問題allocatable是)。

asynchronous屬性5.3.4

與異步屬性的實體中描述的是,可能會受到異步輸入/輸出的變量。

這部分地激發了限制:定義的組件本身並不是一個變量。也許你想說的將屬性放在定義中的意思是,這種類型的所有變量都具有該屬性的組件。

正如弗拉基米爾˚F說,該屬性指定(甚至暗示 - 見9.6.2.5 - 所以這明確確認,可能不會太麻煩的負擔)的派生類對象上。即使它不是,比如說

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

然後5.3.4還說,帶有該屬性的變量的基礎對象也應該具有該屬性。我們還知道具有該屬性的對象的子對象具有該屬性 - 因此異步組件的「同級」也必須是異步的。

如果我們走到「爲什麼我們不能有屬性,有的一些部件沒有?」那麼我們必須推測,但至少有證據表明,標準的作者在拒絕之前就考慮過這種可能性。

最後,R427(在4.5.2.1)排除了type, asynchronous :: async_array

+1

如果你想知道爲什麼這是不允許的,最好的論壇可能會是comp.lang.fortran,你會發現很多Fortran標準的comittee成員。 – 2015-03-14 12:10:06