背景:GCC 10 取消了对调用具有不同类型参数的子程序的支持。GCC 10删除了对调用不同类型参数的子程序的支持。我的目的是要写一个既能尊重 integer, dimension(:)
和 integer
.
(这意味着我不能使用其他选项,比如将标量嵌入一个数组中。我必须改变接口)
根据 GCC文件:
可以提供符合标准的代码,通过使用一个明确的接口,允许不同类型的参数。
TYPE(*)
.
和:
不过,请注意,
TYPE(*)
仅接受标量参数,除非DIMENSION
是明确指定的。由于DIMENSION(*)
只支持数组(包括数组元素)而不支持标量,它不能完全替代C_LOC
. 另一方面: 假定类型假定等级虚参数(TYPE(*), DIMENSION(..)
)允许标量和数组。但需要在callee端用特殊代码来处理数组描述符。
在下面的接口中,我有 type(*), dimension(:) :: data
. 如何根据我上面强调的文字进行修改?
module z
interface
subroutine a(data)
type(*), dimension(:) :: data
end subroutine a
end interface
contains
subroutine b(data)
integer :: data
call a(data)
end subroutine
subroutine c(data)
integer, dimension(:) :: data
call a(data)
end subroutine
end module
我不知道GCC 10删除了什么(你的来源是什么?),但正是由于你提到的原因,GCC还引入了指令
!GCC$ attributes no_arg_check::A
(见 在Fortran中,任何类型的数组的过程 )
已经在其他编译器中使用,它使程序能够被任意参数、标量或任意级别的数组调用,主要用于接受任意类型缓冲区的例程,特别是在MPI库中。
新的 DIMENSION(..)
并不适合在Fortran中使用,它需要特殊的代码来理解标准的Fortran数组描述符,而且主要是希望用C语言编写。https:/gcc.gnu.orgonlinedocsgfortranFurther-Interoperability-of-Fortran-with-C.html#Further-Interoperability-of-Fortran-with-C。 gfortran不 不 但又支持标准数组描述符。