你好,我正在尝试学习使用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)是模组'class_rectangle’Main.f90:81.13中对'dp‘的模糊引用:
real(dp) :: area
1错误:名称'dp‘at (1)是模组'class_rectangle’Main.f90:84.30中对'dp‘的模糊引用:
欢迎任何提示或建议。
发布于 2018-05-12 16:00:59
始终尝试将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等人所著的“现代Fortran解释”一书。
发布于 2018-05-12 02:34:08
根据编译器的不同,您应该会得到非常有用的消息。
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)发布于 2018-05-12 11:53:13
只需省略:整型,参数::dp = selected_real_kind(15,307)在主程序中!通过主程序USEing class_Rectangle,它与模块共享这个变量(除了您声明它是私有的,我想这不是您想要的)。
https://stackoverflow.com/questions/50302311
复制相似问题