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

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

readStr()(2:5)

где readStr() — это функция, которая возвращает строку символов или массив. Во многих других языках это вполне возможно, но как насчет Фортрана? Синтаксис в моем примере конечно не компилируется. Можно ли использовать какой-либо другой синтаксис?


person hamid attar    schedule 27.02.2015    source источник


Ответы (3)


Нет, на Фортране это невозможно. Однако вы можете изменить свою функцию, чтобы она принимала дополнительный индексный массив, определяющий, какие элементы возвращаются. Этот пример иллюстрирует эту возможность с использованием интерфейса, позволяющего указать необязательную спецификацию индексов (значительно упрощенную благодаря комментарию 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
person Alexander Vogt    schedule 27.02.2015
comment
Это хороший способ позволить функции получить дополнительный параметр индекса. Этот параметр может быть «необязательным» параметром, и я думаю, что тогда две написанные вами функции можно объединить в одну. Я собираюсь попробовать это. - person hamid attar; 27.02.2015
comment
Чтобы использовать значение дополнительной переменной при определении характеристик результата функции, сделайте результат выделяемым, а характеристику отложенной. - person IanH; 27.02.2015
comment
@IanH Спасибо! Я этого не знал... Я изменю свой ответ. - person Alexander Vogt; 27.02.2015

No.

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

person IanH    schedule 27.02.2015
comment
Благодарю. Мне было интересно, существует ли синтаксис, который мне не хватает. В этом случае, в соответствии с вашими ответами и ответами Александра @Vogt, я позволю функции получить дополнительный «необязательный» параметр индекса для этого, когда производительность может резко пострадать. - person hamid attar; 27.02.2015

Вы можете избежать объявления другой переменной, если используете associate. Будет ли это лучше или понятнее, чем временная переменная, должен решать пользователь. Результат в любом случае должен быть где-то сохранен.

 associate(str=>readStr())
   print *, str(2:5)
 end associate

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

person Vladimir F    schedule 17.04.2020