Ошибка общей процедуры Fortran: не может быть общей

Я знаю, что вы можете создавать общие процедуры, используя абстрактные типы, как здесь:

объявление класса fortran фиктивного аргумента

Но могу ли я сделать то же самое со следующим кодом?

module proc_mod
  public :: forced,ideal
  interface forced;    module procedure forced1;    end interface
  interface forced;    module procedure forced2;    end interface
contains

function forced1() result(forced)
 implicit none
 integer:: forced
 forced = 1
end function

function forced2(t) result(forced)
 implicit none
 integer,intent(in) :: t
 integer:: forced
 forced = t
end function

function ideal() result(i)
 implicit none
 integer:: i
 i = 2
end function

end module

program procTest
  use proc_mod
  implicit none

  integer :: n

  procedure(forced), pointer:: funPointer => NULL()

  write(*,'(A)') "Please enter the type of vortex calculation you wish to use."
  read(*,*) n                                                                  

  select case( n )
    case( 1 );    funPointer => forced
    case( 2 );    funPointer => ideal
    case default; funPointer => ideal
  end select

  write(*,'(A,I3)') "You chose function: ", funPointer()

  stop
end program

Прямо сейчас я получаю сообщение об ошибке: funPointer не может быть универсальным. Я уверен, что есть способ обойти это, но я не знаком с общими процедурами.


person Charles    schedule 07.03.2015    source источник


Ответы (1)


Нет, вы не можете сделать указатель процедуры на общую процедуру. Вы также не можете передавать общие процедуры в качестве фиктивного аргумента. Вы должны всегда выбирать одну конкретную функцию.

Возможно, вам следует объяснить, каково ваше намерение, а не просто показать какой-то код и спросить, можно ли это сделать по-другому. Но в любом случае имейте в виду, что дженерики Fortran используются для диспетчеризации времени компиляции.

person Vladimir F    schedule 07.03.2015
comment
Спасибо. Прошу прощения за не корректную постановку вопроса. Я не совсем уверен, что я пытаюсь сделать, и я думаю, что это часть проблемы. Еще раз спасибо @Vladimir - person Charles; 07.03.2015