2014-09-13 198 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