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

Fortran 将程序输入保存到模块,以便;“全球”;使用

Fortran 将程序输入保存到模块,以便;“全球”;使用,fortran,fortran90,fortran95,Fortran,Fortran90,Fortran95,我用Fortran 90编写了一个程序,从文本文件中读取数百个输入,并对它们执行许多不同的顺序操作 我不想一直将这数百个值传递给每个子例程(有很多!)。是否有一种方法可以将从该文件读取的数据保存到任何子例程都可以访问的全局变量?我想我可以将这些值保存到一个模块中,每个子例程都可以调用该模块,但我不确定如何操作。您只需将变量放入一个模块中,然后从每个子例程使用该模块即可。或者将子程序放在同一模块中。这是现代Fortran中全局变量的首选方法;优先于普通块。公共块增加了存储顺序的不必要复杂性。原则上

我用Fortran 90编写了一个程序,从文本文件中读取数百个输入,并对它们执行许多不同的顺序操作


我不想一直将这数百个值传递给每个子例程(有很多!)。是否有一种方法可以将从该文件读取的数据保存到任何子例程都可以访问的全局变量?我想我可以将这些值保存到一个模块中,每个子例程都可以调用该模块,但我不确定如何操作。

您只需将变量放入一个模块中,然后从每个子例程使用该模块即可。或者将子程序放在同一模块中。这是现代Fortran中全局变量的首选方法;优先于普通块。公共块增加了存储顺序的不必要复杂性。原则上,您应该在每个声明中包含SAVE,因为如果模块超出范围,也就是说,如果在程序执行期间主程序或任何子例程都没有使用模块,则允许丢失值。可能没有编译器真正做到这一点

module my_mod

  real, dimension (100) :: array
  integer :: OneInt

contains

subroutine X

end subroutine X

end module my_mod

program my_prog


use my_mod

read ()  array

call subroutine X

end program my_prog

您只需将变量放入一个模块中,并从每个子例程使用该模块。或者将子程序放在同一模块中。这是现代Fortran中全局变量的首选方法;优先于普通块。公共块增加了存储顺序的不必要复杂性。原则上,您应该在每个声明中包含SAVE,因为如果模块超出范围,也就是说,如果在程序执行期间主程序或任何子例程都没有使用模块,则允许丢失值。可能没有编译器真正做到这一点

module my_mod

  real, dimension (100) :: array
  integer :: OneInt

contains

subroutine X

end subroutine X

end module my_mod

program my_prog


use my_mod

read ()  array

call subroutine X

end program my_prog

与使用模块变量正交,考虑使用一个或多个派生类型将“数百个值”组合在一起(以某种方式将值分组为特定派生类型)。p> (在更基本的层面上,有时用数组而不是一系列标量来表示信息更适合该信息的性质,因此在数组中存储和传递该信息。)

这使得理解程序中的信息流变得更加容易——在过程引用的站点上,阅读代码的人不一定知道引用过程可能访问的模块和模块变量。在某些情况下,它还可以使将来更容易扩展您的程序——如果在派生类型中描述多个现有实例,而不是作为一系列模块变量来描述,则更容易拥有这些实例

因此,不是:

SUBROUTINE proc( temperature, pressure,  &
    composition_a, composition_b, composition_c )
  REAL, INTENT(IN) :: temperature, pressure,  &
      composition_a, composition_b, composition_c
...
考虑:

TYPE State
  REAL :: temperature
  REAL :: pressure
  REAL :: composition(3)
END Type State
...
SUBROUTINE proc(system_state)
   TYPE(State), INTENT(IN) :: system_state
...

在其他情况下,模块变量可能更合适-拆分是一个判断问题

< P>与使用模块变量正交,考虑使用一个或多个派生类型将“数百个值”组合在一起(以某种方式将值分组为特定派生类型)。p> (在更基本的层面上,有时用数组而不是一系列标量来表示信息更适合该信息的性质,因此在数组中存储和传递该信息。)

这使得理解程序中的信息流变得更加容易——在过程引用的站点上,阅读代码的人不一定知道引用过程可能访问的模块和模块变量。在某些情况下,它还可以使将来更容易扩展您的程序——如果在派生类型中描述多个现有实例,而不是作为一系列模块变量来描述,则更容易拥有这些实例

因此,不是:

SUBROUTINE proc( temperature, pressure,  &
    composition_a, composition_b, composition_c )
  REAL, INTENT(IN) :: temperature, pressure,  &
      composition_a, composition_b, composition_c
...
考虑:

TYPE State
  REAL :: temperature
  REAL :: pressure
  REAL :: composition(3)
END Type State
...
SUBROUTINE proc(system_state)
   TYPE(State), INTENT(IN) :: system_state
...

在其他情况下,模块变量可能更合适-拆分是一个判断问题

谢谢你的建议。我对“相似”变量使用数组,但我目前没有使用任何其他派生数据类型,这将非常有益。谢谢你的建议。我将数组用于“类似”变量,但我目前没有使用任何其他派生数据类型,这将非常有益。谢谢您的帮助!在我在模块上看到的许多教科书示例中,模块专门用于保存参数,因此我假设值必须在模块中显式声明,而不是来自其他地方。感谢您的帮助!在我在模块上看到的许多教科书示例中,模块专门用于保存参数,因此我假设值必须在模块中显式声明,而不是来自其他地方。