描述我的问题并不容易,所以我将以一个例子来做。假设我有两个数据块和一个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
只是一个字符串,而不是数组/数据块的名称。
有办法做到这一点吗?
答案 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