Так, в принципе вы могли бы решить эту проблему с чем-то вдоль этих линий:
SUBROUTINE CONDACT(i,j, iab11,iab22,xx2,yy2,zz2,b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2,res)
!declaration to all those parameters and res
res = f(x)
END SUBROUTINE CONDACT
function f(x,iab11,iab22,xx2,yy2,zz2,b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2)
!declaration to all those parameters
end function f
program
...
call CONDAT(i,j,iab11,iab22,xx2,yy2,zz2,b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2,res)
end program
То есть, просто передавая параметры через. Настоятельно рекомендуется использовать модули, см. Ответ Александра МакФарлейна, хотя это не требуется. Александр МакФарлейн показывает, как передать f в качестве аргумента в подпрограмму, чтобы вы могли использовать разные функции в подпрограмме, но ваш код, похоже, не требует этого.
Теперь это ужасный длинный список параметров, и вы, вероятно, не хотите носить с собой все это время. Обычный подход к решению этого вопроса состоит в том, чтобы поместить эти параметры в derived datatype, а затем просто передать это. Как это:
!> A module implementing ellip related stuff.
module ellip_module
implicit none
type ellip_type
!whatever datatypes these need to be...
integer :: b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2
end type
end module ellip_module
!> A module implementing condact related stuff.
module condact_module
use ellip_module ! Make use of the ellip module to have the type available
implicit none
type condact_type
!whatever datatypes these need to be...
integer :: iab11,iab22,xx2,yy2,zz2
end type
contains
subroutine condact(i,j, con, ellip, res)
integer :: i,j
type(condact_type) :: con
type(ellip_type) :: ellip
real :: res
real :: x
res = f(x, con, ellip)
end subroutine condact
function f(x, con, ellip) result(res)
real :: x
real :: res
type(condact_type) :: con
type(ellip_type) :: ellip
res = !whatever this should do
end function f
end module condact_module
!> A program using the condact functionality.
program test_condact
use ellip_module
use condact_module
implicit none
type(condact_type) :: mycon
type(ellip_type) :: myellip
integer :: i,j
real :: res
call condact(i,j, mycon, myellip, res)
end program test_condact
Это просто грубый набросок, но у меня сложилось впечатление, что это то, что вы ищете.
процедуры принимают аргументы. Передавайте данные в качестве аргументов и используйте их при вызове других. – casey
Не могли бы вы предоставить определенный код, чтобы показать, что вы на самом деле не понимаете? Как сказал Кейси, в основном нет разницы в передаче аргументов подпрограммам или процедурам, поэтому для меня это немного немного непонятно, к чему стремится ваш вопрос. – haraldkl
Спасибо Кейси и Харальдл. Я редактировал свой вопрос с примера. Мой вопрос заключается в том, как передать переменные в общем блоке «контакт и эллип» из подпрограммы «CONDAT» в функцию f (x) без использования общего блока. – sam