1
我的主代碼存在一些問題,所以我試圖找出問題所在。 因此,我有這樣的小碼:Fortran奇怪的分段錯誤
MODULE Param
IMPLICIT NONE
integer, parameter :: dr = SELECTED_REAL_KIND(15, 307)
integer :: D =3
integer :: Q=10
integer :: mmo=16
integer :: n=2
integer :: x=80
integer :: y=70
integer :: z=20
integer :: tMax=8
END MODULE Param
module m
contains
subroutine compute(f, r)
USE Param, ONLY: dr, mmo, x, y, z, n
IMPLICIT NONE
real (kind=dr), intent(in) :: f(x,y,z, 0:mmo, n)
real (kind=dr), intent(out) :: r(x, y, z, n)
real (kind=dr) :: fGlob(x,y,z, 0:mmo)
!-------------------------------------------------------------------------
print*, 'We are in compute subroutine'
r= 00.0
fGlob=sum(f,dim=5)
r=sum(f, dim=4)
print*, 'fGlob=', fGlob(1,1,1, 1)
print*, 'f=', f(1,1,1, 0,1)
print*, 'r=', r(1,1,1, 1)
end subroutine compute
end module m
PROGRAM test_prog
USE Param
USE m
Implicit None
integer :: tStep
real (kind=dr), dimension(:,:,:, :,:), allocatable :: f
real (kind=dr), dimension(:,:,:,:), allocatable :: r
!----------------------------------------------------------------------------
! Initialise the parameters.
print*, 'beginning of the test'
! Allocate
allocate(f(x,y,z, 0:mmo,n))
allocate(r(x,y,z, n))
f=1.0_dr
! ---------------------------------------------------------
! Iteration over time
! ---------------------------------------------------------
do tStep = 1, tMax
print *, tStep
call compute(f,r)
f=f+1
print *, 'tStep', tStep
enddo
print*, 'f=', f(1,1,1, 0,1)
print*, 'r=', r(1,1,1, 1)
! Deallacation
deallocate(f)
deallocate(r)
print*, 'End of the test program'
END PROGRAM test_prog
現在,我無法理解爲什麼當我ifort
編譯,我有一個segmentation fault
,當我與gfortran
編譯工作。而最糟糕的是,當我編譯ifort
和gfortran
以及它們的fast
選項時,我再次遇到segmentation fault (core dumped)
錯誤。而更令人困惑的是,當我也試着用兩種編譯器編譯traceback
選項時,一切正常。
我知道segmentation fault (core dumped)
錯誤通常意味着我嘗試讀取或寫入錯誤的位置(矩陣索引等);但是在這個小代碼中,我沒有看到像這樣的錯誤。
有沒有人可以幫助我理解爲什麼會出現這些錯誤?
閱讀此內容 - https://software.intel.com/zh-CN/articles/determining-root-cause-of-sigsegv-or-sigbus-errors - 並在檢查完所有問題後回報它引發了。 –
有一個小的mcve很好。儘管如此,請嘗試編譯器提供的調試選項:-g -fcheck = all -Wall''-g -traceback -check -warn'。 –
我會繼續調查您的鏈接中的內容。但我認爲這個問題是堆棧溢出問題。我會向你證實這一點。無論如何,感謝這個有用的鏈接,我沒有發現當我谷歌搜索。 –