fortran 中的过程 nopass 与普通函数

2023-12-22

因此,在其他语言中,静态方法可以访问静态成员,并且它们的可见性受到类范围的限制。在 Fortran 中,没有静态成员(如果我错了,请纠正我)并且方法名称是全局可访问的,因此我什至不能在不同的类中拥有两个同名的静态方法。我认为“nopass”方法是“静态”的,但我什至不确定该术语是否适用。鉴于上述情况,我认为与普通的模块函数没有任何区别。与普通函数相比,使用 nopass-methods 有什么好处吗?

Edit:

无法在不同类中使用两个同名静态方法的说明:

module test_mod
  type type1
  contains
    procedure, nopass :: proc => proc1
  end type

  type type2
  contains
    procedure, nopass :: proc => proc2
  end type

contains
  subroutine proc1()
    print *, 'proc1'
  end subroutine

  subroutine proc2()
    print *, 'proc2'
  end subroutine
end module

显然,我不能只说call proc()现在,我也不能使用类名来帮助编译器选择正确的方法。


考虑可访问性:只要类型可访问,公共类型绑定过程就可以访问。

module mod
  private
  type, public :: type1
  contains
    procedure, nopass :: proc
  end type

contains

  subroutine proc
  end subroutine

end module

  use mod
  type(type1) t1

  call t1%proc
  call proc  ! No, we can't call proc from mod1

end

同样,与use <module>, only <...>

module mod1
  type type1
  contains
    procedure, nopass :: proc
  end type

contains

  subroutine proc
  end subroutine

end module

module mod2
  type type2
  contains
    procedure, nopass :: proc
  end type

contains

  subroutine proc
  end subroutine

end module

我们可以避免模块过程名称中的冲突,而无需在使用关联上重命名:

  use mod1, only : type1
  use mod2, only : type2

  type(type1) t1
  type(type2) t2

  call t1%proc
  call t2%proc    ! These aren't ambiguous

end

为了避免过程中出现歧义,我们必须重命名:

  use mod1, proc1=>proc
  use mod2, proc2=>proc

  call proc1
  call proc2

end

还有过程参考的动态选择:

module mod
  type type1
  contains
    procedure, nopass :: proc=>proc1
  end type

  type, extends(type1) :: type2
  contains
    procedure, nopass :: proc=>proc2
  end type

contains

  subroutine proc1
  end subroutine

  subroutine proc2
  end subroutine

end module

use mod
class(type1), allocatable :: t

t=type1()
call t%proc  ! proc1

t=type2()
call t%proc  ! proc2

end

但应该注意的是,像这样的绑定名称t1%proc与过程名称不同

 use mod
 type(type1) t1
 call sub(proc1)    ! Where this is accessible
 call sub(t1%proc)  ! We cannot do this

contains

 subroutine sub(proc)
   procedure() proc
 end subroutine

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

fortran 中的过程 nopass 与普通函数 的相关文章

  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 使用 boost 线程和非静态类函数

    所以我做了一些研究 发现你可以创建一个 boost thread 对象 并通过使用 this 和 boost bind 等以非静态类函数开头 这确实没有多大意义对我来说 我能找到的所有示例都在与其启动的函数相同的类中启动了 boost th
  • 我可以在 Perl 中访问动态指定类中的静态方法吗?

    是否可以在 Perl 中动态指定一个类并访问该类中的静态方法 这不起作用 但说明了我想做的事情 use Test Class1 my class Test Class1 class static method 我知道我可以这样做 class
  • 为什么要以静态的方式访问静态字段呢?

    public enum MyUnits MILLSECONDS 1 milliseconds SECONDS 2 seconds MINUTES 3 minutes HOURS 4 hours private MyUnits int qua
  • OOP 中的对象和结构有什么区别?

    对象与结构体有何区别 我们何时以及为何使用对象而不是结构体 数组与两者有何不同 何时以及为何使用数组而不是对象或结构 我想了解每个的用途 显然 您可以根据您的编程风格模糊这些区别 但通常结构是结构化的数据块 对象是可以执行某种任务的主权实体
  • GO TO 语句 - Fortran 到 Matlab

    我一直在努力将此网格搜索代码从 Fortran 转换为 Matlab 但是我无法正确合并 GO TO 语句 我正在尝试使用 while 循环 但我认为我需要其他东西来结束搜索 任何帮助将不胜感激 vmax 1 0E 15 amax G 1
  • Python OO程序结构规划

    我是 OOP 的初学者 我想创建一个包含三个类 A B 和 C 的程序 该类的每个实例都由一组特征 Achar1 Achar2 等定义 该程序应该创建uses由 A 元素 B 元素和 C 元素以及开始日期和结束日期组成 A 和 B 都有子类
  • OOP概念混乱?

    在阅读一些编程书籍时 我注意到作者说 在OOP中 你在理解OOP的主要思想时可能会有些困惑 是啊 我有些困惑 您是否也有同样的情况 是什么让程序员 甚至是经验丰富的程序员 感到困惑 如果你拥有它 你怎么能打败这个 Thanks The An
  • 拦截对对象属性的 __getitem__ 调用

    问题 我怎样才能拦截 getitem 调用对象属性 解释 所以 场景如下 我有一个对象将类似字典的对象存储为属性 每次 getitem 该属性的方法被调用 我想拦截该调用并根据键对获取的项目进行一些特殊处理 我想要的看起来像这样 class
  • 显示带有 id 的内部连接的名称[重复]

    这个问题在这里已经有答案了 我有这个查询 select from countrysegments inner join country on countrysegments country id country id inner join
  • 信息隐藏和封装有什么区别?

    两者有什么区别信息隐藏 and 封装 我读到封装意味着将数据和对它们进行操作的过程捆绑在一起 如果是这样 下面的类是否实现了封装 class IsThisEncapsulation public int age public int get
  • 使用 OOP 结构进行复数加法和减法

    我这里有一个代码应该打印两个复数的和与差 给出的说明是 制定方法add subtract and print to be void and 使用构造函数的对象进行测试 public class Complex param args publ
  • 使用继承编写 __repr__ 函数的正确方法

    我正在尝试 OOP python 但我不确定 repr 函数继承 由于父类函数如下所示 def repr self Returns representation of the object return r format Class nam
  • 关于 C99 函数参数中数组大小“保证”功能的实际优势?

    C99 引入了一种新的函数参数表示法 其中static关键字可用于指定参数至少有 N 个元素 6 7 6 3 函数声明符 p7 https port70 net 7Ensz c c11 n1570 html 6 7 6 3p7 将参数声明为
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 如何初始化一个大多数值相同但某些值不同的静态数组?

    我想使用静态或常量数组 但使用除 T N 句法 我需要定义特定元素 但所有其他值都可以默认为 0 或其他值 在 C 中 您可以执行以下操作 byte ARRAY 256 0x1F 1 lt lt 4 Or even simply just
  • 这是 isinstance pythonic/“good” 的用法吗?

    的副作用是this https stackoverflow com questions 3110624 why typeclassinstance is returning instance 3110654 3110654问题是我被引导到这
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • 使用 C# 9.0 记录构建类智能枚举/类判别联合/类和类型数据结构?

    玩弄record在 C 中输入 看起来它对于构建类似可区分联合的数据结构非常有用 我只是想知道我是否错过了一些我以后会后悔的陷阱 例如 abstract record CardType Case types public record Ma

随机推荐