我希望这不是一个太愚蠢的问题,但有可能有函数或子程序,我可以传递数组的类型,如
subroutine foo(array, arr_type)
implicit none
arr_type, dimension(:) :: array
*Do something with array*
end subroutine
还是我必须为每个可能的arr_type写一个子程序(例如整数,双精度,......)并用接口重载子程序?
答案 0 :(得分:3)
是和否......您可以使用接口将多个函数/子例程与不同的伪参数捆绑在一起:
module foos
interface foo
module procedure foo_real
module procedure foo_int
end interface
contains
subroutine foo_real( a )
implicit none
real,intent(inout) :: a(:)
! ...
end subroutine
subroutine foo_int( a )
implicit none
integer,intent(inout) :: a(:)
! ...
end subroutine
end module
我知道没有(简单)传递具有任意 basic 类型的数组的可能性。你可以看看transfer
- 但是有龙; - )
答案 1 :(得分:0)
您可以尝试使用Fortran 2003的无限多态。写下你的子程序有点像这样:
subroutine foo(array)
implicit none
class(*), dimension(:) :: array
! Do something with array
end subroutine
从缩写代码的角度来看,这不会为你节省太多,因为你可能需要编写像
这样的东西use, intrinsic :: iso_fortran_env, only : real32, real64
.
.
.
select type (element=>array(1))
type is (real(real32))
! Code for 32-bit reals
type is (real(real64))
! Code for 64-bit reals
type is (integer)
! Code for integers of default kind
class is (shape)
! Code for shapes
class default
! Sweep up everything else
end select
但是你最终可能会写出尽可能多的线条,就像你遵循亚历山大·沃格特完全明智的做法一样。
编辑后,发表评论
这种方法不会提供什么,因为Fortran不在任何类型的层次结构中包含其内在类型,是一个代码,如
select type (element=>array(1))
class is (number)
! Code for any type and kind of Fortran number
那会很有用,但我不认为它会很快发生。