我正在为Fortran中的显式接口苦苦挣扎。
在一个实例中,当我尝试使用假定形状的数组作为函数或子例程(即过程)的伪参数时,编译器请求我编写一个显式接口:Explicit interface required for ... assumed-shape argument
。例如,它在子例程中看起来像REAL, INTENT(IN OUT) :: dummy_array(:)
。数组声明中的(:)
意味着编译器负责将有关数组形状的信息传递给子例程。这很方便,但这也意味着编译器必须知道在编译调用或对该过程的引用时要执行此操作。仅从CALL
(或引用)来看,这是不明显的,因此编译器必须具有有关过程的伪参数的信息,因此需要显式接口。
据我了解,有三种方法可以在Fortran中实现显式接口:
MODULE
的{{1}}程序。这往往是推荐的方法。CONTAINS
语句之前放置CONTAINS
语句。然后,我的过程的整个代码将放在这两个语句之间。END
。我想大多数人都默认使用此方法,但是它往往是最少推荐的方法,因为这可能会比较费力。这使我想到了当前的问题:在另一个实例中,编译器给出了INTERFACE
。以下是上述方法1的相关部分:
Explicit interface required for ... allocatable argument
问题似乎出在伪数组MODULE My_Module
CONTAINS
SUBROUTINE Clean(my_array_sizes, my_arrays, my_arrays_clean)
USE Shared, ONLY : dp
IMPLICIT NONE
...
REAL(dp), INTENT(OUT), ALLOCATABLE, ASYNCHRONOUS :: my_arrays_clean(:)
...
ALLOCATE(my_arrays_clean(non_zero)) !new array of correct size
my_arrays_clean = temp(1:non_zero) !transfer values
END SUBROUTINE Clean
END MODULE My_Module
上。这是电话:
my_arrays_clean
CALL Clean(my_array_size, probability, probability_clean) !remove empty values from array
的声明:
probability_clean
在我尝试使用 REAL(dp), DIMENSION(:), ALLOCATABLE, ASYNCHRONOUS :: probability, probability_clean !store Photon(E_i, depth) values
:gfortran -g -std=f2008 -Wall -Wextra -O2 -fall-intrinsics -fopenmp
进行编译之前,一切似乎都很好。我不知道怎么了当然,我可以解决这个问题来完成我需要的工作,但是我真的很想了解执行此操作的正确方法。
答案 0 :(得分:1)
当我们谈论一个显式(或隐式)接口时,我们不是在谈论过程本身的属性。一个过程具有一个接口,但这不是完全相同的概念。如下所示,获取模块和子例程。
module mod
contains
subroutine sub
end subroutine
end module
子例程sub
有一个接口,包括这样的信息,因为它是一个名为sub
的子例程,没有伪参数。问题中感兴趣的子例程具有其自己的对应接口。
“显式接口”代替的是,在引用过程时,已知有关过程接口的哪些信息。看
call sub
end
并与
进行比较use mod, only : sub
call sub
end
在第一种情况下,在不使用模块mod
的情况下,编译器甚至无法将sub
视为模块内的子例程。 sub
是带有隐式接口(而不是模块中的接口)的外部过程。在第二个中,sub
是 use related ;
同样,内部过程(使用contains
语句的项目2)在其宿主中始终具有显式接口 :
call sub
contains
subroutine sub
end subroutine
end program
第三,带有接口块:
subroutine sub
end subroutine
interface
subroutine sub
end subroutine
end interface
call sub
end program
总结:可访问模块过程始终具有可用的显式接口,但是必须首先使用use
语句使它们可访问。内部过程始终可以在主机中访问,始终使用显式接口。接口块提供了一个显式接口,但同样,接口块本身必须位于过程引用所在的位置。