Fortran &引用;分段故障-无效内存引用“;可能与数字类型问题有关。如何更改号码类型?
我正在尝试使用旧的Fortran代码来处理数据。我对Fortran几乎没有经验,也无法解决我认为与数字类型有关的问题 我正在使用的部分代码位于这个问题的底部。我很确定,但不确定,最后一行(也是这篇文章的最后一行)是问题所在 首先,我这样做:Fortran &引用;分段故障-无效内存引用“;可能与数字类型问题有关。如何更改号码类型?,fortran,gfortran,fortran90,Fortran,Gfortran,Fortran90,我正在尝试使用旧的Fortran代码来处理数据。我对Fortran几乎没有经验,也无法解决我认为与数字类型有关的问题 我正在使用的部分代码位于这个问题的底部。我很确定,但不确定,最后一行(也是这篇文章的最后一行)是问题所在 首先,我这样做: gfortran -g cpt_ir_.f90 -o cpt_ir_.o ./cpt_ir_.o < di.in 我搜索了Stack Overflow,发现了一个建议,建议执行以下操作以获取更多信息: gfortran -g -fcheck=all
gfortran -g cpt_ir_.f90 -o cpt_ir_.o
./cpt_ir_.o < di.in
我搜索了Stack Overflow,发现了一个建议,建议执行以下操作以获取更多信息:
gfortran -g -fcheck=all -Wall cpt_ir_.f90
下面直接显示了输出。Fmax。。。行是我粘贴在本文末尾的代码的最后一行(代码中还有其他类似的行)。但是,我看到它显示为警告,而不是错误。因此,尽管我在这里继续,好像这是一个错误,也许还有另一个问题,上面的命令没有揭示出来
cpt_ir_.f90:66.5:
Fmax=N*((4000.0/(2.0*Pi))*(2.0*Pi*timestep*1.0-15.0*29979245800.0))
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)
我在Stack Overflow遇到一个建议,建议使用以下标志:
-fdefault-integer-8 -fno-range-check
我的做法如下:
gfortran -g -fdefault-integer-8 -fno-range-check cpt_ir_.f90 -o cpt_ir_.o
我不确定我是否做对了。我也一个接一个地试了。不管怎样,没有变化,我也犯了同样的错误。我还尝试手动更改问题行中的数字,如本文最后一行所示。这也没用——我得到一个错误,最大的数字对于int来说太大了
如果有人能为我指出正确的方向,我将不胜感激。如果这个问题有更合适的标签,请随意更改我的标签
cpt\U ir.f90:
!
!
IMPLICIT NONE
INTEGER, PARAMETER :: dp=KIND(0.0D0)
REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: correlation
REAL(KIND=dp) :: integral,omega,Pi,timestep
REAL(KIND=dp), DIMENSION(3,1000000) :: dipder,dip
REAL(KIND=dp), DIMENSION(3) :: m_vec
INTEGER :: N,I,J,Nmax,Fmax
CHARACTER(LEN=100) :: line,filename
Pi=4.0D0*ATAN(1.0D0)
READ(5,*) filename
READ(5,*) timestep
OPEN(10,FILE=filename)
N=0
DO
READ(10,'(A100)',END=999) line
IF (INDEX(line,' XXX').NE.0) THEN
N=N+1
READ(line(45:),*) dip(:,N)
ENDIF
IF (INDEX(line,' XXX').NE.0) THEN
N=N+1
READ(line(45:),*) dipder(:,N)
ENDIF
ENDDO
999 CONTINUE
CLOSE(10)
Nmax=N/10
print *, Nmax
ALLOCATE(correlation(0:Nmax))
correlation=0.0_dp
DO I=1,N-Nmax
DO J=I,I+Nmax
correlation(J-I)=correlation(J-I)+DOT_PRODUCT(dipder(:,I),dipder(:,J))
ENDDO
ENDDO
DO I=0,Nmax
correlation(I)=correlation(I)/(REAL(N-I,kind=dp)*REAL(N,kind=dp))
ENDDO
OPEN(UNIT=10,FILE="dip_dip_correlation.time")
write(10,*) "XXX"
DO I=-Nmax,Nmax
write(10,*) I*timestep,correlation(ABS(I))/correlation(0)
ENDDO
CLOSE(10)
OPEN(UNIT=10,FILE="XXX")
write(10,*) "XXX"
!Fmax up to 4000 cm^-1
Fmax=N*((4000D0/(2*Pi))*(2.0D0*Pi*timestep*1.0D-15*29979245800.0))
! My try: Fmax=N*((4000.0/(2.0*Pi))*(2.0*Pi*timestep*1.0-15.0*29979245800.0))
根据Dan的回答更新: Dan善意地指出,我需要取消注释“N=N+1”。不幸的是,在修复之后,我仍然看到分段错误。刚才我跑的时候,
gfortran -g -fcheck=all -Wall cpt_ir_.f90
在我尝试代码的最后一行时(我尝试将所有内容转换为浮点):
Fmax=N*((4000.0/(2.0*Pi))*(2.0*Pi*时间步长*1.0-15.0*29979245800.0))
我得到:
Fmax=N*((4000.0/(2.0*Pi))*(2.0*Pi*timestep*1.0-15.0*29979245800.0))
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)
乍一看,你的台词
READ(line(45:),*) dip(:,N)
这是第一个问题。注释掉
N=N+1
行,使N=0。Fortran是“1”索引的,这意味着Fortran数组从1开始,除非另有规定。因此,倾角的第二个维度从1开始,您试图设置不存在的“第零个”元素。非常感谢您捕捉到这一点,丹!不幸的是,我仍然遇到分段错误,“gfortran-g-fcheck=all-Wall cpt_ir_904;.f90”命令仍然在告诉我:警告:在(1)处从实数(8)到整数(4)的转换中,值可能发生变化。不过,我会根据你的建议更新问题。我们可以浏览、猜测并给出建议。但是,为了真正帮助您解决这个问题,您能给我们一个有问题的示例数据集吗。完成是指从“程序”到“结束程序”的所有过程。Fmax是一个整数。如果这是你想做的,你可以忽略警告。您可以使用int()
显式执行vconversion。如果这不是您想要做的,请将Fmax
设为实变量。使用这些检查选项编译后是否再次运行程序?您指向的警告是编译时警告,而分段错误是运行时错误。“这两个人不必有什么关系。”弗朗西斯卡勒斯,谢谢你。我很尴尬——我已经有一段时间没有编译任何东西了,而且忘记了那个步骤!然而,我确实重新编译(没有问题)并重新运行,但不幸的是,我仍然遇到了分段错误。我就是不知道它是从哪里来的。
READ(line(45:),*) dip(:,N)