Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 限制从其他模块过程访问模块过程_Fortran_Fortran2008 - Fatal编程技术网

Fortran 限制从其他模块过程访问模块过程

Fortran 限制从其他模块过程访问模块过程,fortran,fortran2008,Fortran,Fortran2008,我最近发现了Fortran 2008的新特性,即子模块s 请看一下我的最低工作示例。编译后,它会在终端上放置以下内容: Accessed sub0 Accessed sub1 Accessed sub2 也就是说,sub1和sub2的模块过程可以相互调用,一切正常 由于代码体系结构和维护等原因,我需要以某种方式限制这种访问。也就是说,模块过程(sub1和sub2)彼此不可见我可以这样做吗? MODULE parent PRIVATE PUBLIC :: sub0

我最近发现了Fortran 2008的新特性,即
子模块
s

请看一下我的最低工作示例。编译后,它会在终端上放置以下内容:

 Accessed sub0
 Accessed sub1
 Accessed sub2
也就是说,
sub1
sub2
的模块过程可以
相互调用
,一切正常

由于代码体系结构和维护等原因,我需要以某种方式限制这种访问。也就是说,模块过程(
sub1
sub2
)彼此不可见我可以这样做吗?

MODULE parent
    PRIVATE
    PUBLIC :: sub0
    INTERFACE
        MODULE SUBROUTINE sub1 ()
        END SUBROUTINE
        MODULE SUBROUTINE sub2 ()
        END SUBROUTINE
    END INTERFACE
    CONTAINS
    SUBROUTINE sub0 ()
        PRINT *, 'Accessed sub0'
        CALL sub1 ()
    END SUBROUTINE
END MODULE

SUBMODULE ( parent ) submod1
    CONTAINS
    MODULE PROCEDURE sub1
        PRINT *, 'Accessed sub1'
        CALL sub2 ()
    END SUBROUTINE
END SUBMODULE

SUBMODULE ( parent ) submod2
    CONTAINS
    MODULE PROCEDURE sub2
        PRINT *, 'Accessed sub2'
    END PROCEDURE
END SUBMODULE

PROGRAM driver
    USE parent
    CALL sub0 ()
END PROGRAM
不是真的

sub1
sub2
都由
sub0
访问,这意味着(或某些组合):

  • sub
    sub2
    必须在与
    sub0
    相同的模块/子模块层次结构级别上已知,如示例所示。
    sub1
    sub2
    的子程序必须与
    sub0
    处于同一级别或更低级别,在这种情况下,主机关联使
    sub1
    sub2
    程序的知识可供其他程序使用

  • sub1
    sub2
    需要是其他两个模块的公共实体。但是在这种情况下,
    sub1
    sub2
    的子程序总是可以直接引用定义另一个模块的模块

  • sub1
    sub2
    是外部过程。同样,
    sub1
    sub2
    的子程序可以直接访问其他外部过程

如果子范围中的名称隐藏在主机实体中的名称(或通过使用F2015标准草案中的import语句的扩展功能),则可以对子范围隐藏主机中的实体。您可以使用与要从特定作用域中阻止的过程名称相同的名称对某个对象进行伪声明,但这是相当人为的。

不太可能

sub1
sub2
都由
sub0
访问,这意味着(或某些组合):

  • sub
    sub2
    必须在与
    sub0
    相同的模块/子模块层次结构级别上已知,如示例所示。
    sub1
    sub2
    的子程序必须与
    sub0
    处于同一级别或更低级别,在这种情况下,主机关联使
    sub1
    sub2
    程序的知识可供其他程序使用

  • sub1
    sub2
    需要是其他两个模块的公共实体。但是在这种情况下,
    sub1
    sub2
    的子程序总是可以直接引用定义另一个模块的模块

  • sub1
    sub2
    是外部过程。同样,
    sub1
    sub2
    的子程序可以直接访问其他外部过程


如果子范围中的名称隐藏在主机实体中的名称(或通过使用F2015标准草案中的import语句的扩展功能),则可以对子范围隐藏主机中的实体。您可以使用与要从特定范围中屏蔽的过程名称相同的名称对某个对象进行虚拟声明,但这是相当人为的。

为什么不为这两个过程设置两个单独的模块?@VladimirF Yes当然可以。这正是我现在正在做的。但是,我正在努力保持Fortran的新的现代特性,如
子模块
。此外,据我所知,类似C#中的代码映射在Fortran中是不可用的,因此我害怕使用大量的源代码(调试、维护和开发)。尝试了上述方案来简化过程之间的
调用
控制,但这似乎是错误的。为什么不为两个过程提供两个单独的模块?@VladimirF是的。这正是我现在正在做的。但是,我正在努力保持Fortran的新的现代特性,如
子模块
。此外,据我所知,类似C#中的代码映射在Fortran中是不可用的,因此我害怕使用大量的源代码(调试、维护和开发)。尝试了上述方案来简化过程间调用的控制,但这似乎是错误的。“sub1和sub2需要是其他两个模块的公共实体。但在这种情况下,sub1或sub2的子程序总是可以直接引用定义另一个模块的模块。”但他们不必这样做。“sub1和sub2必须是其他两个模块的公共实体。但在这种情况下,sub1或sub2的子程序总是可以直接引用定义另一个的模块。”但它们不必这样做。