如何在 Fortran 中将子例程名称作为参数传递?

2024-02-27

将子例程名称作为参数传递的语法是什么?示意图:

  .
  .
call action ( mySubX ( argA, argB ) )
  .
  .

subroutine action ( whichSub ( argA, argB ) )
  ...
call subroutine whichSub ( argA, argB )
  ...
end subroutine action

目标是拥有call subroutine whichSub ( argA, argB ) act as call subroutine mySubX ( argA, argB )。 我的偏好是避免传递 switch 参数,然后使用 SELECT CASE。


It is

call action(mySubX)

假设动作看起来像

subroutine action(sub)
  !either - not recommmended, it is old FORTRAN77 style
  external sub
  !or - recommended
  interface
    subroutine sub(aA, aB)
      integer,intent(...) :: aA, aB
    end subroutine
  end interface
  ! NOT BOTH!!

  call sub(argA, argB)

假如action知道该放什么argA, argB代表aA, aB.

否则,如果您还想传递参数

call action(mySubX, argA, argB)

subroutine action(sub, argA, argB)
  !either - not recommmended, it is old FORTRAN77 style
  external sub
  !or - recommended
  interface
    subroutine sub(aA, aB)
      integer,intent(...) :: aA, aB
    end subroutine
  end interface

  integer, intent(...) :: argA, argB

  call sub(argA, argB)

我认为在这里使用函数指针不好,当您有时必须更改指针(它指向的子例程)的值时,它们很好。正常的过程参数在 FORTRAN77 中有效,并且现在仍然有效。


因此,根据评论中的要求,如果您位于模块中,并且可以从模块访问具有正确接口的过程(可能在同一模块中),则可以使用过程语句来获取接口块的棒:

module subs_mod
contains
  subroutine example_sub(aA, aB)
    integer,intent(...) :: aA, aB
    !the real example code
  end subroutine
end module

module action_mod
contains

  subroutine action(sub)
    use subs_mod
    procedure(example_sub) :: sub

    call sub(argA, argB)
  end subroutine
end module

但更有可能的是,您将创建一个抽象接口,而不是真正的子例程,您将使用过程语句引用该接口,因此最终一切都将与以前相似:

module action_mod

  abstract interface
    subroutine sub_interface(aA, aB)
      integer,intent(...) :: aA, aB
    end subroutine
  end interface

contains

  subroutine action(sub)
    procedure(sub_interface) :: sub

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

