Есть ли способ автоматически инициализировать постоянный массив указателей на процедуры?Автоматическая инициализация массивов указателей процедуры
У меня есть куча подпрограмм, которые нужно вызывать в зависимости от значения целочисленной переменной. Вместо использования инструкции select case
я хотел бы использовать указатели на процедуры, как указано ниже. Однако было бы неплохо, если бы я мог пропустить явную инициализацию массива указателей процедуры и просто определить его как постоянный массив обернутых указателей процедур. Приведенный ниже код демонстрирует файлик, Закомментированный линии указывают на цели, я хотел бы достичь:
module testmod
implicit none
abstract interface
subroutine subInterface()
end subroutine subInterface
end interface
type :: SubPtr
procedure(subInterface), nopass, pointer :: ptr
end type SubPtr
! Would be nice to use something like this:
!type(SubPtr), parameter :: subs(2) = [ SubPtr(sub1), SubPtr(sub2) ]
contains
subroutine sub1()
print *, "SUB1"
end subroutine sub1
subroutine sub2()
print *, "SUB2"
end subroutine sub2
end module testmod
program test
use testmod
implicit none
type(SubPtr) :: subs(2)
integer :: ii
! Would be nice to get rid of those two initialization lines
subs(1) = SubPtr(sub1)
subs(2) = SubPtr(sub2)
! Testing procedure pointer array
do ii = 1, 2
call subs(ii)%ptr()
end do
end program test
Я смог избавиться от большинства сообщений об ошибках, поместив подпрограммы в другой модуль. Тем не менее компилятор Cray сообщает: «Выражение инициализации должно быть константой, которая должна использоваться с назначением PARAMETER для объекта« SUBS ».« Инициализация указателя автономной процедуры для одной из этих подпрограмм работает хорошо. –
Инициализация отдельного указателя процедуры для одной из этих подпрограмм работает хорошо, но гайка для указателя процедуры PARAMETR! Для компилятора синтаксическая ошибка заключается в использовании «PARAMETER» в контексте указателя процедуры, у меня нет времени проверять ограничения в стандарте, но, вероятно, не разрешено иметь постоянные указатели на процедуру и инициализировать их в существующую подпрограмму , –