2015-06-10 77 views
2

我正在使用gfortran編譯器。同時告訴我gfortran在執行自動類型轉換(類型轉換)時是否使用Fortran標準以外的其他東西。Fortran中的自動類型轉換(類型轉換)如何工作?

+2

你爲什麼會想象gfortran表現不符合標準? –

+0

我不是。我只是問,如果它確實如我所讀,有些編譯器使用非標準擴展。 –

+0

我不明白爲什麼我一直在這裏downvoted。 –

回答

6

賦值由Fortran 2008第7.2節定義。值得注意的是Cl。 7.2.1.3第8段:

對於固有賦值語句,其中變量是數字類型的,所述EXPR可以具有不同的數值 類型或種類的類型參數,在這種情況下expr的值被轉換爲變量類型和種類類型參數 根據表7.9的規則。

表7.9:數字轉換和賦值語句

Type of variable  Value Assigned 
integer    INT(expr , KIND = KIND (variable)) 
real     REAL(expr , KIND = KIND (variable)) 
complex    CMPLX(expr , KIND = KIND (variable)) 

這意味着任何表達式(expr)將被隱式轉換爲它被分配給該變量的類型和種類。對於字符類型,派生類型和其他任何內容,請參閱標準。

另請注意,Fortran只在賦值和初始化期間執行此類轉換,但不會像過程調用那樣執行上下文。例如,請考慮以下過程:

subroutine sub1(a) 
implicit none 
integer :: a  
print *, a 
end subroutine 

此過程具有integer類型的僞參數。例如,您不能這樣做:

call sub1(1.d0) 

因爲這會導致實際參數和僞參數之間的類型不匹配。因爲隱式轉換爲分配定義

integer :: a 
a = 1.d0  !implicitly interpreted as: a = INT(1.d0, kind=kind(a)) 
call sub1(a) 

你可以,但是,做到這一點。


唯一記錄擴展在gfortran隱式類型轉換(5.1.0)的標準分配期間是邏輯和整數類型之間。

參見:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gfortran/Implicitly-convert-LOGICAL-and-INTEGER-values.html#Implicitly-convert-LOGICAL-and-INTEGER-values

  • 邏輯.true.被轉換爲整數1
  • 邏輯.false.被轉換爲整數0
  • 整數0轉換爲.false.
  • 任何其他整數轉換爲.true.

請注意,如果您可以不使用傳統擴展,那麼請不要使用它們。使用它們意味着你的程序不是標準的Fortran,因此任何編譯器都可以自由地拒絕它,因爲它是不正確的。此擴展旨在允許使用現代編譯器編譯舊代碼,而不是用於新代碼。

+0

謝謝,但我的主要問題是所有在Fortran中進行的隱式類型轉換。 –

+0

@YogeshYadav看我的編輯 – casey