0

ブロックの配列を定義したいと思います。各ブロックには、異なるサイズのノードの配列が含まれます。そこで、次のようなプログラムを作成しましたが、動作しません。FORTRANでこれをどのように行うことができるのでしょうか?他にもっと良い方法はありますか?基本的な難しさは、それらを割り当て可能にすることです!

program Mesh
    implicit none
    integer::i

    type node
      double precision::x,y
    end type node

    type block
        integer::NX,NY
        integer::ENB,WNB,SNB,NNB      
        integer::BlockType            
        type(node),dimension(:,:),allocatable::nodes
    end type block

    type(block),dimension(:),allocatable::blocks !Error:Syntax Error in Data Declaration

    allocate(blocks(1:9)) ! here using 9 just to simplify it,error: allocate-object is not               a nonprocedure pointer or allocatable object

    do i=1,sizeof(blocks)
        blocks(i)%NX=i*2  !Here I want to read in some value, but just use i*2 to simplify
        blocks(i)%NY=i*2  !Here I want to read in some value, but just use i*2 to simplify
        allocate(blocks(i)%nodes(0:NX,0:NY)) !error: not allocatable object either
    end do

end program
4

1 に答える 1

1

High Performance Markが指摘したように、コンパイラによって提案された構文を修正すると、他のほとんどのエラーメッセージが処理されます。コンパイラがバーフする可能性が高いもう1つの場所は、次の行です。

allocate(blocks(i)%nodes(0:NX,0:NY))

ここでNX、およびNYはブロックの外側ではわかりませんtype。この行を次のように変更してください。

allocate(blocks(i)%nodes(0:blocks(i)%NX,0:blocks(i)%NY))

また、私はあなたが使用するつもりだったと思います:

do i=1,size(blocks)

それ以外の:

do i=1,sizeof(blocks)

sizeofオブジェクトのサイズをバイト単位で返す非標準の関数です。sizeは、配列内の要素の数を返す標準の組み込み関数です。このコンテキストで使用sizeofすると、ループの後半でセグメンテーション違反が発生したり、未定義の動作が発生したりする可能性があります。

于 2013-01-01T17:30:48.833 に答える