module及subroutine中声明的优先级
moduletype(Subblocks),allocatable:: iboxNears(:)
end module
subroutine
type(near) :: iboxNears
end subroutine想问问各位前辈,我在subroutine里使用的iboxnears所具有的结构是mudule里声明的还是subroutine里声明的,还是说都具有?
这个涉及变量定义的域(scope)。一般module定义的变量具有全局域,程序单元use 该module, 就可调用module中定义的变量(除非是private, 那就不能调用)。subroutine中定义的变量具有局部域,只能在该subroutine中调用。
在你的subroutine中, iboxNears具有type(near)的结构, 不具有type(subblocks)的结构.
如果在subroutine中使用use module,编译会出错, 因为数组iboxNears与简单变量iboxNears同名。不过可以另取局部数组名替代,如下:
subroutine
use module, new_iboxNears => iboxNears
type(near) :: iboxNears
end subroutine
十分感谢您的解答,不过我还是有点疑惑,此处的new_iboxNears 是在module中声明的结构吗?意思是将module中声明的指向subroutine中的结构? 另module中生明的 我是否应该设置成指针形式才能指向呢?
caimaxwell 发表于 2023-3-16 11:52
十分感谢您的解答,不过我还是有点疑惑,此处的new_iboxNears 是在module中声明的结构吗?意思是将module中 ...
new_iboxNears => iboxNears
意思是把 iboxNears 改名为 new_iboxNears(改名只限于use了该module的程序单元)
这里的 iboxNears 和 new_iboxNears 都是符号的名字,可以是变量,也可以是结构、函数、接口等等。不是必须是结构。而且 iboxNears 也不是结构,而是类型为该结构的变量。
它看起来,书写形式有点像指针,但和指针没什么关系。
module EmiblockData
use EmHMatrixData
implicit none
type Subblocks
integer*4:: row
integer*4:: coL
end type Subblocks
type blocks
type(Subblocks), allocatable :: iSubblocks(:)
end type blocks
type(blocks), allocatable :: iblocks(:)
end EmiblockData
subroutine Buildhblock(na, nb, fa, fb, Nunadm, Nadmit, sbmax)
!为了将远近区块的信息赋值到远近块中
use EmiblockData, iboxNear => iboxNears; iboxFarg => iboxFargs; iblock => iblocks; isubblock => isubblocks
!use EmiNearsData
implicit none
type(near) :: iboxNear
type(near):: iSubblock
type(Smatrix):: iboxFarg
end subroutine
十分感谢您的解答!
但我这么做运行时,它报了错,一是implicit none不可用。二是仍报错Symbol 'iboxnears' at (1) conflicts with symbol from module 'emiblockdata', use-associated|。三是type(near) :: iboxNear; type(near):: iSubblock;type(Smatrix):: iboxFarg这样的声明有误。
这样的报错是我哪里不对呢? 本帖最后由 布衣龙共 于 2023-3-16 21:46 编辑
你的代码有3个问题,我给你标注在下面代码的注释里了。
module EmiblockData
use EmHMatrixData
implicit none
type Subblocks
integer*4:: row
integer*4:: coL
end type Subblocks
type blocks
type(Subblocks), allocatable :: iSubblocks(:)
end type blocks
type(blocks), allocatable :: iblocks(:)
end module EmiblockData !//不可省略 module
subroutine Buildhblock(na, nb, fa, fb, Nunadm, Nadmit, sbmax)
use EmiblockData, iboxNear => iboxNears, iboxFarg => iboxFargs, iblock => iblocks, isubblock => isubblocks !//用逗号分割
implicit none
!type(near) :: iboxNear 无需再次定义
!type(near):: iSubblock 无需再次定义
!type(Smatrix):: iboxFarg 无需再次定义
end subroutine
本帖最后由 风平老涡 于 2023-3-17 00:27 编辑
caimaxwell 发表于 2023-3-16 17:28
module EmiblockData
use EmHMatrixData
implicit none
请具体了解下use的结构和用法, 参考教科书。
use module, rename-list
这里的rename有以下型式
local_id => use_id
这里的local_id指的是当前程序单元使用的名字, use_id指的是在module中定义的名字。
所以,use_id在module中已经被定义了。local_id只是该use_id在当前程序单元中的替代名,在当前程序单元中无需重新定义。
"=>"在这里只是表示替代的意思,和指针无关。 风平老涡 发表于 2023-3-17 00:26
请具体了解下use的结构和用法, 参考教科书。
use module, rename-list
十分感谢,知识学到了,问题解决! 布衣龙共 发表于 2023-3-16 21:39
你的代码有3个问题,我给你标注在下面代码的注释里了。
module EmiblockData
十分感谢,问题解决!:-lol
页:
[1]