如何在 Fortran 中将子例程名称作为参数传递? 的相关文章

  • 加载两个包含相同符号的本机库时出现内存问题

    我正在尝试使用 JNA 同时操作本机 非线程安全的 Fortran 库 由于该库不是线程安全的 我尝试实例化同一库的不同副本 但显然它们似乎共享内存地址 如果我修改一个库中的一个变量 则另一个库中的变量也会被修改 这种行为使得它们不可能在单
  • 具有重载赋值的嵌套派生类型

    我有一个派生类型 wrapper 包含其他派生类型 over 对于后者 赋值运算符已被重载 由于派生类型的分配按默认组件方式发生 因此我希望分配两个实例wrapper将调用重载分配over在某一点 然而 使用下面的程序 情况似乎并非如此 仅
  • 将标量和数组(任意维度)从 Fortran 传递到 C

    我有以下名为的 Fortran 子例程show value调用一个名为的 C 函数show value INTERFACE SUBROUTINE show value variable BIND C name show value USE
  • C++ 和 Fortran 混合链接问题

    我在网上做了一些搜索 但我找不到如何从 Linux 编译简单的 C 和 Fortran 代码 我需要让它变得复杂 但我只需要知道如何从一个简单的例子开始 我的C 代码是这样的 include
  • Fortran 90 - 尝试读取文件末尾之后的内容

    我在 Fortran 90 中遇到读取问题 我尝试读取 31488 行数据 我正在使用 Portland Group Fortran 90 编译器 我的错误信息是这样的 PGFIO F 217 列表定向读取 单元 14 尝试读取文件末尾 文
  • 在 Fortran 语言中 advance='no' 是什么意思?

    我是 Fortran 新手 我不明白这一行 write a35 advance no in program democonvertion implicit none real tc tf tr tk write a35 advance no
  • 大多数编译器都会优化 MATMUL(TRANSPOSE(A),B) 吗?

    In a Fortran program I need to compute several expressions like M v MT v MT M M MT etc Here M and v are 2D and 1D arrays
  • 如何使用模块向 Fortran 公开 Python 回调

    这个 scipy 文档页面 http docs scipy org doc numpy dev f2py python usage html call back arguments关于 F2Py 指出 回调函数 也可以在模块中显式设置 然后
  • 将数据写入列中的文件 (Fortran)

    我需要在 Fortran 90 中写入一些数据到文件中 我应该如何使用WRITE input将值分组为columns WRITE总是放一个new line每次通话后 这就是问题所在 代码示例 open unit 4 file generat
  • 将 C 字符串数组传递给 Fortran (iso_c_binding)

    如何传递 C 字符串数组 char cstrings 到 Fortran 子程序 问题使用 iso c binding 的 fortran C 桥接器中的字符串数组 https stackoverflow com questions 968
  • 可变格式

    我编写了一个程序来计算平方有限差分矩阵 您可以在其中输入行数 等于列数 gt 这存储在变量矩阵中 该程序运行良好 program fin diff matrix implicit none integer dimension allocat
  • fortran中双引号和单引号的区别?

    我刚刚开始使用 Fortran 对双引号和单引号的使用感到困惑 它们是等价的 它们的用法没有区别 您可以使用它来打印引号字符之一 print print 首先打印 进而 注意 您还可以在一行中使用两个引号字符来打印一个 print prin
  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • Fortran PURE 函数可以使用全局参数吗?

    在我看来 Fortran 中所谓的纯函数对于那些使用函数式编程的人来说似乎不够纯粹 这是我的问题 假设我有以下代码 MODULE basics IMPLICIT NONE INTEGER PARAMETER dp kind 1 0d0 RE
  • gfortran 未定义的引用

    我正在尝试编译一个依赖很多东西的程序 我使用并修改了提供的 makefile 来代表我的计算机设置 但在编译的最后一步中我不断收到许多未定义的引用 导致问题的命令行是 gfortran o cosmomc ParamNames o Matr
  • 如何调用模块中子程序内部的函数?

    我有一个包含子例程的模块 该子例程又包含一个函数 我说use themodule在我的主程序中 我可以call thesubroutine 但是如何访问子例程中包含的函数呢 代码如下所示 module useful integer para
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • 在一条语句中对多个变量进行相同的赋值

    有没有一种方法可以为不同的变量分配相同的值 而无需在单个语句中构造数组 例如 如果我有变量a b c d and e 我可以分配类似的东西吗 a b c d e 10 0 我知道我可以用一行来做 a 10 0 b 10 0 c 10 0 d
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p

