自动类型转换(类型转换)如何在Fortran中运行?

Yog*_*dav 3 fortran gfortran fortran90

我正在使用gfortran编译器.还告诉我gfortran在执行自动类型转换(类型转换)时是否使用Fortran标准之外的其他内容.

cas*_*sey 7

赋值由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))
Run Code Online (Sandbox Code Playgroud)

这意味着任何表达式(expr)都将隐式转换为它所分配的变量的类型和种类.对于字符类型,派生类型和其他任何内容,请参阅标准.

另请注意,Fortran仅在分配和初始化期间执行此类转换,但不执行过程调用等上下文.例如,请考虑以下过程:

subroutine sub1(a)
 implicit none
 integer :: a     
 print *, a  
end subroutine
Run Code Online (Sandbox Code Playgroud)

此过程具有integer类型的伪参数.例如,你不能这样做:

call sub1(1.d0)
Run Code Online (Sandbox Code Playgroud)

因为这会导致实际和伪参数之间的类型不匹配.

但是,您可以这样做:

integer :: a
a = 1.d0     !implicitly interpreted as: a = INT(1.d0, kind=kind(a))
call sub1(a)
Run Code Online (Sandbox Code Playgroud)

因为为赋值定义了隐式转换.


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,因此任何编译器都可以自由地拒绝它.此扩展旨在允许遗留代码使用现代编译器进行编译,而不是用于新代码.