在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)
答案 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中)必须返回值,并且必须将值赋给变量。在我的示例中查看我如何调用该函数的差异。如果您不想返回值,请使用子例程而不是函数。