Нет, это невозможно в Фортране. Однако вы можете изменить свою функцию, чтобы взять дополнительный индексный массив, который определяет, какие элементы будут возвращены. Этот пример иллюстрирует эту возможность, используя интерфейс, позволяющий получить дополнительную спецификацию индексов (упрощенно благодаря комментарию от IanH):
module test_mod
implicit none
contains
function squareOpt(arr, idx) result(res)
real, intent(in) :: arr(:)
integer, intent(in), optional :: idx(:)
real,allocatable :: res(:)
real :: res_(size(arr))
integer :: stat
! Calculate as before
res_ = arr*arr
if (present(idx)) then
! Take the sub-set
allocate(res(size(idx)), stat=stat)
if (stat /= 0) stop 'Cannot allocate memory!'
res = res_(idx)
else
! Take the the whole array
allocate(res(size(arr)), stat=stat)
if (stat /= 0) stop 'Cannot allocate memory!'
res = res_
endif
end function
end module
program test
use test_mod
implicit none
real :: arr(4)
integer :: idx(2)
arr = [ 1., 2., 3., 4. ]
idx = [ 2, 3]
print *, 'w/o indices',squareOpt(arr)
print *, 'w/ indices',squareOpt(arr, idx)
end program
Это хороший метод, позволяющий функции получить дополнительный индексный параметр. Этот параметр может быть «необязательным» параметром, и я думаю, что тогда две функции, которые вы написали, могут быть объединены в один. Я собираюсь попробовать это. –
Чтобы использовать значение необязательной переменной при определении характеристик результата функции, сделайте результат распределяемым и характеристику отложенной. – IanH
@IanH Спасибо! Я этого не знал ... Я изменю свой ответ. –