考虑以下功能
ELEMENTAL FUNCTION int2str(i) RESULT(s)
INTEGER, INTENT(IN) :: i
CHARACTER(LEN = 50) :: appo
CHARACTER(LEN = :), ALLOCATABLE :: s
WRITE(appo, '(I0)') i
ALLOCATE(s, source = TRIM(appo))
END FUNCTION int2str
作为元素的函数是一个标量函数(在我的例子中,它需要一个标量整数并返回一个标量字符,即使长度可分配),它也是元素应用于数组。
为什么输出
print *, '>>>'//int2str([1, 3, 5, 7])//'<<<'
(意外地对我而言)
>>>1<<<>>>3<<<>>>5<<<>>>7<<<
而
的输出print *, '>>>', int2str([1, 3, 5, 7]), '<<<'
是(预期)
>>>1357<<<
我的意思是该函数应该应用于组成数组的四个标量整数中的每一个,因此返回一个长度为4的数组,每个元素都是一个字符串,但在我看来,它的元素依赖性适用三个字符串的整个连接,好像//
运算符优先于函数的结果。
答案 0 :(得分:3)
对于字符串联,表达式
'>>>'//['1','3','5','7']
取决于标量'>>>'
和数组['1','3','5','7']
。与操作数为标量和秩为1的数组的其他内部二进制运算一样,表达式为rank-1数组。
在确定表达式的值时,标量操作数被视为类似
的数组['>>>','>>>','>>>','>>>']
,表达式相当于
['>>>','>>>','>>>','>>>'] // ['1','3','5','7']
最后,表达式具有值,其中元素是成对的操作数:
['>>>1','>>>3','>>>5','>>>7']
你可以看到与表达式
的相似之处9+[1,3,5,7] ! [9,9,9,9]+[1,3,5,7] --> [10,12,14,16]
当有两个集中操作时,结果显而易见。
请注意,我没有根据元素函数的结果来表达这一点。这部分是因为数组来自函数的事实并不重要。此外,实际上不允许使用元素函数:元素函数结果可能无法分配。
在无效功能上,Vladimir F提交了a bug report,其中包含gfortran未检测到Fortran 2008编号约束C1290的违规行为。在该报告中,您可以看到如果删除result(s)
并声明{ {1}}由于具有allocatable属性,该函数被拒绝。其他一些编译器已经检测到违规。
答案 1 :(得分:0)
即使我手动实现了函数的>>>1<<<>>>3<<<>>>5<<<>>>7<<<
,我也惊讶地发现了我没想到的结果(ELEMENTAL
)确实是一样的,即
print *, '>>>'//[num2str(1), num2str(3), num2str(5), num2str(7)]//'<<<'
所以我可能误解了我自己的单词因此RETURN
长度为4的数组,其中每个元素都是一个字符串。该函数确实返回了一个字符串数组,并且连接适用于数组的每个元素(数组的元素被粘在一起而没有空格,只是因为它们是字符串)。