“分段错误-无效的内存引用”可能与数字类型问题有关。如何更改我的电话号码类型?

问题描述 投票:0回答:1

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

我正在使用的部分代码在此问题的底部。我很确定,但不确定,倒数第二行(也是本文的倒数第二行)是问题所在。

首先,我这样做:

gfortran -g cpt_ir_.f90 -o cpt_ir_.o
./cpt_ir_.o < di.in

导致此错误:

Backtrace for this error:
#0  0x2B794A134467
#1  0x2B794A134AAE
#2  0x2B794ABC724F
#3  0x2B794A1FB8AB
#4  0x2B794A1F7613
#5  0x2B794A1F934E
#6  0x2B794A1FDF86
#7  0x40128A in MAIN__ at cpt_ir_.f90:29
Segmentation fault

我搜索了堆栈溢出,并看到了建议执行以下操作以获取更多信息:

gfortran -g -fcheck=all -Wall cpt_ir_.f90

输出直接显示在下面。 Fmax ...行是我在本文结尾处粘贴的代码的最后一行(代码中还有其他类似的行)。但是,我看到它显示为警告,而不是错误。因此,尽管我在这里进行的处理似乎是the错误,但也许还有另一个问题,上面的命令没有显示。

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)

我在堆栈溢出处遇到了使用以下标志的建议:

-fdefault-integer-8 -fno-range-check

我做了如下操作:

gfortran -g -fdefault-integer-8 -fno-range-check cpt_ir_.f90 -o cpt_ir_.o

我不确定我是否做得正确。我也一一尝试。无论如何,没有变化,我得到了同样的错误。我还尝试手动更改问题行中的数字,如本文最后一行所示。这也无济于事-我收到一个错误,即最大整数对于int而言太大。

[如果有人可以指出正确的方向,我将非常感激。如果对此问题有更多合适的标签,也请随时更改我的标签。

cpt_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))
fortran gfortran fortran90
1个回答
0
投票

您的电话一目了然

READ(line(45:),*) dip(:,N)

是第一个问题。注释掉N=N+1行,使N =0。Fortran索引为'1',表示除非另有说明,否则Fortran数组从1开始。因此,dip的第二维从1开始,您正在尝试设置不存在的'zeroth'元素。

© www.soinside.com 2019 - 2024. All rights reserved.