我正在编写一个程序,我将在两个主要情况下使用:1D和2D。维度ndim
是通过read
外部文件加载的,我想在模块read
中执行param
。
我有各种矢量声明,其大小取决于尺寸。显然我必须在主程序的开头计算这些大小。这样做的正确方法是什么?我想使用模块,但我失败了。
module dimensions
use prec
use param
implicit none
integer ( int32 ), parameter :: nip = 49 ! Number of interior points
contains
subroutine calc_neqn ( )
use prec
implicit none
integer ( int32 ) :: nup ! Number of unknown points
integer ( int32 ) :: neqn ! Number of equations
! compute number of unknown points
nup = (nip+2)**ndim
! compute number of equations
neqn = 2*nup
end subroutine calc_neqn
! systematic computations
call calc_neqn ( )
end module dimensions
我得到以下内容 - 非常明确 - 错误消息:
Error: Unexpected CALL statement in CONTAINS section at (1)
换句话说,模块可以调用子程序吗?什么是正确的语法?
答案 0 :(得分:4)
不,模块本身无法执行任何可执行代码。有些编程语言在使用模块时允许默认初始化,但Fortran不是其中之一。
您应该将初始化代码放在子程序中,并且必须记住从主程序或其他程序调用此子程序。
面向对象的方法是使用对象而不是模块,并在对象初始化程序中使用初始化代码。
如果ndim
是参数,则可以在编译时评估常量精度。如果不是,则必须在自己获得calc_neqn
时致电ndim
。然后你可以根据需要分配你的矢量(你没有显示)。
答案 1 :(得分:2)
模块不能自己执行代码。
您可能想要做的是这样的事情:
ndim
这将为模块和主程序提供my_data
变量以及initialize
数组。只要确保你不在子程序中再次定义,因为这只会在Select Replace(textct, Special_char, ' ')
from mytable
范围内创建新变量。