在我的简单程序中尝试将一些数据读入数组时,我一直在疯狂。我无法弄清楚为什么我会遇到分段错误。我的代码开始了:
program guess_input
implicit none
CHARACTER*2, allocatable, dimension(:) :: element
double precision, allocatable, dimension(:,:) :: xyzq
INTEGER, allocatable, dimension(:) :: label,cs_num, br_num, xx_num
real, allocatable, dimension(:) :: distance
real, allocatable, dimension(:) :: ep
INTEGER :: stat, numatom, i, j
CHARACTER*80 :: line
numatom = 61502
allocate(element(numatom))
allocate(xyzq(4,numatom))
allocate(label(numatom))
OPEN(UNIT=22,FILE='EMBQ_EPF.OUT',iostat=stat)
If(stat.ne.0) Stop "File not found"
!Read in the input into two arrays
do i=1,numatom
READ(22,'(A)') line
READ(line, *) xyzq(1,i), xyzq(2,i), xyzq(3,i), xyzq(4,i), label(i)
enddo
CLOSE(22)
!Define element type in parallel array based on the charge
do i=1,numatom
if(xyzq(4,i) == 1.00) then
element(i) = 'Cs'
elseif(xyzq(4,i) == -1.00) then
element(i) = 'Br'
else
element(i) = 'XX'
endif
enddo
OPEN(33, FILE='element.out')
do i=1,numatom
write(33,*) element(i)
enddo
end program guess_input
我试过隔离故障,但我真的无法弄清楚出了什么问题。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
我建议使用运行时下标检查进行编译,如果你还没有这样做的话。分段错误的一个可能原因是下标错误。在调试期间使用最大编译器诊断会很有帮助。使用gfortran:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace
。使用ifort:-O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
。 -fcheck=all
和-check all
包含运行时下标检查;如果需要,可以选择运行时下标检查 - 请参阅编译器文档。
另外:与浮点值的精确比较是有风险的。我建议将xyzq转换为整数变量或测试范围:
if( abs (xyzq(4,i) - 1.00) < 0.01 ) then
答案 1 :(得分:1)
要查找分段错误的原因,您可以使用Valgrind的 memcheck 工具。语法非常简单:
valgrind --tool=memcheck --leak-check=full <binary> <arguments>
此工具应该为您提供memory-management problems出现的源代码中的确切行。
答案 2 :(得分:0)
你的编译器是否足够聪明,知道你的意思是“numatom”和“i”是4字节整数?如果没有,并假设你的意思是“INTEGER”为2字节长,那么你将深入研究负面记忆空间的神秘世界。