2014-09-13 68 views
0

我在一個相當簡單的代碼中有一個簡單的問題,但是我真的沒有在幾個小時後發現錯誤。這裏的代碼,發生問題的最小化版本:Fortran 95:數組函數返回。越界

SUBROUTINE Partial_KlassRKV(x,y,f,f_xMarge,f_yMarge) 
    USE DGL_Functions 
    IMPLICIT NONE 

    REAL :: x(:),y(:),f(:,:,:),f_xMarge(:,:),f_yMarge(:,:) 
    INTEGER :: i,j,k 
    REAL :: partial_fx(6,6) 

    DO k=1,size(f,3) 

     partial_fx=PartialCalc(x,y,f(:,:,k),f_xMarge,f_yMarge) 
     WRITE(*,*) 'Nach PartialCalc x' 
     STOP 

    END DO 

... 

MODULE DGL_Functions 
CONTAINS 

FUNCTION PartialCalc(x,y,f,f_xMarge,f_yMarge) 
    IMPLICIT NONE 
    REAL :: x(:),y(:),f(:,:),f_xMarge(:,:),f_yMarge(:,:) 
    REAL :: PartialCalc(6,6) 
    INTEGER :: i,j 


    DO i=1,size(PartialCalc,1) 
     DO j=1,size(PartialCalc,2) 
      PartialCalc(i,j)=i+j 
     END DO 
    END DO 

    WRITE(*,*) 'PartialCalc ',PartialCalc 


END FUNCTION PartialCalc 

它返回上次寫入聲明FUNCION PartialCalc但不是在寫操作之後

partial_fx=PartialCalc(x,y,f(:,:,k),f_xMarge,f_yMarge) 
在子程序

。在那一行有「數組下標越界」。我不明白這一點。這兩個數組(partial_fx和PartialCalc)都使用dim(6,6)聲明,併爲每個PartialCalc(i,j)分配一個值...?

電賀intasys

PS:我是用柏拉圖的f95與切克馬特32

回答

1

也許嘗試不同的編譯器。 gfortran和ifort通常會識別數組,甚至是問題的索引值。下面是我很快寫了一個例子:

module mysubs 

contains 

subroutine subxy (x,y) 
    real, dimension (5) :: x, y 
    x = 4.0 
    y = 5.0 
end subroutine subxy 

end module mysubs 

program test_bounds 
    use mysubs 
    real :: x(4), y(5) 

    call subxy (x, y) 

    write (*, *) x, y 

end program test_bounds 

gfortran,用正確的編譯器選項,認爲這在編譯時,有用的特異性:

call subxy (x, y) 
       1 
Warning: Actual argument contains too few elements for dummy argument 'x' (4/5) at (1) 
+0

謝謝。更改調試器以贏得32調試解決了問題。以防萬一任何人有類似的問題。 – intasys 2014-09-22 16:18:34