如何标量被传递到一个向量(1D阵列)到一个Fortran子程序?如何标量被传递到一个向量(1D阵列)

2019-05-12 10:09发布

有此程序:

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

因此,基本上熔点(1,1)等的值被传入到该子程序作为一个矢量tensB(15)中n = 15。 我不明白的是实数如何被存储在一个子程序一维数组。

Answer 1:

你的问题的标题有点误导。 Fortran不允许你到一个标量传递给数组。 但是,它允许在传递一个数组的单个元素,以常规的数组伪参数 - 这就是所谓的Fortran语言“序列协会”。 作为IanH和其他人说,这些元素是自动与伪数组中的元素,直到被调用子程序的实际数组的最后一个元素相关联。

有此功能的一些限制,但。 如果该元素是一个指针数组,你不能做到这一点。

让我们回到你的标题,我见过很多程序通过,比如,恒3例行在伪是一个数组。 该程序只使用第一个要素,但是这是不合法的和新的编译器可以检测到错误并抱怨。 对此的一个解决办法是通过使用数组构造把参数到一个数组 - 例如,调用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



Answer 2:

编辑:每通过IanH的评论,谁指出,该行为不作出有关的参数传递约定的假设保证纠正。

这种方法在早期FORTRAN开始,通过假定参数被作为一个地址,通常称为“通过引用调用”通过。 定标器的地址mp(1,k)是该列的第一个元素的地址k 。 由于在柱主要格式的Fortran存储阵列( http://en.wikipedia.org/wiki/Row-major_order#Column-major_order ),第k列的15个值将在存储器中的顺序。 因此,如果被调用的子程序解释这个地址为1-d阵列的tensB长度15,它将访问第k列中的元素。

在现代的Fortran一个可通过与阵列切片选择列写入更清楚地论证: mp (:,k)



文章来源: How can a scalar be passed to a vector (1D array) to a Fortran subroutine?