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

良い例ですが、実際のコードでこの特定のユーザー定義型を作成する理由はありません。これは、とを使用して行列の境界を取得できるためですlbounduboundこれらを型に格納する必要はありません。

于 2012-12-15T04:42:49.420 に答える