我将几个rank-3数组分配为完全相同的形状,我想知道是否可以只指定一次形状。例如,我目前正在做:
program main
implicit none
integer :: long_name_dimension_1 = 3
integer :: long_name_dimension_2 = 5
integer :: long_name_dimension_3 = 8
real, allocatable, dimension(:,:,:) :: A, B, C
allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3), &
B(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3), &
C(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
end program main
输入很烦人,很难立即看到这些阵列具有相同的形状。在分配第一个数组后,我可以使用模具或源,例如:
allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
allocate(B, source=A)
allocate(C, mold=A)
但我也不喜欢这样 - 也许是因为,在我看来,它应该是一个allocate
陈述。
我正在寻找语法,例如:
allocate( SHAPE :: (long_name_dimension_1,long_name_dimension_2,long_name_dimension_3), &
A, B, C)
我一直无法找到。这样的语法(或类似的东西)是否存在?
答案 0 :(得分:3)
Fortran不支持按照您的意愿分配多个数组。您只是坚持使用mold
语句的source
和allocate
选项。你可以写
allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
allocate(B,C,mold=A)
可以节省一些按键。您可以通过编写
来节省更多allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
A = 1
B = A
C = A
虽然这会设置B
和C
元素的值以及它们的形状。
我编辑了代码来处理评论中提出的@evets问题。
答案 1 :(得分:3)
嗯,最后一个(2015)Fortran标准中有allocate语句的语法:
形状必须遵循 allocation-list 中的每个分配术语,因此除了为所有变量声明一个常见形状之外,没有任何语法结构,除了使用SOURCE
或MOLD
选项。
我可以在分配第一个数组后使用模具或源,但是我 也不是真的喜欢这样 - 也许是因为,在我看来,它应该 是一个分配声明。
实际上,您无法定义数组的形状并在同一语句中引用它。在同一章的后面,它说:
source-expr 不得在ALLOCATE语句中分配 它出现了;也不取决于价值,界限,推迟 类型参数,分配状态或任何关联状态 该声明中的 allocate-object 。
所以总结一下,最接近你想要的就是你不喜欢的东西:
allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
allocate(B, C, mold=A)
或者source = A,如果您希望复制A的内容。
修改强>
这个怎么样:
allocate(A, B, C, mold=reshape([integer ::], &
[long_name_dimension_1,long_name_dimension_2,long_name_dimension_3])
我刚刚检查了英特尔Fortran并确认它有效。零大小的数组可以具有任何形状,这似乎很奇怪。但我坚信它不是标准的。