Fortran 是否通过函数和子例程调用保留内部变量的值?

2023-12-09

经过多次痛苦的调试后,我相信我已经找到了 Fortran 的一个独特属性,我想在 stackoverflow 上验证它。

我注意到的是,至少内部逻辑变量的值在函数或子例程调用中得以保留。

这是一些示例代码来说明我的观点:

PROGRAM function_variable_preserve
IMPLICIT NONE

CHARACTER(len=8) :: func_negative_or_not ! Declares function name
INTEGER :: input
CHARACTER(len=8) :: output

input = -9

output = func_negative_or_not(input)
WRITE(*,10) input, " is ", output
10 FORMAT("FUNCTION: ", I2, 2A)

CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output
20 FORMAT("SUBROUTINE: ", I2, 2A)

WRITE(*,*) 'Expected negative.'


input = 7
output = func_negative_or_not(output)
WRITE(*,10) input, " is ", output

CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output

WRITE(*,*) 'Expected positive.'

END PROGRAM function_variable_preserve

CHARACTER(len=*) FUNCTION func_negative_or_not(input)
IMPLICIT NONE

INTEGER, INTENT(IN) :: input
LOGICAL :: negative = .FALSE.

IF (input < 0) THEN
    negative = .TRUE.
END IF

IF (negative) THEN
    func_negative_or_not = 'negative'
ELSE 
    func_negative_or_not = 'positive'
END IF

END FUNCTION func_negative_or_not

SUBROUTINE sub_negative_or_not(input, output)
IMPLICIT NONE

INTEGER, INTENT(IN) :: input
CHARACTER(len=*), INTENT(OUT) :: output
LOGICAL :: negative = .FALSE.

IF (input < 0) THEN
    negative = .TRUE.
END IF

IF (negative) THEN
    output = 'negative'
ELSE 
    output = 'positive'
END IF

END SUBROUTINE sub_negative_or_not

这是输出:

FUNCTION: -9 is negative
SUBROUTINE: -9 is negative
 Expected negative.
FUNCTION:  7 is negative
SUBROUTINE:  7 is negative
 Expected positive.

正如您所看到的,似乎一旦函数或子例程被调用一次,逻辑变量negative,如果切换到.TRUE.,尽管初始化了,但仍然如此negative to .FALSE.在类型声明语句中。

当然,我可以通过添加一行来纠正这个问题 负数 = .FALSE。 在我的函数和子例程中声明变量之后。

然而,这对我来说似乎很奇怪,这是必要的。

为了可移植性和代码可重用性,语言(或编译器可能)不应该要求每次调用子例程或函数时重新初始化所有内部变量吗?


回答你的问题:是的 Fortran 确实通过函数和子例程调用保留内部变量的值.

在某些条件下...

如果您使用 SAVE 属性声明一个内部变量,则它的值将从一次调用保存到下一次调用。当然,这在某些情况下很有用。

然而,您的问题是第一次了解 Fortran 陷阱之一时的常见反应:如果您在其声明中初始化内部变量,那么它会自动获取 SAVE 属性。您已经在子例程中完全做到了这一点。这是符合标准的。如果您不希望发生这种情况,请不要在声明中进行初始化。

这是(一些)该语言的新手感到惊讶和抱怨的原因。但无论他们多么抱怨,它都不会改变,所以你只需要 (a) 了解它并 (b) 在意识到它的情况下进行编程。

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

Fortran 是否通过函数和子例程调用保留内部变量的值? 的相关文章

