ошибки при преобразовании программы в модуль с подпрограммой - PullRequest
0 голосов
/ 03 октября 2019

Учитывая простую программу, которая работает просто отлично, например:

program test
implicit none
real, allocatable :: x(:)
real :: su, si
allocate(x(3))
x(:) = (/1,2,3/)
su=sum(x(:))
si=size(x(:))
end program

Я пытался преобразовать ее во внешний модуль с подпрограммой:

module test
implicit none
real, allocatable, intent(in) :: x(:)
real, intent(out) :: su, si
contains
subroutine sumsize(x(:),su,si)
    su=sum(x(:))
    si=size(x(:))
end subroutine
end module

Однако я не могу получитьон скомпилирован с несколькими сообщениями об ошибках, большинство из которых, на мой взгляд, основаны на x(:), su и si, которые не являются DUMMY переменными.

Где и как определяются макеты? Кажется, что это простая формальная ошибка.

Другая ошибка сообщает о нежелательной памяти в заголовке подпрограммы и исчезает при ее определении с помощью subroutine sumsize(x,su,si). Почему вход для подпрограммы не может быть вектором?

Компиляция с gfortran - gcc v. 8.3.0-6 (Debian) через gfortran -ffree-form -c module_test.f -o test.o.

1 Ответ

2 голосов
/ 03 октября 2019

Пустые аргументы, также называемые параметрами функции в других языках программирования, должны быть объявлены внутри функции или подпрограммы.

Кроме того, список аргументов (имена аргументов в скобках после имени подпрограммы) не должен содержатьлюбые дополнительные скобки.

module test
  implicit none

contains

  subroutine sumsize(x,su,si)    
    real,  intent(in) :: x(:)
    real, intent(out) :: su, si

    su=sum(x(:))
    si=size(x(:))
  end subroutine
end module

Кроме того, вы обычно не хотите, чтобы фиктивный аргумент был allocatable. Это обычно используется, когда массив выделяется или освобождается внутри подпрограммы или если вы хотите разрешить работу с нераспределенным массивом.

program test
  implicit none

  real, allocatable :: main_x(:)
  real :: main_su, main_si

  allocate(main_x(3))
  main_x(:) = (/1,2,3/)

  call  sumsize(main_x, main_su, main_si)
end program

Я переименовал переменные с префиксом main_. Это не нужно, просто чтобы прояснить, что они отличаются от имен внутри подпрограммы.

...