Прямое индексирование возвращаемого значения функции в фортране
Есть ли возможность использовать индексирование непосредственно по возвращаемому значению функции? Что-то вроде этого:
readStr()(2:5)
где readStr()
это функция, которая возвращает символьную строку Во многих других языках это вполне возможно, но как насчет Фортрана? Синтаксис в моем примере, конечно, не компилируется. Есть ли другой синтаксис, который будет использоваться?
2 ответа
Нет, это не возможно в Фортране. Однако вы можете изменить свою функцию, чтобы получить дополнительный индексный массив, который определяет, какие элементы возвращаются. Этот пример иллюстрирует эту возможность, используя интерфейс, позволяющий необязательную спецификацию индексов (значительно упрощенную благодаря комментарию 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
Вы можете избежать объявления другой переменной, если используете associate
. Пользователь должен решить, лучше или яснее, чем временная переменная. Результат все равно нужно где-то хранить.
associate(str=>readStr())
print *, str(2:5)
end associate
Это не будет очень полезно для этого конкретного случая с потенциально длинной строкой, но может быть более полезным для других подобных случаев, которые здесь связаны как дубликаты.
Нет.
Но если это вас беспокоит, вы можете написать свои собственные пользовательские функции и операторы для достижения аналогичного результата, не сохраняя результат ссылки на функцию в отдельной переменной.