2015-10-02 3 views
4

Есть ли способ автоматически инициализировать постоянный массив указателей на процедуры?Автоматическая инициализация массивов указателей процедуры

У меня есть куча подпрограмм, которые нужно вызывать в зависимости от значения целочисленной переменной. Вместо использования инструкции 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 
+0

Я смог избавиться от большинства сообщений об ошибках, поместив подпрограммы в другой модуль. Тем не менее компилятор Cray сообщает: «Выражение инициализации должно быть константой, которая должна использоваться с назначением PARAMETER для объекта« SUBS ».« Инициализация указателя автономной процедуры для одной из этих подпрограмм работает хорошо. –

+2

Инициализация отдельного указателя процедуры для одной из этих подпрограмм работает хорошо, но гайка для указателя процедуры PARAMETR! Для компилятора синтаксическая ошибка заключается в использовании «PARAMETER» в контексте указателя процедуры, у меня нет времени проверять ограничения в стандарте, но, вероятно, не разрешено иметь постоянные указатели на процедуру и инициализировать их в существующую подпрограмму , –

ответ

1

Я думаю, что это (ваш закомментирована «Было бы хорошо ...» Тип декларации о) просто требует (работает) поддержки Fortran 2008. Чтобы быть действительным в постоянном выражении, компонент в конструкторе структуры, соответствующий компоненту указателя, может быть целью инициализации (7.1.12p1 3b). Для компонента указателя процедуры, целью инициализации является начальный-proc-target, который позволяет (помимо прочего) выполнять процедуру неэлементарного модуля, что и есть sub110 и sub2.