根据Fortran中的字符串动态确定变量名称

时间:2012-03-02 15:57:34

标签: variables fortran

我想使用Fortran创建一个动态变量名。

变量名称将通过连接字符串和另一个字符串/整数来获得。然后我想使用这个变量名来存储一个值或另一个变量。

e.g。

! assign values to 2 variables

    my_string = h
    my_integer = 1

! perform concatenation resulting in the dynamic variable name,  h1


! Set the value of variable h1 to another integer value

    h1 = 5

4 个答案:

答案 0 :(得分:3)

我担心你无法做到这一点。 Fortran要求变量在编译时具有名称和类型。你(或其他SOers)可能会想出一些模拟你想要的东西,但它会成为一块垃圾。

你为什么要在Fortran中这样做?有很多语言允许这种变量声明。

修改

好吧,我想了一下,这是一个未完成的kludge。首先是“动态”变量的UDT:

type dynamic_var
  character(len=:), allocatable :: label
  class(*), allocatable :: value
end type

为这些变量声明一些空间:

type(dynamic_var), dimension(:), allocatable :: run_time_vars

并使用原始数据

allocate(run_time_vars(10)) ! No error checking, reallocate if necessary
! lots of code
write(run_time_vars(1)%label,'(a1,i1)') my_string, my_integer
allocate(run_time_vars(1)%value, source = my_value)

这编译,但没有运行,我不会保持足够长的时间来解决它,我会把它留给任何关心的人。

  • 对标签字段的写入不正确。
  • 值字段的源分配似乎无法正常工作。可能需要编写一个'解码'函数来使用,如下所示:

    allocate(run_time_vars(1)%value,source = decode(my_value))

就像我说的那样,它是一种kludge。

答案 1 :(得分:2)

我认为您想要使用数据结构。如果您有一对或一组值组合在一起,那么创建一个可以同时包含两者的派生数据类型。这个页面有一个解释:

http://web.mse.uiuc.edu/courses/mse485/comp_info/derived.html

如果您有这些对的列表(如上面的字符串和int),那么您可以创建这些类型的数组。以下示例代码取自上面链接的页面:

type mytype
   integer:: i
   real*8 :: a(3)
end type mytype

type (mytype) var

阵列:

type (mytype) stuff(3)

var%i = 3
var%a(1) = 4.0d0
stuff(1)%a(2) = 8.0d0

这样做的一个显着好处是,您可以将项目对/项目组一起传递给函数/子例程。这是一个称为Encapsulation的重要编程原则,在面向对象的编程范例中得到了广泛的应用。

答案 2 :(得分:1)

不,这在Fortran中是不可能的。

有关详细信息,请查看Reflection (computer programming)

答案 3 :(得分:1)

显然,由于上面给出的原因,这不是合法的Fortran(因此你会遇到麻烦......)。你可以使用smart(恭喜你!)kludges,但是......

为什么不创建数组 h(1:N),而不是使用 h 连接1,2或其他数字 不必在编译时知道:你只需将数组 h 声明为可分配的。

我认为,这是Fortran 90 +中的合法方式。