ast*_*y13 7 arrays fortran fortran90
我需要Fortran(90)中的(真实)数组的深层副本,但我不确定如何获得一个,因为我不完全理解引用是如何工作的.直观地说,我希望这能得到我想要的东西:
do i=1,n
b(i) = a(i)
end do
Run Code Online (Sandbox Code Playgroud)
但是,最近我向我指出这b(1:n) = a(1:n)相当于上面的代码.直观地说,我希望这b(1:n) = a(1:n)只会导致引用b(1:n)指向a(1:n)内存中的位置.
是b(1:n) = a(1:n)深刻的副本?为什么?与基础参考相反的是b = a什么?
Chr*_*ris 14
你提到的复制数组的三种方式,do循环b(1:n) = a(1:n)和b = a都是等价的; 他们将数组的内容复制a到数组中b. a并且b只是数组,而不是花哨的指针或任何东西,所以赋值a = b基本上与数学表达式相同.引用没有任何魔法(用户需要了解),这就是为什么Fortran是一种非常直接的语言学习的原因.您可以在Fortran中使用指针数组,但这是另一个问题.
M Metcalf和J Reid的Fortran 90/95解释一直是咨询Fortran语言功能的一个很好的参考.从第48页开始:
3.11数组赋值
通过内部赋值,可以将数组表达式赋值给具有相同形状的数组变量,该数组表达式被解释为表达式的每个元素都被赋值给变量的相应元素.例如,声明
Run Code Online (Sandbox Code Playgroud)real, dimension(10, 20) :: a分配
Run Code Online (Sandbox Code Playgroud)a = a + 1.0替换
a(i,j)为a(i,j) + 1.0fori=1,2..,10和j=1,2,..,20.
还要注意,可以将标量表达式赋给数组,在这种情况下,将saclar值广播到所有数组元素.
就实际实现的方式而言,这就是我认为你在解决问题的过程中,Fortran标准完全没有说明这一点.这种事情未被指定,允许编译器编写者做他们想做的任何优化.例如,在赋值中a = b,标准未指定b复制元素的顺序a,因此不同的编译器可以以不同的方式执行此操作.所有你需要知道的是,这个问题是,提供a和b不是指针,则a和b是不同的阵列和一个改变的元素不会改变其他的相应元素.所以从某种意义上讲,这a=b是一个"深层复制",您可以将其视为将所有项目复制b到内存位置a.
a = b将整个数组b复制到a中.如果您只想要尺寸大于n的数组的一部分,则可以使用下标符号a(1:n)= b(1:n).那就是Fortran 90--它是一种比FORTRAN 77更高级的语言.我们可以告诉"a = b"是一个副本而不是将指针a与目标b相关联,因为该语句使用了运算符"=".指针关联使用=>.
编辑:通过复制,它会复制,可能与您的循环相同的机器代码.指针关联在不执行do循环的情况下进行引用以复制所有数组元素.
请参见http://en.wikipedia.org/wiki/Fortran_95_language_features
| 归档时间: |
|
| 查看次数: |
11370 次 |
| 最近记录: |