您好我正在尝试使用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:
欢迎任何提示或建议。
答案 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它的主程序 与模块共享此变量(除非您将其声明为私有, 这不是你想要的,我猜)。