2015-02-27 1 views
1

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

readStr()(2:5) 

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

ответ

1

Нет, это невозможно в Фортране. Однако вы можете изменить свою функцию, чтобы взять дополнительный индексный массив, который определяет, какие элементы будут возвращены. Этот пример иллюстрирует эту возможность, используя интерфейс, позволяющий получить дополнительную спецификацию индексов (упрощенно благодаря комментарию от 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 
+0

Это хороший метод, позволяющий функции получить дополнительный индексный параметр. Этот параметр может быть «необязательным» параметром, и я думаю, что тогда две функции, которые вы написали, могут быть объединены в один. Я собираюсь попробовать это. –

+1

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

+0

@IanH Спасибо! Я этого не знал ... Я изменю свой ответ. –

1

No.

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

+0

спасибо. Мне было интересно, существует ли синтаксис, который мне не хватает. В этом случае, в соответствии с вашими ответами и ответами с пользователем @Vogt, я собираюсь позволить функции получить дополнительный параметр «необязательный» для этого, когда производительность может быть сильно затронута. –

Смежные вопросы