Моя конечная цель состоит в том, чтобы иметь универсальную функцию отображения на Фортране, т.е. функцию, которая принимает массив произвольного типа A и функцию типа A-> B, применяет эту функцию ко всем элементам данного массива и возвращаетмассив типа B. Я не смог реализовать это с массивом, поэтому я решил начать с одного элемента, но даже это не работает.
Вот моя попытка:
program main
integer :: elem_int
elem_int = 1
elem_int = to_int(apply_func(elem_int, add_one_int))
print *, elem_int
contains
! don't know any other way to cast class(*) to int
function to_int(unbound) result(res)
class(*), intent(in) :: unbound
integer :: res
select type (unbound)
type is (integer)
res = unbound
end select
end function
function apply_func(elem, func) result(new_elem)
class(*) :: elem
class(*) :: func
class(*), allocatable :: new_elem
! not sure if this allocation is needed
allocate(new_elem, source = elem)
new_elem = func(elem)
end function
function add_one_int(num) result(res)
integer :: num
integer :: res
res = num + 1
end function
end program
Этот код компилируется, но завершается с ошибкой сегментации в строке
new_elem = func(elem)
Я подумал, может быть, он думает, что func является массивом, и пытается проиндексировать его, поэтому я попытался определить абстрактный интерфейс следующим образом:
abstract interface
function any_func(x)
class(*) :: x
class(*), allocatable :: any_func
end function
end interface
И изменил объявление func
на procedure(any_func)
, но затем мой компилятор (ifort 18.0.1) выдает следующую ошибку:
error #7069: The characteristics of the associated actual function result differ from the characteristics of the dummy function result. [ADD_ONE_INT]
Я хочуинтерфейс такой, что любая 1-аргументная функция ему соответствует, но, видимо, это был неправильный способ объявить это.Есть идеи, как заставить это работать?Заранее спасибо.