我想定义一个块数组,每个块将包含一个不同大小的节点数组。所以我写了一个类似下面的程序,但它不起作用。我想知道我怎么能在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
答案 0 :(得分:1)
正如High Performance Mark指出的那样,修复编译器建议的语法将处理大多数其他错误消息。您的编译器可能会禁止的另一个地方就是这一行:
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
可能会导致循环中的分段错误或未定义的行为。