有这个程序:
INTEGER i,k
REAL*8 mp(15,48)
REAL*8 sp(15)
k=0
do i=1,12
k=k+1
call Equaltensors(sp,mp(1,k),15)
enddo
end
c=====================
subroutine Equaltensors(tensA,tensB,n)
REAL*8 tensA(n),tensB(n)
INTEGER i
do i=1,n
tensB(i)=tensA(i)
enddo
return
end
所以基本上mp(1,1)等的值作为向量tensB(15)传递给子程序,n = 15。我不明白的是如何将实数存储在子程序中的一维数组中。
答案 0 :(得分:5)
你的问题的标题有点误导。 Fortran不允许您将标量传递给数组。但它允许的是将数组的单个元素传递给例程的数组伪参数 - 这在Fortran中称为“序列关联”。正如IanH和其他人所说,以下元素自动与虚拟数组的元素相关联,直到被调用例程的实际数组中的最后一个元素。
但是这个功能有一些限制。如果元素是POINTER数组,则不能这样做。
回到你的标题,我已经看到许多程序将常数3传递给假人是一个数组的例程。例程仅使用第一个元素,但这不合法,较新的编译器可能会检测到错误并抱怨。一种解决方法是使用数组构造函数将参数转换为数组 - 例如,CALL FOO([3]),但这只有在读取值而不是写入时才有效。
我在这个一般性问题上撰写了一些博客文章 - 请参阅http://software.intel.com/en-us/blogs/2009/03/31/doctor-fortran-in-ive-come-here-for-an-argument和http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-side-2
答案 1 :(得分:3)
编辑:根据IanH的评论更正,他指出行为是有保证的,而不假设传递约定的参数。
这种方法在早期的FORTRAN中开始,假设参数作为地址传递,通常称为“按引用调用”。缩放器mp(1,k)
的地址是此列k
的第一个元素的地址。由于Fortran以列主格式(http://en.wikipedia.org/wiki/Row-major_order#Column-major_order)存储数组,因此第k列的15个值将在内存中是连续的。因此,如果被调用的子例程将此地址解释为长度为15的1-D数组tensB
,则它将访问第k列的元素。
在现代Fortran中,可以通过选择带有数组切片的列来更清晰地编写参数:mp (:,k)
。