Формы массива и указателя - PullRequest
       17

Формы массива и указателя

4 голосов
/ 21 февраля 2012

Может кто-нибудь объяснить мне, почему не работает следующая программа и как заставить ее работать? В основной программе я размещаю указатель, в подпрограмме sub я ищу форму массива и получаю неправильные значения.

  program test
    real, pointer, dimension(:,:,:) :: arr
    allocate(arr(3,5,7))
    print *, "In test: ",shape(arr)
    call sub(arr)
    print *, "Back in test: ",shape(arr)
  end program test

  subroutine sub(arr)
    real, pointer, dimension(:,:,:) :: arr
    print *, "In sub: ",shape(arr)
  end subroutine

Выход:

 In test:            3           5           7
 In sub:     12694064           1           3
 Back in test:            3           5           7

Спасибо

PS: я использую gfortran (gcc 4.4.3)

РЕДАКТИРОВАТЬ: с gfortran 4.6 этот код просто не компилируется. Я получаю ошибку:

Пустой аргумент 'arr' процедуры 'sub' в (1) имеет атрибут, который требует явного интерфейса для этой процедуры

1 Ответ

9 голосов
/ 21 февраля 2012

Чтобы использовать «расширенные» функции Fortran 90/95/2003/2008, интерфейсы процедур (подпрограммы и функции) должны быть известны вызывающей стороне.Это называется «явным» интерфейсом.Gfortran 4.6 рассказал вам, в чем проблема.Самый простой способ - поместить ваши процедуры в модуль.Попробуйте это:

module mysubs
implicit none
contains
  subroutine sub(arr)
    real, pointer, dimension(:,:,:) :: arr
    print *, "In sub: ",shape(arr)
  end subroutine
end module mysubs

program test
    use mysubs
    implicit none
    real, pointer, dimension(:,:,:) :: arr
    allocate(arr(3,5,7))
    print *, "In test: ",shape(arr)
    call sub(arr)
    print *, "Back in test: ",shape(arr)
end program test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...