首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OOP和Fortran90

OOP和Fortran90
EN

Stack Overflow用户
提问于 2018-05-12 02:19:05
回答 3查看 357关注 0票数 2

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

在Fortran中,您使用模块创建类。在编写integer, parameter :: dp = selected_real_kind(15,307)语句时,我面临编译错误。这是我的学术准则。它是一个使用抽象类的简短代码。

代码语言:javascript
复制
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

编译器返回我的消息如下:

代码语言:javascript
复制
integer, parameter :: dp = selected_real_kind(15,307)
                          1

错误:名称'dp‘at (1)是模组'class_rectangle’Main.f90:81.13中对'dp‘的模糊引用:

代码语言:javascript
复制
  real(dp) :: area
         1

错误:名称'dp‘at (1)是模组'class_rectangle’Main.f90:84.30中对'dp‘的模糊引用:

欢迎任何提示或建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-12 16:00:59

始终尝试将USE语句与ONLY一起使用。如果您这样做,您将不会遇到歧义错误,您会得到。此外,您只需快速查看代码的顶部行,就可以从每个模块确切地了解代码中使用的是什么。因此,您的主程序头可以如下所示:

代码语言:javascript
复制
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等人所著的“现代Fortran解释”一书。

票数 1
EN

Stack Overflow用户

发布于 2018-05-12 02:34:08

根据编译器的不同,您应该会得到非常有用的消息。

代码语言:javascript
复制
module a
end module a

program b
    implicit none
    use a
end program b

并汇编:

代码语言:javascript
复制
$ 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)
票数 0
EN

Stack Overflow用户

发布于 2018-05-12 11:53:13

只需省略:整型,参数::dp = selected_real_kind(15,307)在主程序中!通过主程序USEing class_Rectangle,它与模块共享这个变量(除了您声明它是私有的,我想这不是您想要的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50302311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档