gpt4 book ai didi

fortran - 我怎样才能 "re-export"一个现有的 bind(C) 函数,在 Fortran 模块中重载,在其名称下带有 ifort?

转载 作者:行者123 更新时间:2023-12-03 23:08:35 27 4
gpt4 key购买 nike

在尝试使用 ifort 之前,我对与 gfortran 配合良好的结构感到非常满意。虽然我从来没有看到它被清楚地记录下来。我刚刚试过了,它奏效了。我很好奇如何调整以下示例,以便 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

我是否必须在接口(interface) foo 中详细写下 foo0 声明?

2013 年 3 月 31 日更新

我调整了上面的示例代码以包含 bind(C)。由于它驻留在 interface 中,因此我无法使用 module 即使是 gfortran。我为之前不恰当的缩减示例误导而道歉。

另一个更新 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) 接口(interface) :(

最佳答案

这是 Fortran 2003 的一个特性:

“当指定 MODULE 时,procedure-name_list 只能包含模块过程。当未指定 MODULE 时,procedure-name_list 可能包含过程指针、外部过程、伪过程或模块过程。”

您的版本 11.1 已过时,当前版本为 13,但我不确定现在是否支持它。

在这种情况下,在您的编译器版本完全支持 Fortran 2003 之前,可以使用 module procedure:

“如果出现 MODULE 关键字,则每个过程名称都必须是模块过程,并且必须在当前范围内可访问。”

来源:IBM XL Fortran manual

关于fortran - 我怎样才能 "re-export"一个现有的 bind(C) 函数,在 Fortran 模块中重载,在其名称下带有 ifort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com