当前位置: 首页 > 编程笔记 >

Fortran 普通块

司空瑾瑜
2023-03-14
本文向大家介绍Fortran 普通块,包括了Fortran 普通块的使用技巧和注意事项,需要的朋友参考一下

示例

在Fortran的早期形式中,用于创建从子例程和函数可见的全局变量存储的唯一机制是使用COMMON块机制。这允许变量序列成为名称并共享。

除了已命名的公共块之外,还可能有一个空白(未命名)的公共块。

可以声明一个空白的公共块,例如

common i, j

而命名块variables可以像

common /variables/ i, j

作为一个完整的示例,我们可以想象一个可以添加和删除值的例程使用的堆存储:

       PROGRAM STACKING
       COMMON /HEAP/ ICOUNT, ISTACK(1023)
       ICOUNT = 0
       READ *, IVAL
       CALL PUSH(IVAL)
       CALL POP(IVAL)
       END

       SUBROUTINE PUSH(IVAL)
       COMMON /HEAP/ ICOUNT, ISTACK(1023)
       ICOUNT = ICOUNT + 1
       ISTACK(ICOUNT) = IVAL
       RETURN
       END

       SUBROUTINE POP(IVAL)
       COMMON /HEAP/ ICOUNT, ISTACK(1023)
       IVAL = ISTACK(ICOUNT)
       ICOUNT = ICOUNT - 1
       RETURN
       END

公共语句可用于隐式声明变量的类型并指定dimension属性。仅此行为通常就足以引起混乱。此外,隐含的存储关联和跨程序单元重复定义的要求使得使用容易出错的通用块成为可能。

最后,公共块在它们所包含的对象中非常受限制。例如,公共块中的数组必须具有显式的大小。可分配的对象可能不会出现;派生类型不能具有默认初始化。

在现代的Fortran中,可以使用模块来处理变量的共享。上面的例子可以写成:

module heap
  implicit none
  ! In Fortran 2008 all module variables are implicitly saved
  integer, save :: count = 0
  integer, save :: stack(1023)
end module heap

program stacking
  implicit none
  integer val
  read *, val
  call push(val)
  call pop(val)

contains
  subroutine push(val)
    use heap, only : count, stack
    integer val
    count = count + 1
    stack(count) = val
  end subroutine push

  subroutine pop(val)
    use heap, only : count, stack
    integer val
    val = stack(count)
    count = count - 1
  end subroutine pop
end program stacking

命名和空白公共块的行为略有不同。注意:

  • 命名的公共块中的对象可以最初定义;空白共同对象不应

  • 空白公共块中的对象的行为就像公共块具有save属性一样;save当该块不在活动程序单元的范围内时,没有属性的命名通用块中的对象可能会变得不确定

后一点可以与现代代码中模块变量的行为形成对比。当模块超出范围时,Fortran 2008中的所有模块变量都会隐式保存,并且不会变得不确定。在Fortran 2008之前,模块超出范围时,诸如命名公共块中的变量之类的变量也将变得不确定。

 类似资料:
  • 重复执行一系列命令:可以指定表示重复次数的数字或直到遇到 break。 Loop [, Count] 参数 Count 执行循环体 (重复) 的次数. 如果省略, Loop 会无期限继续, 直到遇到 break 或 return. 如果 Count 是一个变量引用例如 %ItemCount%, 每当此变量为空或包含小于 1 的数字时, 循环会被完全跳过. 由于必须支持 文件模式循环, Count

  • CloudGate普通规则可以直接导入使用,不需要任何额外的操作,非常方便! 规则列表 规则名称 下载地址 Surge https://async.be/Rule/Basic/Surge Shadowrocket https://async.be/Rule/Basic/Shadowrocket A.BIG.T https://async.be/Rule/Basic/A.BIG.T Potatso

  • 如何选择普通收录方式 API推送:最为快速的提交方式,建议您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。 sitemap:您可以定期将网站链接放到Sitemap中,然后将Sitemap提交给百度。百度会周期性的抓取检查您提交的Sitemap,对其中的链接进行处理,但收录速度慢于API推送。 手动提交:如果您不想通过程序提交,那么可以采用此种方式,手动将链接提交给百

  • Fortran Package Manager(fpm)是 Fortran 的包管理器和构建系统。它的主要目标是改善 Fortran 程序员的用户体验。它通过使构建 Fortran 程序或函数库,运行可执行文件、测试和示例以及将其作为依赖项分发到其他 Fortran 项目变得更加容易来实现这一目标。fpm 的用户界面以 Rust 的 Cargo 为蓝本,其长期愿景是培育和发展现代 Fortran

  • 问题内容: 如果下面的代码会产生相同的结果,为什么还要使用封装? 封装的主要好处是能够修改我们已实现的代码而不会破坏其他使用我们代码的人的代码。 但是我可以在不使用封装的情况下使用此好处,对吗?因为每个对象的字段都彼此不同。 问题答案: 您的问题很有趣。我将尽力为您解答。 封装 背后的主要思想 是向 其他用户 隐藏数据及其实现 细节。如果我们将数据成员设为 私有 ,则只能在同一类中访问它。没有其他