Fortran 中函数 return 值的直接索引
Direct indexing of function return value in Fortran
是否可以直接对函数的 return 值使用索引?像这样:
readStr()(2:5)
其中 readStr()
是一个函数,它 return 是一个字符串或数组。在许多其他语言中这是很有可能的,但是 Fortran 呢?我示例中的语法当然不会编译。是否还有其他语法可以使用?
没有。
但如果这让您感到困扰,您可以编写自己的用户定义函数和运算符来实现类似的结果,而不必将函数引用的结果存储在单独的变量中。
不,这在 Fortran 中是不可能的。但是,您可以更改您的函数以获取一个额外的索引数组来确定返回哪些元素。这个例子说明了这种可能性,使用一个接口来允许索引的可选规范(由于 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
对于这个字符串可能很长的特定情况,它不是很有用,但对于在此处作为重复链接的其他类似情况可能更有用。
是否可以直接对函数的 return 值使用索引?像这样:
readStr()(2:5)
其中 readStr()
是一个函数,它 return 是一个字符串或数组。在许多其他语言中这是很有可能的,但是 Fortran 呢?我示例中的语法当然不会编译。是否还有其他语法可以使用?
没有。
但如果这让您感到困扰,您可以编写自己的用户定义函数和运算符来实现类似的结果,而不必将函数引用的结果存储在单独的变量中。
不,这在 Fortran 中是不可能的。但是,您可以更改您的函数以获取一个额外的索引数组来确定返回哪些元素。这个例子说明了这种可能性,使用一个接口来允许索引的可选规范(由于 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
对于这个字符串可能很长的特定情况,它不是很有用,但对于在此处作为重复链接的其他类似情况可能更有用。