Невозможно передать определенную часть массива Fortran без ошибок

Как упоминалось в заголовке, у меня возникают проблемы при попытке передать часть массива в подпрограмму (называемую Example, см. ниже) в Fortran 95.

Мой код имеет следующий макет:

    PROGRAM Code

    DOUBLE PRECISION, DIMENSION(72) :: Array1

!Method 1
    CALL EXAMPLE(Array1)

!Method 2
    CALL EXAMPLE(Array1(1:72))

    END PROGRAM Code


    SUBROUTINE EXAMPLE(Array1)

    DOUBLE PRECISION, DIMENSION(72) :: Array1

    END

Метод 1 (см. выше) работает нормально, однако при использовании метода 2 появляется сообщение об ошибке, в котором говорится, что этот аргумент слишком мал для заявленного размера. Если я объявил размер 72 и перешел от 1:72, почему это привело бы к указанной выше ошибке.

Причина, по которой я не могу использовать метод 1, заключается в том, что размер массива может измениться/часть массива, которую я передаю подпрограмме, может быть другой.

Например, я могу передать подпрограмме первые 36 элементов (т.е. 1:36), а затем передать последние 36 элементов (т.е. 37:72). Я также позаботился о том, чтобы изменить заявленный размер массива в EXAMPLE соответственно, чтобы он соответствовал тому, что я ввожу.

Есть идеи, почему это не работает для меня?


person GrumpyMike    schedule 12.03.2015    source источник
comment
Я немного удивлен, что первый звонок сработал для вас. Если я запускаю это через gfortran, я получаю предупреждение: более актуальные, чем формальные аргументы в вызове процедуры в (1) для обоих вызовов.   -  person    schedule 12.03.2015
comment
Я должен был добавить, что я могу заставить его работать с gfortran как есть, а также с Plato Silverfrost на «Release Win32» без ошибок. Однако, когда я пытаюсь скомпилировать с помощью Plato Silverfrost на «Checkmate .NET» или «Checkmate Win32», я получаю сообщение об ошибке, которое указал в своем исходном сообщении. Я не слишком знаком с разницей между двумя компиляторами на Платоне (может дело не в моем коде, может это что-то уникальное для Платона Checkmate?) Спасибо за помощь!   -  person GrumpyMike    schedule 13.03.2015


Ответы (1)


Лучший способ — использовать массив предполагаемой формы, где фиктивный аргумент принимает форму фактического аргумента. Для этого подпрограмме нужен явный интерфейс; лучший способ - поместить его в модуль.

Ну вот так:

module foo
  implicit none
contains
  subroutine example(array1)
    double precision, dimension(:), intent(in) :: array1
    print *,size(array1)
    print *,array1
  end subroutine example
end module foo

program main
   use foo
   implicit none
   double precision, dimension(72) :: array1
   array1 = 42.d0
   call example (array1)
   call example (array1(1:36))
end program main
person Community    schedule 12.03.2015
comment
Спасибо за Ваш ответ. Я забыл включить это в свой вопрос выше, однако я включил его в свой фактический код. я отредактировал исходный пост - person GrumpyMike; 13.03.2015
comment
В исходном коде фиктивный аргумент отсутствовал. Это больше не соответствует вопросу, поэтому я довольно сильно редактирую вопрос. - person ; 13.03.2015
comment
@IanH: Спасибо за редактирование - я никогда не могу понять терминологию предполагаемой формы и предполагаемого размера. Одно из худших терминологических решений в информатике. - person ; 13.03.2015