gpt4 book ai didi

interface - 如何在 Fortran 界面中使用用户定义类型

转载 作者:行者123 更新时间:2023-12-04 23:58:23 24 4
gpt4 key购买 nike

在 Fortran 2003 模块中,我定义了一个名为 t_savepoint 的类型。然后,我想为一个名为 fs_initializesavepoint 的子例程定义一个接口(interface)。 ,它采用 t_savepoint 类型的对象作为唯一的论据。

这是整个模块的代码:

module m_serialization

implicit none

type :: t_savepoint
integer :: savepoint_index
real :: savepoint_value
end type t_savepoint

interface

subroutine fs_initializesavepoint(savepoint)
type(t_savepoint) :: savepoint
end subroutine fs_initializesavepoint


end interface

end module m_serialization

我想要这样一个接口(interface)的原因是稍后我会让这个 fortran 模块与 C 互操作。

如果我尝试编译它(gfortran-4.7.0),我会收到以下错误消息:
            type(t_savepoint) :: savepoint
1
Error: The type of 'savepoint' at (1) has not been declared within the interface

如果我在子例程中移动类型的定义,错误就会消失;但是如果我想在许多子程序中使用相同的类型,我应该在所有子程序中重复定义吗?

先感谢您。

编辑 : 一种解决方案是将类型的定义移到另一个模块上,然后移到 use它在每个子程序中。但是我不太喜欢这个解决方案,因为类型 t_savepoint并且子程序是同一概念主题的一部分。

最佳答案

在接口(interface) block 中正确或错误地,您无法通过主机关联访问环境。要解决此问题,您需要显式导入数据类型:

[luser@cromer stackoverflow]$ cat type.f90
module m_serialization

implicit none

type :: t_savepoint
integer :: savepoint_index
real :: savepoint_value
end type t_savepoint

interface

subroutine fs_initializesavepoint(savepoint)
Import :: t_savepoint
type(t_savepoint) :: savepoint
end subroutine fs_initializesavepoint


end interface

end module m_serialization
[luser@cromer stackoverflow]$ gfortran -c type.f90

这是f2003。

但是,我怀疑您提出的方式表明您不会以最佳方式对其进行编码。更好的是将例程本身放在模块中。然后你根本不需要介意界面:
module m_serialization

implicit none

type :: t_savepoint
integer :: savepoint_index
real :: savepoint_value
end type t_savepoint

Contains

Subroutine fs_initializesavepoint(savepoint)

type(t_savepoint) :: savepoint

Write( *, * ) savepoint%savepoint_index, savepoint%savepoint_value

End Subroutine fs_initializesavepoint

end module m_serialization
[luser@cromer stackoverflow]$ gfortran -c type.f90

鉴于模块实际上是为处理连接实体而设计的,这确实是在 Fortran 中执行此操作的方式。它还具有只需要 f95 编译器的优点,因此是普遍可用的(尽管公认的导入是通常实现的)

关于interface - 如何在 Fortran 界面中使用用户定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857867/

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