【发布时间】:2021-04-15 00:30:20
【问题描述】:
为什么这个 Fortran 代码不正确?
function foo(x)
real x
real, dimension(3) :: foo
foo = (/1, 2, 3/)
end
...在主程序中
print*, foo(x)(1)
为什么我们不能直接访问函数结果中的元素?
【问题讨论】:
-
因为标准不知道这样的语法。这个问题几乎没有任何意义。
为什么这个 Fortran 代码不正确?
function foo(x)
real x
real, dimension(3) :: foo
foo = (/1, 2, 3/)
end
...在主程序中
print*, foo(x)(1)
为什么我们不能直接访问函数结果中的元素?
【问题讨论】:
当你思考自己的问题时
Why we cannot access element in function result directly?
我建议你也写几行,在你的主程序中,比如
res = foo(x) ! having taken care to declare res appropriately
print*, res(1)
继续你的编码。以您尝试过的方式索引函数调用在语法上是不正确的。
所以对您最初的问题的一个答案是因为这是定义 Fortran 语法的方式您可能会被提示回答 为什么 Fortran 的语法是这样定义的?如果这个过程以参考 Fortran 设计的根源(现在已有 50 多年的历史)的形式给出了答案,那么您仍然需要修改代码以与 Fortran 的语法保持一致。你的编译器肯定不会说你知道,你写的比我被编程接受的语法更好,我现在就编译它...
【讨论】:
answer by High Performance Mark 告诉所有需要的信息。当您追求语法上的好处时,我将在其中解决一件事:“注意适当地声明 res”。
可以使用关联构造来隐藏这一点。
associate (res => foo(x))
print *, res(1)
end associate
除了减少垃圾声明之外,这不会改变该答案。
【讨论】: