2015-10-16 71 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