Как сделать связанные с типом процедуры Фортрана в параметризованном производном типе? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь лучше понять, как работают указатели на фортране и как их можно использовать в качестве аргумента для других функций.Программа работает следующим образом: в ней три записи: 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’

Я не понимаю первую ошибку, потому что она определена в классе.Также я предполагаю, что следующие ошибки происходят из-за этой ошибки, так как я могу заставить эту работу работать?А также связанный вопрос, могу ли я указать на процедуру в разных модулях?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...