加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数组 – 如何将标量传递给向量(1D数组)到Fortran子例程?

发布时间:2020-12-16 09:04:14 所属栏目:安全 来源:网络整理
导读:有这个程序: INTEGER i,kREAL*8 mp(15,48)REAL*8 sp(15)k=0do i=1,12 k=k+1 call Equaltensors(sp,mp(1,k),15)enddoendc=====================subroutine Equaltensors(tensA,tensB,n)REAL*8 tensA(n),tensB(n)INTEGER ido i=1,n tensB(i)=tensA(i)enddoret
有这个程序:

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.我不明白的是如何将实数存储在子程序中的一维数组中.

解决方法

你的问题的标题有点误导. 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读