Fortran Coder

查看: 2399|回复: 8

[Module] module及subroutine中声明的优先级

[复制链接]

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
发表于 2023-3-15 20:45:17 | 显示全部楼层 |阅读模式
[Fortran] 纯文本查看 复制代码
module
type(Subblocks),allocatable  :: iboxNears(:)
end module
subroutine
type(near) :: iboxNears
end subroutine
想问问各位前辈,我在subroutine里使用的iboxnears所具有的结构是mudule里声明的还是subroutine里声明的,还是说都具有?

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

发表于 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同名。不过可以另取局部数组名替代,如下:
[Fortran] 纯文本查看 复制代码
subroutine
use module, new_iboxNears => iboxNears
type(near) :: iboxNears
end subroutine

评分

参与人数 1F 币 +1 收起 理由
fcode + 1

查看全部评分

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-3-16 11:52:37 | 显示全部楼层
十分感谢您的解答,不过我还是有点疑惑,此处的new_iboxNears 是在module中声明的结构吗?意思是将module中声明的指向subroutine中的结构? 另module中生明的 我是否应该设置成指针形式才能指向呢?

1981

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1422 元
贡献
609 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 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 也不是结构,而是类型为该结构的变量。

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

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-3-16 17:28:12 | 显示全部楼层
[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这样的声明有误。
这样的报错是我哪里不对呢?

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
发表于 2023-3-16 21:39:59 | 显示全部楼层
本帖最后由 布衣龙共 于 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



213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

发表于 2023-3-17 00:26:01 | 显示全部楼层
本帖最后由 风平老涡 于 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在当前程序单元中的替代名,在当前程序单元中无需重新定义。

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

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-3-21 16:12:38 | 显示全部楼层
风平老涡 发表于 2023-3-17 00:26
请具体了解下use的结构和用法, 参考教科书。

use module, rename-list

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

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-3-21 16:13:11 | 显示全部楼层
布衣龙共 发表于 2023-3-16 21:39
你的代码有3个问题,我给你标注在下面代码的注释里了。

[mw_shl_code=fortran,true]module EmiblockData

十分感谢,问题解决!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-25 00:48

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表