随机推荐

  • React router dom:路由和路由器根本不工作

    我对反应相当陌生 并尝试使用react router dom进行重定向 我按照文档做了所有事情 但我的代码似乎不起作用 我收到一条关于找不到元素的错误 我不明白是什么原因造成的 另外 我现在只是尝试使用地址栏访问该页面 而不是使用任何按钮或
  • Jquery datepicker beforeShowDay 初始化后

    当我在初始化后设置 beforeShowDay 时 它不起作用 dater datepicker dater datepicker beforeShowDay renderCalendarCallback 当我第一次更改并在 ShowDay
  • Laravel 从公共目录中删除目录

    如何从公用文件夹中删除目录 现在我尝试这个 Storage deleteDirectory directory 但这看起来在存储文件夹中 您可以使用Illuminate Filesystem Filesystem为了这 Laravel 提供
  • 消除作为模板参数传递的重载成员函数指针的歧义

    我正在尝试重新创建观察者模式我可以完美地将参数转发给观察者的给定成员函数 如果我尝试传递一个地址成员函数其中有多次覆盖 它无法根据参数推导出正确的成员函数 include
  • python的跨平台usb模块?

    我有兴趣在 python 中使用 USB 设备进行一些跨平台工作 关于可以执行此类操作的模块有任何提示或建议吗 我浏览了 SF 和 googlecode 但运气不佳 thanks ct PyUSB http pyusb berlios de
  • QPainterPath 与直线的交点(通过 x 求 QPainterPath y)

    我有 QPainterPath 我需要通过 x 找到 QPainterPath 的 y 坐标 我在 QPainterPath 中找到了 intersected 方法 因此 我创建了新的 QPainterPath 它是具有 x 坐标的从路径边
  • 如何使用java获取weka中的最近邻居

    我一直在尝试使用与 weka 机器学习库一起使用的 Ibk 最近邻算法 我知道如何对实例进行分类 但我想实现协同过滤功能 因此我需要实际获取最接近感兴趣对象的实际对象列表 在 weka 中我实际上该如何使用它的 java API 来做到这一
  • 在Erlang中如何获取客户端的ip和端口?

    在下面的代码中 服务器正在侦听端口 2345 接受客户端的连接后 它返回 ok Socket start gt ok Listen gen tcp listen 2345 binary packet 4 reuseaddr true act
  • 如何在继续之前等待经过dispatch_async?

    我正在执行一系列的dispatch async 我只想在它们全部完成后更新UI 问题是dispatch async 中的方法在单独的线程中调用某些内容 因此它会在数据完全加载之前返回 并且在加载所有内容之前调用dispatch group
  • PHP-正则表达式检查字符串是否有中文字符

    我有字符串 str我想检查它的内容是否有汉字 true false str 赕就可消垻 只有当所有方块都被消垻时才可以过关 你能帮我么 谢谢 阿德里安 您可以使用 unicode 字符类http www regular expression
  • 求解三次方程以找到曲线上距某点最近的点

    Ok 我有一个射弹 其位置定义为 a x initialX initialDX time a y initialY initialDY time 0 5 gravtiy time 2 我希望能够预测该射弹将与我的环境中的哪些障碍物发生碰撞
  • 如果未在命令行上指定,则仅在 psql-script 中设置变量

    我想给option在命令行上为我的 psql 脚本指定一些变量 psql v myVar myValue 但是我发现无法在 sql 脚本本身中为这些变量提供默认值 语法 set MyVar defaultValue 覆盖值myValue在
  • 在python中将一维列表转换为具有给定行长度的二维列表[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以将一维列表转换为具有给定行长度的二维列表 假设我有一个这样的列表 myList 1 2 3 4 5 6 7 8 9 我想将上面的列表转换为 3 x 3 的表格 如下所示 myList 1
  • 测量查询性能:“执行计划查询成本”与“所用时间”

    我正在尝试确定两个不同查询的相对性能 并且有两种可用的方法来衡量它 1 运行两个查询并对每个查询计时2 运行两者并从实际执行计划中获取 查询成本 这是我运行的用于计时查询的代码 DBCC FREEPROCCACHE GO DBCC DROP
  • msi 安装程序运行两次

    我有一个通过 msi 安装的程序 msi 是使用 VS2008 部署项目构建的 并具有在安装完成后运行该程序的自定义操作 一旦 msi 运行 我可以简单地更新版本号 生成新的产品代码 并且 msi 可以在同一台 PC 上再次运行 但是 我想
  • Fancybox 宽度不适用

    使用以下 JS 宽度不会被调整 我使用的时候没有调整 750 or 750px a city prompt fancybox width 750 我已经发布在fancybox http fancybox net api论坛讨论过这个问题 但
  • Magento 扁平化产品

    尝试启用并重新索引产品平面数据时 从 magento 收到错误 平面目录模块的可过滤和 或可排序限制为 64 个 属性 目前有521个 请减少数量 可过滤 可排序的属性以便使用此模块 我不明白这意味着什么以及 magento 从哪里获取这个
  • 为什么选择下拉菜单不允许我单击某个项目 IE,但在 Firefox、Chrome 等中却可以正常工作?

    我正在使用jquery mega下拉菜单插件 http www designchemical com lab jquery mega drop down menu plugin examples 在其中一个菜单中 我想添加一个下拉框 它在
  • 如何在flutter中分割dart类?

    我做了以下测试 但它不起作用 main dart class Test static const a 10 final b 20 final c a 1 part dart part of main dart class Test fina
  • 如何在 Fortran 中将子例程名称作为参数传递?

    将子例程名称作为参数传递的语法是什么 示意图 call action mySubX argA argB subroutine action whichSub argA argB call subroutine whichSub argA a