Fortran:引用带有字符串变量的数组/数据块

时间:2014-02-14 11:50:23

标签: variables fortran

描述我的问题并不容易,所以我将以一个例子来做。假设我有两个数据块和一个Character数组(字符串):

DATA Foo1/ 0 1 2 3 /
DATA Foo2/ 4 5 6 7 /
CHARACTER*4 FOO

FOO是此处的输入,可以包含两个字符串"Foo1""Foo2"中的一个。 我非常希望能够编写类似于FOO(2)的内容,我的意思是:获取变量FOO所引用的数据块的第二个元素。例如,如果FOO="Foo2",那么在我的幻想世界中:FOO(2) = 5

但是,FOO只是一个字符串,而不是数组/数据块的名称。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

可能有指针选项:

integer, target, dimension(4) :: Foo1, Foo2
data Foo1/0, 1, 2, 3/
data Foo2/4, 5, 6, 7/
integer, pointer, dimension(:) :: foo_ptr
character(4) foo

...

if (foo.eq.'Foo1') then
  foo_ptr => Foo1
else  ! Perhaps more condition checking
  foo_ptr => Foo2
end if

print*, foo_ptr(2)

答案 1 :(得分:0)

或通过用户定义的类型:

program Match

type Foo_type
   character (len=4) :: name
   integer, dimension (1:4) :: values
end type Foo_type

type (Foo_type), dimension (:), allocatable :: Foo

integer :: i, Match_i
character (len=4) :: MatchName

allocate ( Foo (2) )

!  initialize by some means...
Foo (1) % name = "Foo1"
Foo (2) % name = "Foo2"
Foo (1) % values = [ 0, 1, 2, 3 ]
Foo (2) % values = [ 4, 5, 6, 7 ]

write (*, '("Input name: ")', advance="no")
read (*, '(A)' )  MatchName

Match_i = 0
MatchLoop: do i=1, size (Foo)
   if ( Foo (i) % name == MatchName ) then
      Match_i = i
      exit MatchLoop
   end if
end do MatchLoop

!  handle Match_i = 0

write (*, *) Foo (Match_i) % values (2)

end program Match