在Fortran中以任意数组大小运行的函数

时间:2015-10-16 14:44:22

标签: fortran

在Fortran 95中,您如何编写一个以已知维度的任意矩阵作为参数的函数?我得到的印象是,即使该函数仅对先前已分配的矩阵进行操作,分配维度也不起作用。

 real, dimension (2, 4) :: mymatrix
 test(mymatrix)
contains
 function test(matrix)
  real, dimension (: , :), intent(in) :: matrix
  someothervariable = matrix(i, j)
  return
 end function test(matrix)

1 个答案:

答案 0 :(得分:1)

只要您有明确的界面,这就有效。将函数作为内部过程放置,就像将过程放入模块一样。考虑这个例子:

program example
  implicit none

  real, dimension(2,4) :: matrixA
  real, dimension(5,13) :: matrixB
  integer :: matval

  matval = test(matrixA)
  print *, 'Test returned: ',matval
  matval = test(matrixB)
  print *, 'Test returned: ',matval

contains

function test(matrix)
  implicit none
  real, dimension(:,:), intent(in) :: matrix
  integer :: test

  print *, "matrix dimensions:"
  print *, "i: ", lbound(matrix,1), ubound(matrix,1)
  print *, "j: ", lbound(matrix,2), ubound(matrix,2)
  test = ubound(matrix,1)*ubound(matrix,2)
end function test

end program example

该程序的输出是:

 matrix dimensions:
 i:            1           2
 j:            1           4
 Test returned:            8
 matrix dimensions:
 i:            1           5
 j:            1          13
 Test returned:           65

您可以看到没有数组是可分配的,并且可以将任意大小的数组传递给该函数。该函数能够检查数组维度的边界,并可以对数组的内容进行操作。我让函数返回一个基于数组维度的值作为示例。

您的代码片段存在的问题是您正在调用该函数并且未返回值。函数(在Fortran中)必须返回值,并且必须将值赋给变量。在我的示例中查看我如何调用该函数的差异。如果您不想返回值,请使用子例程而不是函数。