【问题标题】:Rename localy a Fortran derived type loaded from a module在本地重命名从模块加载的 Fortran 派生类型
【发布时间】:2013-04-12 09:36:46
【问题描述】:

我想通过使用 OOP 来提高我的 Fortran 代码的可读性。 我最终得到了相当复杂的派生类型,例如:a%b%c%d%e,在模块 mymod 中定义。

现在,我在一个子程序中做

subroutine test
    use mymod, only: a
    ! lots of unrelevant stuff, especially with a%b%c%d%e.
end subroutine

我的问题如下:我想在这个特定的子例程中将a%b%c%d%e 重命名为简单的newname

我测试过,例如:use mymod, only: a%b%c%d%e => newname,但我得到一个编译错误,指出:

错误:USE 语句中的语法错误

【问题讨论】:

  • 查看associate 构造。
  • @eriktous:你应该补充说这是一个真正的答案,在我看来这是最合适的解决方案。
  • @sigma:是的,会的。我写这篇文章的时间不多,所以把它写成评论来帮助 OP 快速解决,一半希望其他人能写出正确的答案。

标签: module fortran derived-types


【解决方案1】:

您可以使用associate 构造来执行此操作。

subroutine test
    use :: mymod, only: a
    associate(newname => a%b%c%d%e)
        ! lots of unrelevant stuff, now using newname.
    end associate
end subroutine

【讨论】:

    【解决方案2】:

    可以说更好的方法是通过子例程的参数列表传递参数,在这种情况下,您可以使用任何您喜欢的本地名称:

    subroutine test(a)
    ...
    end subroutine
    

    然后调用

    call subroutine test(a%b%c%d%e)
    

    而且,当我在写作时,当您在 use 语句中重命名实体时,表单是

    local-name => use-name 
    

    而不是像你所拥有的那样,

    use-name => local-name
    

    【讨论】:

    • 谢谢,但是这个 a%b%c%d%e 绝对可以在代码中的任何地方使用。难道没有更“面向模块”的方式吗?
    • 例如,它不能用于use, only 规范中。
    猜你喜欢
    • 2015-11-18
    • 2013-04-04
    • 2012-10-23
    • 2019-03-02
    • 1970-01-01
    • 2013-05-07
    • 2013-10-07
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多