OOP和Fortran90

时间:2018-05-12 02:19:06

标签: oop fortran

您好我正在尝试使用Fortran学习面向对象编程(我的所有代码都是用Fortran 90编写的),我部分了解C ++,但我想继续使用Fortran。

在Fortran中,您可以使用模块进行课程学习。我在编写integer, parameter :: dp = selected_real_kind(15,307)语句时遇到编译错误。这是我的学术代码。它是一个使用抽象类

的简短代码
module class_Rectangle
  implicit none
  integer, parameter :: dp = selected_real_kind(15,307)
  type Rectangle
     real(dp) :: a,b
  end type Rectangle
contains
  subroutine area_rectangle(area,info)
    implicit none
    real(dp), intent(out) :: area
    type(Rectangle), intent(in) ::  info

    area = info%a * info%b

  end subroutine area_rectangle
end module class_Rectangle

program Main
  use class_Rectangle
  use class_Circle
  implicit none

  integer, parameter :: dp = selected_real_kind(15,307)

  interface compute_area
     module procedure area_rectangle, area_circle
  end interface compute_area

  type(Rectangle) :: geoA
  type(Circle) :: geoB
  real(dp) :: area

  geoA = Rectangle(2.0d0,4.0d0)
  call area_rectangle(area,geoA)
  write(*,*) 'Rectangle area:', area
  geoB = Circle(1.0d0)
  call area_circle(area,geoB)
  write(*,*) 'Circle area:',area

end program Main

编译器返回的消息如下:

integer, parameter :: dp = selected_real_kind(15,307)
                          1

错误:姓名' dp' at(1)是对'dp'的模糊引用。来自module' class_rectangle' main.f90时:81.13:

  real(dp) :: area
         1

错误:姓名' dp' at(1)是对'dp'的模糊引用。来自module' class_rectangle' main.f90时:84.30:

欢迎任何提示或建议。

3 个答案:

答案 0 :(得分:1)

始终尝试将USE语句与ONLY一起使用。如果这样做,您将不会遇到模糊错误。此外,您只需快速查看代码的顶行,就可以确切地知道每个模块的代码中使用的内容。因此,您的主程序标题可能如下所示:

program Main

use class_Rectangle, only: Rectangle, area_rectangle
use class_Circle, only: Circle, area_circle
implicit none


integer, parameter :: dp = selected_real_kind(15,307)

interface compute_area
        module procedure area_rectangle, area_circle
end interface

type(Rectangle) :: geoA
type(Circle) :: geoB
real(dp) :: area

geoA = Rectangle(2.0d0,4.0d0)
call area_rectangle(area,geoA)
write(*,*) 'Rectangle area:', area
geoB = Circle(1.0d0)
call area_circle(area,geoB)
write(*,*) 'Circle area:',area

end program Main

有关Fortran中OOP编程的优秀教程,有一些很好的例子,请参阅Metcalf等人的“Modern Fortran Explained”一书

答案 1 :(得分:0)

根据你的编译器,你应该得到非常有用的消息

module a
end module a

program b
    implicit none
    use a
end program b

编译:

$ gfortran mod_test.F90
mod_test.F90:6:9:

     implicit none
                 2
     use a
         1
Error: USE statement at (1) cannot follow IMPLICIT NONE statement at (2)

答案 2 :(得分:0)

省略:整数,参数:: dp = selected_real_kind(15,307) 在主程序中!通过USEing class_Rectangle它的主程序 与模块共享此变量(除非您将其声明为私有, 这不是你想要的,我猜)。