Переменные типа Fortran равны нулю при обращении с помощью оператора% - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь получить доступ к элементам типа данных с помощью оператора%, но результат равен нулю.У меня есть пример кода ниже.

Строка print*, t%tsum всегда печатает ноль.Однако, когда я печатаю tsum в подпрограмме, это так и должно быть.

MODULE statistics

PUBLIC :: TimeMarker , start , finish , avgTime , begin , end_ , tsum ,  counts 

TYPE TimeMarker
  REAL*8 :: begin , end_ , tsum 
  INTEGER :: counts = 0
    CONTAINS
            PROCEDURE :: start => start_time
            PROCEDURE :: finish => finish_time
            PROCEDURE :: avgTime => averageTime
END TYPE TimeMarker


CONTAINS


        SUBROUTINE start_time(this)
        CLASS(timeMarker) , INTENT(INOUT) :: this
        CALL CPU_TIME(begin)
            END SUBROUTINE start_time      

            SUBROUTINE finish_time(this)
        CLASS(timeMarker) , INTENT(INOUT) :: this
        CALL CPU_TIME(end_)
        tsum = tsum + end_ - begin
        counts = counts + 1
            END SUBROUTINE finish_time          

            SUBROUTINE averageTime(this)
        CLASS(timeMarker) , INTENT(INOUT) :: this
        WRITE(*,*) "Average time : " , tsum/counts
            END SUBROUTINE averageTime   


END MODULE statistics



program test
  use statistics
  implicit none
  type(TimeMarker) :: t
  integer :: n , m
  real*8 :: a

  do m=1,50    
    call t%start
    do n=1,20000000
      a = sqrt(a)
    end do  

    print*, t%tsum

  end do
  call t%avgTime


end program test

1 Ответ

0 голосов
/ 26 августа 2018

В процедурах, связанных с типом, на компоненты переданного объекта все еще ссылаются, используя синтаксис argument_name % component_name. Не существует неявной переменной "this" для переданного объекта, как вы можете найти в других языках. Вы использовали this в качестве имени переданного аргумента - так, например, на компонент begin нужно ссылаться как this % begin, а не просто begin.

В рамках модуля действует неявная типизация - модуль не имеет оператора IMPLICIT NONE. Следовательно, переменные, которыми вы управляете в процедурах, связанных с типом, являются неявно объявленными переменными модуля, что означает, что компилятор не сообщает об ошибках.

В примере кода есть другие логические ошибки, с которыми необходимо будет справиться после исправления ссылок на компоненты.

(% не является оператором в Фортране, это всего лишь часть синтаксиса.)

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