包含声明

2024-03-11

我不明白的重要性CONTAINSFortran 90 中的声明

例如

PROGRAM BLABLA

IMPLICIT NONE

INTEGER :: i,j,k

i = 1; j = 1;k =1

PRINT *, i,j,k

CALL ABC(i,j,k)

PRINT *, i,j,k

CONTAINS

    SUBROUTINE ABC(r,s,t)

    IMPLICIT NONE

    INTEGER, INTENT(IN) :: r,s
    INTEGER, INTENT(OUT) :: t

    t = r + s

   END SUBROUTINE ABC
END PROGRAM BLABLA

一种是在主程序之外定义子例程。据我所知,对于函数,需要指定函数的类型,但对于子例程则不需要。我有兴趣了解这样做是否有任何其他注意事项?

PROGRAM BLABLA

IMPLICIT NONE

INTEGER :: i,j,k

i = 1; j = 1;k =1

PRINT *, i,j,k

CALL ABC(i,j,k)

PRINT *, i,j,k

END PROGRAM BLABLA

SUBROUTINE ABC(r,s,t)

IMPLICIT NONE

INTEGER, INTENT(IN) :: r,s
INTEGER, INTENT(OUT) :: t

t = r + s

END SUBROUTINE ABC

在您的第一个和第二个版本中尝试更改行

CALL ABC(i,j,k)

to

CALL ABC(i,j)

看看会发生什么,首先是在编译时,其次是在运行时。

当您完成此操作并报告您的发现后,我可以将其转变为正确的答案。

好的,这就是答案,其中大部分您已经找到了:

在过去,在 Fortran 90 之前,FORTRAN(当时每个人都喊这个名字)程序在单独的“单元”中编译是很常见的(现在仍然如此)。在您的第二个版本中,程序和子例程位于单独的单元中并单独编译。编译器没有可用的信息来检查对子例程的调用是否与子例程签名匹配——这留给程序员来检查。错误地调用子例程,几乎任何事情都可能发生——如果你幸运的话,程序崩溃或产生明显错误的结果,如果你不幸,它会产生不是明显错误但仍然错误的结果。

如果将子程序的源代码包含在程序单元的范围内,并使用contains部分,与程序的第一个版本一样,编译器将为子例程创建一个接口,并可以检查对子例程的任何调用在形式上是否正确。因此您发现编译失败。

让编译器生成子例程接口的另一种方法是将它们放入模块中,并且这些方法也适用于函数use程序中的模块。您会在其他 Q 和 As 中找到许多如何执行此操作的示例。

