Ссылка на ассоциированное имя в другом ассоциирующем объекте в той же конструкции ASSOCIATE - PullRequest
0 голосов
/ 17 октября 2018

Я прошу прощения, если мой стандарт не очень хорош, но разве следующий законный Fortran 2008?

program test
  implicit none

  associate ( a => 6, b => 2*a )
    print*, b
  end associate

end program

Мой компилятор жалуется на то, что a не объявлен и не имеет неявного типа.

Редактировать:

Я думаю, что селекторможет быть только выражением или переменной и никогда не может быть ассоциированным именем или выражением, включающим его.Это тот случай?

1 Ответ

0 голосов
/ 17 октября 2018

Вот (вложенная) версия, которая делает то, что вы хотите, и ваша версия, которая не соответствует стандарту 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 конструкции, подобные приведенному выше примеру, могут достичь желаемой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...