Fortran Coder
标题: module及subroutine中声明的优先级 [打印本页]
作者: caimaxwell 时间: 2023-3-15 20:45
标题: module及subroutine中声明的优先级
[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
module
type(Subblocks),allocatable :: iboxNears(:)
end module
subroutine
type(near) :: iboxNears
end subroutine
想问问各位前辈,我在subroutine里使用的iboxnears所具有的结构是mudule里声明的还是subroutine里声明的,还是说都具有?
作者: 风平老涡 时间: 2023-3-15 22:45
这个涉及变量定义的域(scope)。一般module定义的变量具有全局域,程序单元use 该module, 就可调用module中定义的变量(除非是private, 那就不能调用)。subroutine中定义的变量具有局部域,只能在该subroutine中调用。
在你的subroutine中, iboxNears具有type(near)的结构, 不具有type(subblocks)的结构.
如果在subroutine中使用use module,编译会出错, 因为数组iboxNears与简单变量iboxNears同名。不过可以另取局部数组名替代,如下:
[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
subroutine
use module, new_iboxNears => iboxNears
type(near) :: iboxNears
end subroutine
作者: caimaxwell 时间: 2023-3-16 11:52
十分感谢您的解答,不过我还是有点疑惑,此处的new_iboxNears 是在module中声明的结构吗?意思是将module中声明的指向subroutine中的结构? 另module中生明的 我是否应该设置成指针形式才能指向呢?
作者: fcode 时间: 2023-3-16 12:11
new_iboxNears => iboxNears
意思是把 iboxNears 改名为 new_iboxNears(改名只限于use了该module的程序单元)
这里的 iboxNears 和 new_iboxNears 都是符号的名字,可以是变量,也可以是结构、函数、接口等等。不是必须是结构。而且 iboxNears 也不是结构,而是类型为该结构的变量。
它看起来,书写形式有点像指针,但和指针没什么关系。
作者: caimaxwell 时间: 2023-3-16 17:28
[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
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
[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
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:39
本帖最后由 布衣龙共 于 2023-3-16 21:46 编辑
你的代码有3个问题,我给你标注在下面代码的注释里了。
[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
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:26
本帖最后由 风平老涡 于 2023-3-17 00:27 编辑
请具体了解下use的结构和用法, 参考教科书。
use module, rename-list
这里的rename有以下型式
local_id => use_id
这里的local_id指的是当前程序单元使用的名字, use_id指的是在module中定义的名字。
所以,use_id在module中已经被定义了。local_id只是该use_id在当前程序单元中的替代名,在当前程序单元中无需重新定义。
"=>"在这里只是表示替代的意思,和指针无关。
作者: caimaxwell 时间: 2023-3-21 16:12
十分感谢,知识学到了,问题解决!
作者: caimaxwell 时间: 2023-3-21 16:13
十分感谢,问题解决!
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) |
Powered by Discuz! X3.2 |