2015-10-16 39 views
0

在Fortran 95中,如何编写一个函数,该函数将已知维的任意矩阵作为参数?我得到这样的印象:即使该函数仅在之前分配的矩阵上运行,不分配维度也不起作用。在Fortran中对任意数组大小进行操作的函数

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

我不明白你的问题(除了使用'test(mymatrix)'作为裸体表达)。这里的方法有什么问题:你是否收到编译器的任何投诉。 [你也没有任何可分配的数组。] – francescalus

回答

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

+0

其实,在内部过程的问题中的原始形式也应该工作。 –

+0

函数'test'是问题中提供的任何片段的内部函数。如果我们忽略不良通话,那么显式接口已经可用。 – francescalus

+0

@VladimirF因为它(我错过了我的早晨咖啡......)。我修改了使用内部过程的答案,只是提到它也适用于模块。 – casey