2014-04-17 15 views
5

Złożyłem fortran 90 programów z gfortran, który buduje skalowalną tablicę 3D w taki sposób, jaki chcę. Po uruchomieniu pojawia się następujący błąd:Fortran 90 - "Błąd segmentacji - nieprawidłowe odwołanie do pamięci" ze skalowalną tablicą 3D

Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 

Backtrace for this error: 
#0 0x10542ee42 
#1 0x10542f60e 
#2 0x7fff8d7895a9 
#3 0x10542575e 
#4 0x105425975 
#5 0x105425d0e 
Segmentation fault: 11 

wierzę, że jest to kwestia pamięci o dużej tablicy 3D, jak to działa, jeśli zmniejszyć wymiary, ale jest tam mimo to obejść? Oto mój kod:

PROGRAM phantomtest 
IMPLICIT NONE 
    INTEGER, PARAMETER:: columns=34, rows=34, diags=((4*columns)-6), m=(4*columns)-6+(2*columns) 
    REAL, ALLOCATABLE, DIMENSION(:,:,:)::phantom 
    INTEGER :: i, j, k 
    CHARACTER (LEN=3) :: nstring, nullstring='' 

ALLOCATE(phantom(columns,rows,m)) 
phantom=0 

CALL Phantom_Making(phantom,columns,rows,diags,m) 

WRITE(nstring,FMT="(I3)"), columns 
PRINT*, nullstring 
DO k=1,m 
    DO i=1,columns 
    WRITE(*,FMT="("//nstring//"I2)") phantom(i,:,k) 
    END DO 
    PRINT *, nullstring 
END DO 

END PROGRAM phantomtest 
!--------------------------- 
SUBROUTINE Phantom_Making(phantom,columns,rows,diags,m) 
IMPLICIT NONE 
    INTEGER, INTENT(IN):: columns, rows, diags, m 
    REAL, DIMENSION(columns,rows,m), INTENT(INOUT) :: phantom 
    INTEGER :: i, j, k, l 

!Vertical and horizontal rays 
DO i=1,rows 
    phantom(:,i,i) = 1 
    phantom(i,:,i+(columns)+(diags/2)) = 1 
END DO 

!Diagonal rays 
phantom(1,2,1+columns) = 1 
phantom(2,1,1+columns) = 1 
phantom(1,columns-1,1+columns+(diags/2)+rows) = 1 
phantom(2,columns,1+columns+(diags/2)+rows) = 1 
j = columns-1 

DO k=2+columns, (diags/2)+columns 
    phantom(2:columns,:,k) = phantom(1:(columns-1),:,k-1) 
    IF (((k+1)-columns).LE.columns) phantom(1,k+1-columns,k)=1 
END DO 

DO l=columns+(diags/2)+rows+2, columns+(diags/2)+rows+1+(diags/2) 
    j = j-1 
    phantom(2:columns,:,l) = phantom(1:(columns-1),:,l-1) 
    IF (j.GT.0) phantom(1,j,l) = 1 
END DO 

END SUBROUTINE 
+0

jeśli używasz opcji '-g' kompilator, ślad śledzenia jest bardziej znaczący. –

Odpowiedz

5

Kontrole, które ma wiele kompilatorów, mogą pomóc w debugowaniu. Na przykład z gfortran:

gfortran -g -fcheck=all -Wall segf.f90 
segf.f90:5.17: 

    INTEGER :: i, j, k 
       1 
Warning: Unused variable 'j' declared at (1) 
~/f/testy/stackoverflow> ./a.out 
At line 50 of file segf.f90 
Fortran runtime error: Index '199' of dimension 3 of array 'phantom' outside of expected range (1:198) 

Inne kompilatory mają podobne opcje.

Twoje pętle działają na takich wartościach, jak l, że uzyskujesz dostęp do tablicy phantom poza zakresem.

Upewnij się, że l ma prawidłowe wartości, 1:m, lub że wymiary fantomu macierzy są określone poprawnie dla tego zakresu (1:m).

Powiązane problemy