Fortran Coder

查看: 82|回复: 1

[数值问题] Fortran中传递数组,将三维数组传递到二维数组

[复制链接]

3

帖子

2

主题

0

精华

新人

F 币
14 元
贡献
6 点
发表于 2022-8-3 23:54:27 | 显示全部楼层 |阅读模式
Fortran中传递数组,将三维数组传递到二维数组
[Fortran] 纯文本查看 复制代码
program ex0819
implicit none
integer,parameter::dim1=2
integer,parameter::dim2=2
integer,parameter::dim3=2
integer::a(dim1,dim2,dim3)
a(:,:,1)=1
a(:,:,2)=2
call getarray1(a(:,:,1),dim1,dim2)
call getarray2(a(1,1,2),dim1)
stop
end program ex0819

subroutine getarray1(a,dim1,dim2)
implicit none
integer::dim1,dim2
integer::a(dim1,dim2)
write(*,*)a
return
end subroutine getarray1

subroutine getarray2(a,dim1)
implicit none
integer::dim1,dim2
integer::a(dim1,*)!最后一维可以不赋值数组大小
integer::i
write(*,*)(a(:,i),i=1,2)
return
end subroutine getarray2

第一个子程序
为什么出来的结果会是1,1,1,1,第二个子程序为什么出来的结果会是2,2,2,2???

(彭国伦Fortran95程序设计,p182页例子)


67

帖子

0

主题

0

精华

专家

F 币
415 元
贡献
206 点

规矩勋章新人勋章元老勋章

QQ
发表于 2022-8-4 09:01:47 | 显示全部楼层
本帖最后由 青衣巷 于 2022-8-4 09:06 编辑

a  :  2x2x2 三维数组。
a(:,:,1)   :   是 2x2 的二维数组,是 a 的前半部分。内容全部等于1
a(:,:,2)   :   也是 2x2 的二维数组,是 a 的后半部分。内容全部等于2

call getarray1(a(:,:,1),dim1,dim2)  这种是推荐使用的方式。没什么好说的。
call getarray2(a(1,1,2),dim1)  这种是不建议的使用方式,容易出错。不易于理解。

a 在内存里是这样存储的
a(1,1,1),a(2,1,1),a(1,2,1),a(2,2,1),a(1,1,2),a(2,1,2),a(1,2,2),a(2,2,2)
1       ,1       ,1       ,1       ,2       ,2       ,2       ,2


call getarray2(a(1,1,2),dim1) 把a(1,1,2) 传递给getarray2函数。
getarray2看到的部分是蓝色的部分:
a(1,1,1),a(2,1,1),a(1,2,1),a(2,2,1),a(1,1,2),a(2,1,2),a(1,2,2),a(2,2,2)
1       ,1       ,1       ,1       ,2       ,2       ,2       ,2      

因此对于getarray2来说,其值是4个2。

这种方式非常不好,不推荐。

参考:http://passarray.w.fcode.cn/

现代Fortran代码,传递数组全部用假定形状+module就好了。
彼岸,有永恒的守候...
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2022-8-17 18:51

Powered by Tencent X3.4

© 2013-2022 Tencent

快速回复 返回顶部 返回列表