将派生类型作为数组传递

Sam*_*Tan 2 arrays fortran derived-types

在Fortran中,可以对数组进行操作,但是如何将派生类型的索引视为数组的一部分呢?代码将解释我想要做的最好的事情:

type mytype
    integer :: b(3,3)
    real :: c(4)
endtype

integer :: a(3,3)
real :: d(2,4)
type(mytype) :: mat(2)

!do stuff so that 'mat' gets values
....

!usually one does this
a = matmul(mat(1)%b, transpose(mat(2)%b))

!multiplying two 3x3 matrices

!but how does one do this? Note the "array"
d = matmul(mat(:)%c, mat(:)%c)
Run Code Online (Sandbox Code Playgroud)

我假设最后一行类似于2x4矩阵与自身相乘.但是,当我尝试编译时,gfortran抱怨道

错误:不得指定具有非零等级的两个或多个零件参考

Fortran可以做到这一点吗?

M. *_* B. 9

您希望编译器mat(:)%c视为2 x 4矩阵吗?它不起作用. mat并且c是不同的对象,它们的等级不会合并为单个数组. mat是用户定义的类型,c是一个真正的矩阵.仅仅因为你只使用c-component mat并不意味着编译器会c根据维度推广到更高维度的实数组mat.

你可以通过创建一个新的数组X = [ mat(1)%c, mat(2)%c ].您可以reshape用来控制形状.