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 - Fatal编程技术网

如何访问fortran模块中的私有变量?

如何访问fortran模块中的私有变量?,fortran,Fortran,我知道私有变量的概念是它们不应该被访问,我确实希望它在程序的其余部分使用模块时能以这种方式工作,但我需要它来检查模块的内部工作 假设我有以下简化示例: module mod implicit none private integer :: value public :: set_value contains subroutine set_value(input) implicit none integer,intent(in) :: input value=inp

我知道私有变量的概念是它们不应该被访问,我确实希望它在程序的其余部分使用模块时能以这种方式工作,但我需要它来检查模块的内部工作

假设我有以下简化示例:

module mod
  implicit none
  private
  integer :: value
  public :: set_value

contains

subroutine set_value(input)
  implicit none
  integer,intent(in) :: input
  value=input
end subroutine

end module
现在我想测试子程序,看看它是否真的在做我想做的事情:我想写一个程序,使用这个模块,用输入8调用例程
set\u value
,然后检查内部变量
value
现在是否为8


我能做这个吗?还是有其他方法可以对私有变量的初始值设定项进行单元测试?

在我看来,有三种方法

  • 编写一个get函数来获取值并进行测试。您在评论中指出这是次优的,所以

  • 如果您的编译器支持Fortran 2003(例如,现代Fortran编译器的任何最新版本),请使用
    protected
    属性而不是
    private
    属性声明变量。这将允许从任何代码中读取变量,但不允许修改。这将强制它只能通过setter函数进行设置,但您可以在单元测试中直接检查它的值

    integer, protected :: value
    
  • 最后,如果所有其他操作都失败,您可以有条件地编译模块,以便有时变量不是私有的。例如,请执行以下操作:

    module mod
      implicit none
      private
      integer :: value
      public :: set_value
    
    #ifdef UNITTESTING
      public :: value
    #endif
    
    contains
    ...
    end module
    
    然后将文件名从
    .f90
    更改为
    .f90
    ,以便对其进行预处理(至少在gfortran和ifort上)。正常编译时,
    value
    将是私有的,但如果改为使用标志
    -dunitesting
    编译,则
    value
    将是公共的。当您编译测试用例时,您使用该标志,他们现在可以直接检查变量


  • 编写一个
    get_value
    函数并使用它进行测试。即使我只将该函数用于测试?另外,我不是要同时测试这两个例程吗?如果你不想跟随@casey,只需将其设置为public进行测试,然后再将其设置为private!请不要用条件编译。。。另一种选择可能会受到保护,见@IanBush谢谢,我已经忘记了。我已经添加了这一点,但保留了条件编译部分,以防他们使用的是一个古老的编译器。太棒了!但我不会删除注释,因为条件编译是邪恶的!!!!!!(坐下来,等待评论)(但我诚实地认为,这只是一种更糟糕的全局变量形式)测试私有函数和子例程怎么样?我不同意@IanBush关于连续编译的观点,对我来说,这是最不具侵入性的解决方案。我们中的一些人被Fortran 90困住了。。。