Вот (вложенная) версия, которая делает то, что вы хотите, и ваша версия, которая не соответствует стандарту Fortran,
program test
implicit none
integer a ! note that a has be defined here because it is used as a VARIABLE in the association list below
associate ( a => 6, b => 2*a )
print*, b
end associate
associate ( a => 6 )
associate ( b => 2*a )
print*, b
end associate
end associate
end program
Вот выходные данные программы, скомпилированной Gfortran,
$gfortran -std=gnu main.f90 -o main
$main
483386368
12
Согласно стандарту Фортрана, конструкция associate
позволяет связать имя либо с переменной, либо со значением выражения, для продолжительности блока .Вот общий синтаксис:
[ construct-name: ] associate ( association-list )
block
end associate [ construct-name ]
Поэтому я считаю, что использование вами конструкции associate
не соответствует стандарту.По сути, в вашем коде компилятор предполагает, что a
в b => 2*a
в списке ассоциаций относится к переменной a
, которая уже была определена вне ассоциированной конструкции и списка (в отличие от имени a
, котороеопределяется в списке ассоциаций).
Как и предполагал @HighPerformanceMark, вложенные associate
конструкции, подобные приведенному выше примеру, могут достичь желаемой цели.