将子例程放入模块中与将其包含在模块中并不完全相同contains部分。在里面contains子例程可以使用在程序中声明的变量,而无需将其传递到子例程的参数列表。这被认为是糟糕的编程实践,但你确实会在野外遇到它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包含声明 的相关文章

  • 在 Fortran 95 中按值传递参数

    如何在调用函数参数时保留其值而不创建新变量 这就是 如何按值传递参数 在此示例代码中 program what implicit none integer a b c d a 1 b 2 c 3 print a b c d f val a
  • 定义派生类型数组

    我正在尝试使用参数声明初始化派生类型 当我编译时 出现以下错误 1 处的 INTEGER 4 数组构造函数中的元素是 CHARACTER 1 用户定义的种类值ip and dp被发现于fasst global 他们是 integer par
  • 使用 MPI 派生数据类型

    我正在学习 Fortran 中的 BCASTing 数据类型 并且有一个代码可以从终端获取两个值并将它们显示在每个进程上 对于整数 整数和整数 实数类型的组合 value1 value2 这是有效的 但是对于整数 实数 8 的组合 它会失败
  • fortran 77 到 fortran 90 的转换器软件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 fortran 77 编码 但我想转换为 fortran 90 在哪里可以下载转换器软件 这是我帮
  • SELECT TYPE 构造中的多态性分配

    我试图定义一个分配不同类型数组的子例程 这是代码的简化版本 subroutine Allocation1 Vec class allocatable intent out Vec select type Vec type is real 8
  • 如何将单词与 C# 的 contains 函数精确匹配?

    我试图通过 C 读出脚本并确定它们是否包含某些单词 但这些单词应该是相同而不是只包含我正在寻找的内容 有没有办法使用contains 功能 挑出单词 并检查它是否与确切的单词相同 我怎样才能确定两者是否contains and 与搜索词 目
  • Perl 调用带括号和不带括号的方法

    一些 Perl 书籍建议在调用类方法时使用括号 称这有助于使解析器不必猜测代码的意图 然而 我见过的几乎所有 Perl 代码 包括 cpan 上的模块 在调用不带参数的方法时很少使用括号 省略这些括号是正常的还是我应该总是输入它们 我编写了
  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • Fortran90 数组将空白值读取为 null

    我正在读取外部文本文件的数据 30 行 7 列 每行用 分隔 我缺少表示为 的值 当我将数据读入二维数组时 缺失值被 0 00 替换 但数据中也有 0 00 值 当我计算平均值时 计数 项目数 n 显示为计数 缺失值的数量 我如何动态选择缺
  • Dependency Walker 未显示所有依赖的 Dll

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • 使用VBS脚本检查字符串是否包含特定字符

    我的脚本正在做以下几点 检索所有我选择的文件夹文件 按日期对它们进行分类 从最近的到较早的 在窗口中显示它们 这是我的 VBS 脚本 我检索它here http codes sources commentcamarche net sourc
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • 如何使用必须包含空格的 title~= 进行 CSS 属性选择器? [复制]

    这个问题在这里已经有答案了 我有以下选择器 post link title Corporate 现在 我需要只选择标题仅在开头而不是标题中其他位置包含 Corporate 一词的元素 所以我有两个选择 1 创建一个仅检查标题开头的选择器 然
  • Fortran if stop 需要 endif 吗?

    在 fortran 90 中 if stop 语句是否需要结束 endif example if foo eq 1 stop do some stuff do some stuff 是循环的一部分还是 stop 意味着程序结束时 endif
  • 关于for循环中的fortran continue语句的问题

    我正在分析 Fortran 代码并有一个简单的问题 我想知道下面代码中 100 和 200 处的 继续 语句的作用 它会增加 i 和 j 计数器吗 如果是这样的话 不会if not flg 那么条件包含flg循环中 flg 的 最后一个值
  • 如何在java hashset中查找并返回对象

    根据 HashSet javadoc HashSet contains 仅返回布尔值 如何在 hashSet 中 查找 对象并修改它 它不是原始数据类型 我看到 HashTable 有一个 get 方法 但我更喜欢使用该集合 您可以删除一个
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid

随机推荐

  • 时间延迟 Tkinter

    我想在 PyDev Eclipse python 2 75 中制作一个图形窗口 我做了一些事情 但我想做一个 入口 眨眼 它测试用户输入 如果它是一个整数 它应该闪烁绿色一秒钟 然后变成白色 但如果它是一串其他东西 它应该闪烁红色 然后变成
  • 如何制作分割文本输入占位符?

    我想要做的事情也许最好用图像来解释 我将在下面添加 但本质上它是文本inputHTML 字段一半是预先存在的值 另一半是可替换的 我尝试添加两个value and a placeholder场 然后通过将它们分开padding left在
  • python SyntaxError 与 dict(1=...), 但 {1:...} 有效

    Python 似乎在接受字典类型的键方面不一致 或者 换句话说 它允许以一种定义字典的方式使用某些类型的键 但不允许以其他方式使用 gt gt gt d 1 one 2 2 gt gt gt d 1 one gt gt gt e dict
  • UIHostingController 是否必须位于视图控制器层次结构中?

    我想在我的基于 UIKit 的 UI 中嵌入一些 SwiftUI 不幸的是 Apple 不提供UIHostingView only UIHostingController 我可以或多或少地忽略该控制器并只使用它的视图 还是我真的需要将它添加
  • Clojure 中 definterface 和 defprotocol 的区别

    除了缺少文档之外 还有什么区别definterface and defprotocol在 Clojure 中 根据Clojure 的乐趣 使用的优点definterface over defprotocol受到限制 完全是因为前者允许原始类
  • 在 Libgdx 中使用屏幕时重用代码

    根据我在阅读其他人关于如何制作不同屏幕的代码时的理解 您执行一个主处理程序类 然后为每个屏幕创建一个新类 让我困惑的是 每当你创建一个新屏幕时 你都必须重新定义将要渲染的所有内容 例如 SpriteBatch 精灵 字体等 有没有办法在所有
  • Scala:包导入冲突

    我正在导入一个隐式 scala concurrent ExecutionContext Implicits global 在此之前 我import global Analytics xyzMethod 其中 global 是我的包中的一个目
  • 如何将大型 xml 文件的一部分反序列化为 C# 类?

    我已经阅读了一些关于如何反序列化 xml 的帖子和文章 但仍然没有弄清楚应该如何编写代码来满足我的需求 所以 我为另一个关于反序列化 xml 的问题道歉 我有一个大 50 MB 的 xml 文件 需要反序列化 我使用 xsd exe 获取文
  • 如何将 Blender 3D 动画导入 iPhone OpenGL ES?

    我正在尝试使用 OpenGL ES 在 iPhone 上制作动画 我能够在 Blender 3D 软件中制作动画 我可以将 Blender 导出为 obj 文件到 OpenGL 并且它可以在 iPhone 上运行 但我无法将我的动画作品从
  • 辅助功能:仅使用带有 href="#" 的 javascript 链接

    我有一个 React SPA 其中有一些链接可以导航到其他页面或同一页面上的其他位置 这些导航要么以编程方式决定 要么依赖 javascript 转到同一页面上的另一个位置 我可能不知道链接href当显示链接时 所以我将其渲染为href a
  • 我们需要用 自己实现双缓冲吗?

    我开始使用 Canvas 带有 GWT 我们需要自己实现双缓冲吗 想知道浏览器是否已经以某种方式为我们实现了这一点 Thanks 您绝对不需要自己实现双缓冲 这样做会浪费时间和性能 对我们来说幸运的是 每个画布实现都会在幕后为您实现它 这是
  • 如何检查 Firebase 数据库值是否存在?

    我正在将实时数据库与 Google 的 Firebase 结合使用 并且尝试检查子项是否存在 我的数据库结构如下 root users james jake rooms room1 room 1 properties room2 room
  • 在 Python 中从图像中提取连接的对象

    我有一个graysacle png 图像 我想从图像中提取所有连接的组件 有些组件具有相同的强度 但我想为每个对象分配一个唯一的标签 这是我的图片 我尝试了这段代码 img imread images soccer cif str i zf
  • @EnableMongoAuditing 和 @CreatedDate 审核在 Spring Boot 2.4.3 中不起作用

    我正在关注这个例子https github com hantsy spring reactive sample blob master boot exception handler src main java com example dem
  • jquery地址怎么用呢?

    我试图了解如何使用 jQuery 地址插件来处理 ajax 的深度链接 但文档非常差 我找不到任何好的教程来解释正在发生的事情 我认为一个好的文档和好的例子对于每个插件都很重要 有人可以解释或提供一些有用的解释链接吗 address cha
  • codeigniter $this->upload->do_upload() = false

    我正在尝试上传文件 我选择一个文件然后提交它 但 this gt upload gt do upload 的结果始终为 false 这是我的表格
  • subprocess.Popen execve() arg 3 包含非字符串值

    我正在尝试通过 shell 运行另一个脚本 该脚本使用一组修改后的环境变量 def cgi call script environ pSCRIPT subprocess Popen script stdout subprocess PIPE
  • 替换失败是否是依赖非类型模板参数的错误?

    假设我有这些模板别名 enum class enabler template
  • “出于安全原因”pcntl 无法在 Ubuntu 上运行

    我已经在 Ubuntu 32 位 12 10 上运行的 PHP 5 4 6 上安装了 pcntl 使用this http www crimulus com 2010 07 30 howto enable pcntl in ubuntu ph
  • 包含声明

    我不明白的重要性CONTAINSFortran 90 中的声明 例如 PROGRAM BLABLA IMPLICIT NONE INTEGER i j k i 1 j 1 k 1 PRINT i j k CALL ABC i j k PRI