Я пытаюсь лучше понять, как работают указатели на фортране и как их можно использовать в качестве аргумента для других функций.Программа работает следующим образом: в ней три записи: r0,rf
и long
.Затем функция linspace
генерирует равномерно распределенный массив от r0
до rf
.Затем вторая функция должна принять в качестве входных данных значения радиуса, взять квадрат каждого значения и сгенерировать новый массив.Вот код
module class_Circle
use, intrinsic :: iso_fortran_env, only: dp => real64
implicit none
type, public :: Circle(long)
integer,len :: long
real(dp) :: r0,rf
contains
procedure :: radius =>linspace
procedure :: area => circle_area
end type Circle
contains
function linspace(this) result(radius)
class(Circle(*)),intent(inout) :: this
real(dp),dimension(this%long) :: radius
integer :: i
real(dp) :: incremento,b
incremento = (this%rf-this%r0)/(1.0d0*(this%long-1))
b = (this%r0*this%long-this%rf)/(1.0d0*(this%long-1))
do i = 1,this%long
radius(i) = b+incremento*i
end do
end function linspace
function circle_area (this) result(area)
class(Circle(*)), intent(inout) :: this
real (dp), dimension(this%long):: area
integer :: i
real(dp), parameter :: pi =dacos(-1.0d0)
do i = 1,this%long
area(i) = pi * this%radius(i)**2
end do
end function circle_area
end module class_Circle
program circle_test
use, intrinsic :: iso_fortran_env, only: dp => real64
use class_Circle
implicit none
integer,parameter :: long = 3
type(Circle(long)) :: c
c%r0 = 1.5d0
c%rf = 3.0d0
print*, c%radius()
print*, c%area()
end program circle_test
Когда я его компилирую gfortran-8
Я получаю следующие ошибки
area(i) = pi * this%radius(i)**2.0d0
1
Error: ‘radius’ at (1) is not a member of the ‘Pdtcircle’ structure
objecttest03.f90:10:15:
procedure :: area => circle_area
1
Error: Argument ‘this’ of ‘circle_area’ with PASS(this) at (1) must be of
the derived-type ‘circle' objecttest03.f90:9:15:
procedure :: radius =>linspace
1
Error: Argument ‘this’ of ‘linspace’ with PASS(this) at (1) must be of the derived-type ‘circle’
Я не понимаю первую ошибку, потому что она определена в классе.Также я предполагаю, что следующие ошибки происходят из-за этой ошибки, так как я могу заставить эту работу работать?А также связанный вопрос, могу ли я указать на процедуру в разных модулях?