2

请看一下这段代码,为什么会出现问题,我该怎么做呢?

program main
type matrix(m,n)
    integer::m,n
    double precision,dimension(1:m,1:n)::value
end type matrix

type(matrix(2,3))::B
print*,"OK"
end program

关于这个的另一个问题是:我可以有一个类型定义或模块定义,然后是一个参数列表吗?因为我从书中看到了这段代码,不知道为什么我不能编译它。

4

2 回答 2

4

撇开 MSB 关于定义点的观察matrix,如果你有一个最新的编译器,你可以定义和声明一个参数化的定义类型,就像这样:

type matrix(m,n,k)
    integer, len :: m,n
    integer, kind :: k
    real(kind=k), dimension(m,n) :: elements
end type matrix

...

type(matrix(4,3,selected_real_kind(0.0)) :: the_matrix

笔记:

  • 并非所有广泛使用的 Fortran 编译器都实现了 2008 标准的这一特性;
  • 参数m,n,k在其声明中具有特殊属性,要么len要么kind;
  • 我包含 kind-type 参数只是为了表明它存在,在定义参数化派生类型时不必包含它。
于 2012-12-15T09:09:57.680 回答
2
program main

type matrix
    integer:: m, n
    double precision, dimension(:,:), allocatable :: value
end type matrix

type (matrix) :: mat1, mat2


mat1 % m = 2
mat1 % n = 3
allocate ( mat1 % value ( mat1 % m, mat1 % n ) )
mat1 % value = 5.0

mat2 % m = 4
mat2 % n = 5
allocate ( mat2 % value ( mat2 % m, mat2 % n ) )
mat2 % value = 6.0

print*,"OK"
end program

一个很好的例子,但没有理由在实际代码中创建这种特定的用户定义类型,因为您可以使用lboundand获得矩阵的边界ubound- 您不必将它们存储在类型中。

于 2012-12-15T04:42:49.420 回答