Fortran Coder

标题: module及subroutine中声明的优先级 [打印本页]

作者: caimaxwell    时间: 2023-3-15 20:45
标题: module及subroutine中声明的优先级
[Fortran] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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
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
[Fortran] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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 编辑
caimaxwell 发表于 2023-3-16 17:28
[mw_shl_code=fortran,true]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
风平老涡 发表于 2023-3-17 00:26
请具体了解下use的结构和用法, 参考教科书。

use module, rename-list

十分感谢,知识学到了,问题解决!
作者: caimaxwell    时间: 2023-3-21 16:13
布衣龙共 发表于 2023-3-16 21:39
你的代码有3个问题,我给你标注在下面代码的注释里了。

[mw_shl_code=fortran,true]module EmiblockData

十分感谢,问题解决!




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2