我对使用gfortran的构造非常满意,直到我用ifort尝试它。虽然我还没有看到它清楚地记录下来。我只是尝试了它并且它有效。我很好奇,但我怎么能调整以下样本,以便ifort 11.1可以咀嚼它。
module A
use iso_c_binding
implicit none
interface
function foo(x) bind(C, name="strlen")
use, intrinsic :: iso_c_binding
character(c_char), intent(in) :: x
integer(c_size_t) :: foo
end function foo
end interface
end module A
module B
use A
! use A, foo0 => foo
implicit none
interface foo
module procedure foo1
procedure foo
end interface foo
contains
function foo1(x)
real, intent(in) :: x
real :: foo1
foo1 = 2. * x
end function foo1
end module B
program C
use B
implicit none
write (*,*) foo(C_CHAR_"Hello" // C_NULL_CHAR)
write (*,*) foo(2.)
end program C
以下是我收到的错误消息
tst.f90(20): error #6643: This statement is incorrectly positioned.
procedure foo0
-----^
tst.f90(20): error #8168: Parentheses are required after the PROCEDURE keyword.
procedure foo0
-----^
它是GNU扩展吗? -pedantic
不抱怨。它的工作原理我希望它可以工作
5
4.00000000
我是否必须在接口foo中写入完整的详细信息foo0声明?
更新2013-03-31
我调整了上面的示例代码以包含bind(C)
。由于它位于interface
,因此即使使用gfortran也无法使用module
。我为以前的不当修剪示例误导道歉。
另一次更新2013-03-31
显然ifort version 13.1.1
不支持这样的结构(无论我是否将foo重命名为foo0)
tst.f90(22): error #6623: The procedure name of the INTERFACE block conflicts with a name in the encompassing scoping unit. [FOO]
procedure foo
---------------^
tst.f90(22): error #8574: A procedure-name in a generic interface block must be a nonintrinsic procedure that has an explicit interface. [FOO]
procedure foo
---------------^
如果我在程序之前添加module
,我会
tst.f90(22): error #7950: Procedure name in MODULE PROCEDURE statement must be the name of accessible module procedure. [FOO]
module procedure foo
----------------------^
除非我在所有细节中再次显式声明bind(C)接口,否则看起来目前无法做我想要的事情:(
答案 0 :(得分:5)
这是Fortran 2003功能:
“当指定MODULE时,procedure-name_list只能包含模块过程。当未指定MODULE时,procedure-name_list可能包含过程指针,外部过程,虚拟过程或模块过程。”
您的版本11.1已过时,当前版本为13,但我不确定它是否现在受支持。
在这种情况下,在您的编译器版本完全支持Fortran 2003之前,可以使用module procedure
:
“如果出现MODULE关键字,则每个过程名称必须是模块过程,并且必须在当前范围内可访问。”
答案 1 :(得分:2)
foo
使用C函数,似乎foo
不能是模块过程。中间函数可用作解决方法:
module A
use, intrinsic :: iso_c_binding
implicit none
interface
function strlen(x) bind(C, name="strlen")
use, intrinsic :: iso_c_binding
character(kind=c_char, len=1), dimension (*), intent(in) :: x
integer(c_size_t) :: strlen
end function strlen
end interface
contains
function foo (x)
character(kind=c_char, len=*), intent(in) :: x
integer (c_size_t) :: foo
foo = strlen (x)
end function foo
end module A
module B
use A
! use A, foo0 => foo
implicit none
interface foo
module procedure foo1
module procedure foo
end interface foo
contains
function foo1(x)
real, intent(in) :: x
real :: foo1
foo1 = 2. * x
end function foo1
end module B
program C
use B
implicit none
write (*,*) foo(C_CHAR_"Hello" // C_NULL_CHAR)
write (*,*) foo(2.)
end program C