Прямое индексирование возвращаемого значения функции в фортране

Есть ли возможность использовать индексирование непосредственно по возвращаемому значению функции? Что-то вроде этого:

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

Это не будет очень полезно для этого конкретного случая с потенциально длинной строкой, но может быть более полезным для других подобных случаев, которые здесь связаны как дубликаты.

Нет.

Но если это вас беспокоит, вы можете написать свои собственные пользовательские функции и операторы для достижения аналогичного результата, не сохраняя результат ссылки на функцию в отдельной переменной.

Другие вопросы по тегам