Fortran 90 - “Segmentation fault - référence mémoire invalide” avec évolutive tableau 3D
J'ai compilé un programme fortran 90 avec gfortran qui construit une évolutif tableau 3D d'une manière que je veux. Lors de l'exécution, j'obtiens l'erreur suivante:
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
Je crois que c'est un problème de mémoire avec le grand tableau 3D, qu'il fonctionne si je baisse les dimensions, mais est-il de toute façon de contourner ce problème? Voici mon code:
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
si vous utilisez le
-g
option du compilateur, la trace est plus significatif.OriginalL'auteur Lorde555 | 2014-04-17
Vous devez vous connecter pour publier un commentaire.
Les vérifications que de nombreux compilateurs ont peut faciliter le débogage. Par exemple avec gfortran:
D'autres compilateurs ont des options similaires.
Vos boucles fonctionne sur de telles valeurs de
l
que vous avez accès au tableauphantom
en dehors des limites.Assurez-vous que
l
a les valeurs correctes,1:m
, ou que les dimensions de la matrice fantôme sont correctement spécifiés à cette plage (1:m
).OriginalL'auteur Vladimir F