Direct indexing of function return value in Fortran

前端 未结 3 767
南旧
南旧 2020-12-02 00:30

Is there possibility to use indexing directly on a function\'s return value? Something like this:

readStr()(2:5)

where readStr()

相关标签:
3条回答
  • 2020-12-02 01:08

    No, that is not possible in Fortran. You could, however, alter your function to take an additional index array that determines which elements are returned. This example illustrates this possibility using an interface to allow for an optional specification of the indices (simplified greatly thanks to the comment by 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 讨论(0)
  • 2020-12-02 01:22

    You can avoid declaring another variable if you use associate. Whether it is any better or clearer than a temporary variable must be decided by the user. The result has to be stored somewhere anyway.

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

    It will not be very useful for this specific case with a potentially long string but might be more useful for other similar cases that get linked here as duplicates.

    0 讨论(0)
  • 2020-12-02 01:23

    No.

    But if it bothers you, you can write your own user defined functions and operators to achieve a similar outcome without having to store the result of the function reference in a separate variable.

    0 讨论(0)
提交回复
热议问题