LINUX.ORG.RU

История изменений

Исправление snake266, (текущая версия) :

Я немного поменял:

module two_d
  use utility
  implicit none
  type map
     real, dimension(:), allocatable :: xs, hs
  end type map


contains
  function get_map() result(m)
    implicit none
    type(map) ::  m
    integer :: N, i
    character(len=10) :: file_name

    file_name = 'field2.txt'

    N = get_num_rows(file_name)

    allocate(m%xs(N))
    allocate(m%hs(N))

    open(unit = 1, file = file_name, status = 'old')
    do i = 1, N
       read (1, *) m%xs(i), m%hs(i)
    end do

    close(1)
    return
  end function get_map

end module

Если убрать dimension, то он начинает ругаться. Он правда и сейчас ругается на вызов и я еще разбираюсь почему:

gfortran -Wall -Wpedantic -Wextra utility.f90 two_d.f90 main.f90 
main.f90:4:20:

    4 |   print *, get_map()
      |                    1
Error: Data transfer element at (1) cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure

У тебя кстати вся функция как-то неправильно оформлена

Примеры смотрю тут http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/6-Fortran/

И вообще это не функция, а процедура, похоже.

Возможно, я еще разбираюсь чем оно отличается. В Raku они отличаются тем, что function умеет возвращать значение, а subroutine - нет

Исходная версия snake266, :

Я немного поменял:

module two_d
  use utility
  implicit none
  type map
     real, dimension(:), allocatable :: xs, hs
  end type map


contains
  function get_map() result(m)
    implicit none
    type(map) ::  m
    integer :: N, i
    character(len=10) :: file_name

    file_name = 'field2.txt'

    N = get_num_rows(file_name)

    allocate(m%xs(N))
    allocate(m%hs(N))

    open(unit = 1, file = file_name, status = 'old')
    do i = 1, N
       read (1, *) m%xs(i), m%hs(i)
    end do

    close(1)
    return
  end function get_map

end module

Если убрать dimension, то он начинает ругаться. Он правда и сейчас ругается на вызов и я еще разбираюсь почему:

gfortran -Wall -Wpedantic -Wextra utility.f90 two_d.f90 main.f90 
main.f90:4:20:

    4 |   print *, get_map()
      |                    1
Error: Data transfer element at (1) cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure

У тебя кстати вся функция как-то неправильно оформлена

Примеры смотрю тут http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/6-Fortran/

И вообще это не функция, а процедура, похоже.

Почему? Она возвращает значение поэтому функция.