Грешка в общата процедура на 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