Инициализация константы со значением переменной - PullRequest
4 голосов
/ 15 января 2012
program main
   real, parameter :: a = 1 
   !real :: a
   !a=1

   res = func(a)
   write(*,*) res

end program main

function func(a)
   real, parameter :: b=a+1  !(*)
   func = b
   return
end function func

Мой компилятор жалуется на строку, помеченную (*).Есть ли способ установить значение константы со значением, выходящим за пределы этой функции?

Ответы [ 2 ]

17 голосов
/ 15 января 2012

Вы не можете объявить «b» в качестве параметра, поскольку его значение не является постоянным во время компиляции, так как оно зависит от аргумента функции.

Хорошей идеей является использование «неявного ни одного», поэтомучто вы обязательно объявите все переменные.Также поместите ваши процедуры в модуль и «используйте» этот модуль так, чтобы интерфейс был известен вызывающей стороне.Как в:

module my_funcs
implicit none
contains

function func(a)
   real :: func
   real, intent (in) :: a
   real :: b
   b = a + 1
   func = b
   return
end function func

end module my_funcs

program main
   use my_funcs
   implicit none
   real, parameter :: a = 1
   real :: res

   res = func(a)
   write(*,*) res

end program main
8 голосов
/ 16 января 2012

@ MSB ответ хорош, если для вас приемлема инициализация во время выполнения.Если вы действительно хотите использовать Fortran parameter, установленный во время компиляции, вы можете сделать это следующим образом:

program main
  implicit none
  real, parameter :: a = 1.0
  real :: res

  res = func()
  write(*,*) res

contains
  function func()
    real, parameter :: b = a + 1.0
    real :: func
    func = b
  end function func
end program main

Я подозреваю, что некоторая путаница связана с различиями в языке.Часто «параметр» используется для обозначения аргумента функции, но в Фортране он никогда не используется таким образом.Вместо этого это означает что-то похожее на const в C / C ++.Итак, из вашего вопроса мне не ясно, действительно ли вы хотите Fortran parameter или нет.

В моем примере выше параметр a известен внутри func через hostассоциация , которая является языком Fortran для вложенных областей.Вы также можете сделать это с модулями, через используйте ассоциацию , но это немного более подробно:

module mypars
  implicit none
  real, parameter :: a = 1.0
end module mypars

module myfuncs
  implicit none
contains
  function func()
    use mypars, only: a
    real, parameter :: b = a + 1.0
    real :: func
    func = b
  end function func
end module myfuncs

program main
  use myfuncs, only: func
  implicit none
  real :: res
  res = func()
  print *, res
end program main
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...