caimaxwell 发表于 2023-3-15 20:45:17

module及subroutine中声明的优先级

module
type(Subblocks),allocatable:: iboxNears(:)
end module
subroutine
type(near) :: iboxNears
end subroutine想问问各位前辈,我在subroutine里使用的iboxnears所具有的结构是mudule里声明的还是subroutine里声明的,还是说都具有?

风平老涡 发表于 2023-3-15 22:45:51

这个涉及变量定义的域(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

caimaxwell 发表于 2023-3-16 11:52:37

十分感谢您的解答,不过我还是有点疑惑,此处的new_iboxNears 是在module中声明的结构吗?意思是将module中声明的指向subroutine中的结构? 另module中生明的 我是否应该设置成指针形式才能指向呢?

fcode 发表于 2023-3-16 12:11:58

caimaxwell 发表于 2023-3-16 11:52
十分感谢您的解答,不过我还是有点疑惑,此处的new_iboxNears 是在module中声明的结构吗?意思是将module中 ...
new_iboxNears => iboxNears
意思是把 iboxNears 改名为 new_iboxNears(改名只限于use了该module的程序单元)

这里的 iboxNears 和 new_iboxNears 都是符号的名字,可以是变量,也可以是结构、函数、接口等等。不是必须是结构。而且 iboxNears 也不是结构,而是类型为该结构的变量。

它看起来,书写形式有点像指针,但和指针没什么关系。

caimaxwell 发表于 2023-3-16 17:28:12

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:39:59

本帖最后由 布衣龙共 于 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:26:01

本帖最后由 风平老涡 于 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在当前程序单元中的替代名,在当前程序单元中无需重新定义。

"=>"在这里只是表示替代的意思,和指针无关。

caimaxwell 发表于 2023-3-21 16:12:38

风平老涡 发表于 2023-3-17 00:26
请具体了解下use的结构和用法, 参考教科书。

use module, rename-list


十分感谢,知识学到了,问题解决!

caimaxwell 发表于 2023-3-21 16:13:11

布衣龙共 发表于 2023-3-16 21:39
你的代码有3个问题,我给你标注在下面代码的注释里了。

module EmiblockData


十分感谢,问题解决!:-lol
页: [1]
查看完整版本: module及subroutine中声明的优先级