【发布时间】:2016-08-12 21:33:27
【问题描述】:
我在一个模块中声明了许多变量,例如
module test
use othermod, only: n
integer, dimension(n) :: var0
real, dimension(n) :: var1
real, dimension(n) :: var2
.....
real, dimension(n) :: var1000
end module test
然后我有一个用值填充这些变量的子程序。 此时我想创建一个包含在模块测试中声明的所有变量的数组数组,以便我可以轻松地同时复制或打印特定(n)的所有变量,例如维度(n,allvariablesin module test) .例如,我想做一些类似 array(3,:)=array(2,:) 的事情。 因为这段代码是一个非常大的程序的一部分,所以我不能真正修改太多,而是我需要从这个模块中的所有变量创建一个数组数组,而不需要输入所有变量。 如何轻松地将这种更改集成到当前代码中?
【问题讨论】:
-
创建一个派生类型并将它们存储在那里。或者在那里存储指向这些的指针。 Fortran 中没有数组数组。
-
我同意@VladimirF。请注意,模块内的每个变量声明都会自动继承
save属性。如果您希望var0, var1, var2, ..., var1000数组的不同实例用于n的不同值,则必须将变量作为类型组件包含在派生数据类型中。 -
有数组的结构,但是为什么呢?如果在你的例程和函数中使用 TEST,那么你会让它们都显示在那里。 array(3,:)=array(2,:) 并没有比 var1(:) = var2(:) 节省太多时间。如果 var1 是质量而 var2 是重量,那么它比 massweight(1,:) 是质量和 massweight(2,:) 是重量更容易理解。如果 var1 是 X 轴而 Var2 是 Y 轴,那么 xy(:,:) 作为 2D 数组是有意义的......否则将它们保留为数组可能更有意义?
-
@Holmz 由于模块自动继承
save属性,因此这种方法不是线程安全的,也就是说,您可以在同一代码中创建var0, var1, ..,var1000的多个实例。 -
@Holmz 我不明白你的意思,根据你的建议,将位置 x 的所有变量复制到位置 y 我必须输入所有变量名称,我可以使用不同的结构分配所有位置 x 到位置 y 的变量。每个数组的长度完全相同。
标签: arrays module fortran fortran90