随机推荐

  • 如何使用 Gson 解析 JSON 对象内的多个 JSON 数组? [复制]

    这个问题在这里已经有答案了 如何使用 Gson 解析 JSON 对象内的多个 JSON 数组 id 1 Data Details Code 1 Name John Code 2 Name Peter Other age 56 gender
  • R:在 2x2 窗口中并排放置四个点阵条形图?

    我想要并排制作 2x2 条形图的代码 以便 y 轴最大值在所有和 通用标签 通用x标签 常见的传说 通用标题 每个条形图都有自己的副标题 每个条形图之间的分隔线如图 2 所示 Code Wanted output 2x2 barchart
  • 如何在 VimScript 中获取可视化选择的文本

    我可以通过以下方式获取光标位置getpos 但我想检索所选文本within一条线 即 lt gt 这是怎么做到的 UPDATE 我想我删掉了我解释说我想要得到这段文字的部分来自 Vim 脚本 我来这里问了与主题启动者相同的问题 并尝试了 L
  • Powershell根本无法连接到互联网

    我到处寻找这个问题的答案 但我想也许我缺乏谷歌忍者技能 我正在尝试在 Powershell 中运行一个简单的命令来下载一个字符串 实际上 我想下载一个 msi 并运行它 但我已将问题范围缩小到一个简单的示例 我正在运行的脚本是 client
  • 将元标记 Drupal 模块中的描述加粗部分

    我在用着MetatagDrupal 7的模块 我想将部分描述放在bold 例如 我有以下源代码 我想将 我的新内容 加粗 是否可以 这不可能 The meta description只能包含文本 该值必须是描述页面的自由格式字符串 即使您输
  • 在 Linq 中传递参数

    我在一个方法中有以下代码 someData table AsEnumerable Where row gt row someRow Equals Something Sum row gt row AnotherRow 在最后一行 我想从其他
  • gii 会自动为生成的模型创建关系吗?

    我是 Yii 的新手 在文档中 似乎暗示gii将为相关模型创建关系 但是当使用gii从DB生成模型时 情况似乎并非如此 例如 我有一个用户表和一个配置文件表 其中包含 user id INTEGER DEFAULT 0 列 但生成的模型中的
  • 在应用程序中检测 Google Play 来源

    我想知道是否可以在应用程序中找到它是从哪个 Google Play 商店 国家 地区下载的 像这样的解决方案 在有人下载应用程序后 我们获取 GPS 信息来找出用户所在的位置 这是不可行的 我正在询问可用于实现此目的的 Google Pla
  • JSF - 组件库,迁移还是不迁移?

    我正在使用一个名为 Woodstock 的旧组件库 每当我尝试更改某些内容时 我都会遇到找不到有关该库的足够文档的问题 我正在考虑迁移到另一个库 例如 ICE Faces 或 Prime Faces 但我怀疑迁移到另一个库将在 3 4 年内
  • 如果由递归函数调用,paintComponent 不起作用?

    I want to see all the Points one after another but I see only able to see 1 point What shold I change to see all the Poi
  • 如何使用 Jasmine 对 $scope.broadcast、$scope.$on 进行单元测试

    我是 AngularJs NodeJs 世界的新手 所以如果这对某些人来说是一个基本问题 请原谅 简而言之 我有两个控制器 第一个控制器 broadcast一个 Id 第二个控制器使用该 ID 获取该 Id on然后将该 Id 传递给中间人
  • C#/BinaryWriter:输出流中出现奇怪的字符

    我很难弄清楚是什么导致奇怪的字符出现在我的输出流中 完整代码 pastebin 提琴手输出 注意 s X 在我的境界之前 s 634227387532666996 Content Disposition form data name key
  • 访问 RTK 查询中的缓存数据(新)

    假设我们有 3 个组件 第一个是索引 它是父级 第二个是过滤器组件 第三个是表格组件 我使用突变来过滤一些数据并将它们显示在表格中 在过滤器组件中我这样做了 const filterSomeData useFilterSomeDataMut
  • 如何在android上检测和控制手机锁定/解锁?

    我想让手机在手机被锁定 锁定 键盘被锁定 并且用户想要解锁时询问一个问题 来自数据库 如果答案正确 则手机将解锁 否则手机会询问另一个问题 我不知道如何在需要时检测解锁和解锁 锁定手机 请帮我 您可能想看看设备策略管理器 and 设备管理教
  • 如何在Lucene 3.5.0中提取文档术语向量

    我正在使用 Lucene 3 5 0 我想输出每个文档的术语向量 例如 我想知道某个术语在所有文档和每个特定文档中的频率 我的索引代码是 import java io FileFilter import java io FileReader
  • 螺纹接头不旋转

    机器人仿真包中的接触建模出现问题drake 我尝试对 iiwa 操纵器进行位置控制 以影响连接到螺纹接头的主体 我期望坚果会向下移动 我看到的是末端执行器围绕螺母滑动 无法引起螺母沿着螺栓旋转 注意 这是一项持续调查this问题 简化的实验
  • AttributeError:'pygame.Surface'对象没有属性'event'

    我正在用 python 创建我的第一个游戏 并且正在一步一步地完成它 比我收到此错误消息 AttributeError pygame Surface object has no attribute event My code import
  • 在 AngularJs 中获取文本区域光标位置

    这个问题归结为需要获取a的光标位置
  • Mockito 在 Java 中“检测到错误的参数”

    所以我有这个 Mockito 单元测试 Test public void createCard when jwtServiceMock getId anyString thenReturn validUserToken when profi
  • Fortran 是否通过函数和子例程调用保留内部变量的值?

    经过多次痛苦的调试后 我相信我已经找到了 Fortran 的一个独特属性 我想在 stackoverflow 上验证它 我注意到的是 至少内部逻辑变量的值在函数或子例程调用中得以保留 这是一些示例代码来说明我的观点 PROGRAM func