FORTRAN:使用字符作为可更改的数组名称

时间:2015-02-16 10:33:09

标签: arrays fortran character

我正在尝试编写子程序以某种方式访问​​数组。 子例程的一个输入参数是包含需要访问的数组的名称的字符。这是一个相当简化的代码示例,说明我通常会想到这个如何工作:

PROGAM prog
real, dimension(3,3) :: array1(3,3)
real, dimension(3,3) :: array2(3,3)
real value1
real value2
... fill 'array1' and 'array2'...
call sub(array1,2,2,value1)
call sub(array2,2,2,value2)
... do something with 'value1' and 'value2'...
END

SUBROUTINE sub(name,x,y,out)
character(len=*), intent(in) :: name
integer, intent(in) :: x
integer, intent(in) :: y
real, intent(out) :: out
out = name(x,y)
RETURN
END

我想要的是根据参数中的请求访问array1(2,2)的子例程,并将此值返回给value1。然后访问array2(2,2)并将此值返回value2。上面的代码片段不起作用 - 难怪这一点。如何将name(x,y)分别替换为array1(x,y) array2(x,y)

非常感谢和最诚挚的问候!

2 个答案:

答案 0 :(得分:0)

如果数组是在调用者中声明的,则不必使用数组的名称来获取其内容。然后使用普通参数关联。

您可以将子程序编写为

subroutine sub(a,x,y,out)
  integer, intent(in) :: x, y
  real, intent(out) :: out
  real, dimension(:,:), intent(in) :: a
  out = a(x,y)
end subroutine sub

在主程序

中要做的更简单
value1 = array1(2,2)
value2 = array2(2,2)

我会推荐一本关于Fortran的教科书,甚至是http://en.wikipedia.org/wiki/Fortran_95_language_features

修改

你也可以使用SELECT CASE语句,如下所示:

  subroutine bar(c, i, j, out)
    character(len=*), intent(in) :: c
    integer, intent(in) :: i,j
    real, intent(out) :: out

    select case (trim(c))
      case ("array1")
         out = array1(i,j)
      case ("array2")
         out = array2(i,j)
      case default
         stop "Argument is bletchful"
      end case
  end subroutine bar

我只是无法理解这会有什么用处,而不是直接使用数组。

答案 1 :(得分:0)

这是你想要的吗?

select case (array_name)
   case ("array_dog")
      array_ptr => array_dog
   case ("array_cat")
      array_ptr => array_cat
end select 

其中array_name是一个字符变量,array_dogarray_cat是模块中声明的数组(需要target属性),array_ptr是另一个数组使用pointer属性。