Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran &引用;分段故障-无效内存引用“;可能与数字类型问题有关。如何更改号码类型?_Fortran_Gfortran_Fortran90 - Fatal编程技术网

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

我正在尝试使用旧的Fortran代码来处理数据。我对Fortran几乎没有经验,也无法解决我认为与数字类型有关的问题

我正在使用的部分代码位于这个问题的底部。我很确定,但不确定,最后一行(也是这篇文章的最后一行)是问题所在

首先,我这样做:

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)