【发布时间】:2021-05-17 10:23:30
【问题描述】:
我希望派生类型具有相同的行为,因此我想为抽象类定义一个接口。 所以我写了我的程序如下,但是我得到了一个编译错误。
如何修复我的程序?
PROGRAM main
IMPLICIT NONE
TYPE, ABSTRACT :: Point
REAL :: x, y
CONTAINS
PROCEDURE(Imove), DEFERRED :: move
END TYPE Point
INTERFACE
SUBROUTINE Imove(self, d)
IMPORT Point
CLASS(Point), INTENT(INOUT) :: self
REAL, INTENT(IN) :: d
END SUBROUTINE Imove
END INTERFACE
TYPE, EXTENDS(Point) :: Point3d
REAL :: z
CONTAINS
PROCEDURE :: move => Point3d_move
END TYPE Point3d
TYPE(Point3d) :: p1
p1 = Point3d(1.0, 2.0, 3.0)
p1%move(4.0)
PRINT *, p1%x, p1%y, p1%z
CONTAINS
SUBROUTINE Point3d_move(self, d)
TYPE(Point3d), INTENT(INOUT) :: self
REAL :: d
self%x = self%x + d
self%y = self%y + d
self%z = self%z + d
END SUBROUTINE Point3d_move
END PROGRAM main
环境
- 操作系统:macOS Catalina
- Fortran 编译器:GNU Fortran (Homebrew GCC 10.2.0) 10.2.0
Error: 'point3d_move' must be a module procedure or an external procedure with an explicit interface at (1)
【问题讨论】:
-
另外,您还没有将子例程接口声明为
abstract interface -
我刚刚意识到这是一个程序,而不是一个模块。现在没有时间正确回答,但我 90% 确定您不能使用内部程序进行绑定。将与 Points 相关的东西放在模块中,在程序中使用。
-
另外Point3D_move的接口与Imove不一致。
-
'point3d_move' 必须是模块过程或外部过程使用模块,而不是内部过程
-
我刚刚研究了 Metcalf、Reid 和 Cohen “现代 Fortran”的相关部分,我在那本书中找不到将内部子程序作为类型绑定的声明绑定程序是非标准的。但是那本书,虽然很好,但不是标准,所以我会把它留给知道那个文件的人来肯定地回答它是否被禁止。但是使用内部子程序肯定是一个非常奇怪的设计,模块会很常见,而且我有一个带有上述模块的版本,如果没有其他答案,我会发布。
标签: oop fortran fortran2003