我想使用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
答案 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 +中的合法方式。