Fortran元素函数 - 这种行为是正常的吗?

时间:2018-01-18 22:18:14

标签: function type-conversion fortran string-concatenation operator-precedence

考虑以下功能

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的数组,每个元素都是一个字符串,但在我看来,它的元素依赖性适用三个字符串的整个连接,好像//运算符优先于函数的结果。

2 个答案:

答案 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的数组,其中每个元素都是一个字符串。该函数确实返回了一个字符串数组,并且连接适用于数组的每个元素(数组的元素被粘在一起而没有空格,只是因为它们是字符串)。