Memory Fortran 90:信号SIGSEGV:分段故障-内存引用无效
我在下面编写的代码使用GFORTRAN编译得很好,但是当我运行可执行文件时,终端窗口返回Memory Fortran 90:信号SIGSEGV:分段故障-内存引用无效,memory,fortran,gfortran,dynamic-arrays,Memory,Fortran,Gfortran,Dynamic Arrays,我在下面编写的代码使用GFORTRAN编译得很好,但是当我运行可执行文件时,终端窗口返回 Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error: #0 0x7FC1D0F93697 #1 0x7FC1D0F93CDE #2 0x7FC1D048E3EF #3 0x7FC1D05AF392 #4 0x7FC1D1058360 #5
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x7FC1D0F93697
#1 0x7FC1D0F93CDE
#2 0x7FC1D048E3EF
#3 0x7FC1D05AF392
#4 0x7FC1D1058360
#5 0x400CBA in MAIN__ at TRANS2DATUM.f90:?
Segmentation fault (core dumped)
代码如下
PROGRAM TRANSLATE
IMPLICIT NONE
REAL, ALLOCATABLE :: X(:), Y(:), Z(:)
INTEGER, ALLOCATABLE :: NID(:)
REAL MINVALUE
INTEGER i, NUMA
OPEN(1,FILE='NODE_original.dat',STATUS='OLD')
OPEN(2,FILE='NODE_trans.dat',STATUS='NEW')
10 READ(1,*,END=100)NID(i), X(i), Y(i), Z(i)
i=i+1
GOTO 10
100 CONTINUE
NUMA=i
ALLOCATE (NID(NUMA),X(NUMA),Y(NUMA),Z(NUMA))
! Find the z value that should be zero
MINVALUE=Z(1)
DO i = 1, NUMA
If ( i .EQ. 1) GOTO 11
If (Z(i) .LE. Z(i-1)) THEN
MINVALUE=Z(i)
Else
END IF
11 CONTINUE
END DO
WRITE(*,*) "MINIMUM Z DIMENSION IS: ",MINVALUE
IF (MINVALUE .EQ. 0) GOTO 12
WRITE(2,*)"*NODES, NSET=NBRICK"
DO i = 1, NUMA
Z(i) = Z(i) - MINVALUE
WRITE(2, 1002) NID(i), X(i), Y(i), Z(i)
END DO
1002 FORMAT(I10,3(",",F12.5))
12 WRITE(*,*) "ERROR: MINIUMUM VALUE ALREADY ZERO NO TRANSLATION REQUIRED"
STOP
END PROGRAM
当我按照以下注释之一中的建议使用此命令时:
gfortran -o -g -Wall -fcheck=all T2DATUM TRANS2DATUM.f90
我得到以下信息
T2DATUM: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o:(.fini+0x0): first defined here
T2DATUM: In function `data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o:(.data+0x0): first defined here
T2DATUM:(.rodata+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o:(.rodata+0x0): first defined here
T2DATUM:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o:(.rodata.cst4+0x0): first defined here
T2DATUM: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o:(.text+0x0): first defined here
T2DATUM: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o:(.init+0x0): first defined here
/tmp/ccbWNZCJ.o: In function `main':
TRANS2DATUM.f90:(.text+0x1205): multiple definition of `main'
T2DATUM:(.text+0xc43): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
T2DATUM:(.data+0x8): first defined here
/usr/bin/ld: error in T2DATUM(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status
但我不知道这意味着什么
是什么导致了这个问题
我认为这与可分配阵列有关?我希望使用动态数组,因为我不必每次需要更改数组的大小时都重新编译。这是最好的方法吗
谢谢你的帮助 这是一个工作版本,稍作修改: NODE_original.dat
1 2. 3. 4.
5 6. 7. 8.
9 10. 11. 12.
13 14. 15. 16.
17 18. 19. 20.
test.f90
PROGRAM TRANSLATE
IMPLICIT NONE
REAL, ALLOCATABLE :: X(:), Y(:), Z(:)
INTEGER, ALLOCATABLE :: NID(:)
REAL MINVALUE
INTEGER i, NUMA
! Declare vars used for temporarily receiving
! the values read from the file
REAL X_, Y_, Z_
INTEGER :: NID_
OPEN(1,FILE='NODE_original.dat',STATUS='OLD')
OPEN(2,FILE='NODE_trans.dat',STATUS='NEW')
! i was not defined to start as zero as it should
i=0
10 READ(1,*,END=100)NID_, X_, Y_, Z_
i=i+1
GOTO 10
100 CONTINUE
NUMA=i
! Values were previously read but not stored.
! NUMA is used to allocate the arrays with the
! proper dimensions.
ALLOCATE (NID(NUMA),X(NUMA),Y(NUMA),Z(NUMA))
! Cursor of file 1 is rewind to the beginning of
! the file
REWIND(1)
! Read is executed for all lines with i being
! incremented by 1 every reading up to i=NUMA.
! Values are stored in the arrays at index i
! and can now be used as intended.
READ(1,*)(NID(i), X(i), Y(i), Z(i), i=1,NUMA)
! Find the z value that should be zero
MINVALUE=Z(1)
DO i = 1, NUMA
If ( i .EQ. 1) GOTO 11
If (Z(i) .LE. Z(i-1)) THEN
MINVALUE=Z(i)
Else
END IF
11 CONTINUE
END DO
WRITE(*,*) "MINIMUM Z DIMENSION IS: ",MINVALUE
IF (MINVALUE .EQ. 0) GOTO 12
WRITE(2,*)"*NODES, NSET=NBRICK"
DO i = 1, NUMA
Z(i) = Z(i) - MINVALUE
WRITE(2, 1002) NID(i), X(i), Y(i), Z(i)
END DO
1002 FORMAT(I10,3(",",F12.5))
12 WRITE(*,*) "ERROR: MINIUMUM VALUE ALREADY ZERO NO TRANSLATION REQUIRED"
STOP
END PROGRAM
输出:
:~$ gfortran --version
GNU Fortran (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
:~$ gfortran stack.f90
:~$ ./a.out
MINIMUM Z DIMENSION IS: 4.00000000
ERROR: MINIUMUM VALUE ALREADY ZERO NO TRANSLATION REQUIRED
这是一个小修改的工作版本: NODE_original.dat
1 2. 3. 4.
5 6. 7. 8.
9 10. 11. 12.
13 14. 15. 16.
17 18. 19. 20.
test.f90
PROGRAM TRANSLATE
IMPLICIT NONE
REAL, ALLOCATABLE :: X(:), Y(:), Z(:)
INTEGER, ALLOCATABLE :: NID(:)
REAL MINVALUE
INTEGER i, NUMA
! Declare vars used for temporarily receiving
! the values read from the file
REAL X_, Y_, Z_
INTEGER :: NID_
OPEN(1,FILE='NODE_original.dat',STATUS='OLD')
OPEN(2,FILE='NODE_trans.dat',STATUS='NEW')
! i was not defined to start as zero as it should
i=0
10 READ(1,*,END=100)NID_, X_, Y_, Z_
i=i+1
GOTO 10
100 CONTINUE
NUMA=i
! Values were previously read but not stored.
! NUMA is used to allocate the arrays with the
! proper dimensions.
ALLOCATE (NID(NUMA),X(NUMA),Y(NUMA),Z(NUMA))
! Cursor of file 1 is rewind to the beginning of
! the file
REWIND(1)
! Read is executed for all lines with i being
! incremented by 1 every reading up to i=NUMA.
! Values are stored in the arrays at index i
! and can now be used as intended.
READ(1,*)(NID(i), X(i), Y(i), Z(i), i=1,NUMA)
! Find the z value that should be zero
MINVALUE=Z(1)
DO i = 1, NUMA
If ( i .EQ. 1) GOTO 11
If (Z(i) .LE. Z(i-1)) THEN
MINVALUE=Z(i)
Else
END IF
11 CONTINUE
END DO
WRITE(*,*) "MINIMUM Z DIMENSION IS: ",MINVALUE
IF (MINVALUE .EQ. 0) GOTO 12
WRITE(2,*)"*NODES, NSET=NBRICK"
DO i = 1, NUMA
Z(i) = Z(i) - MINVALUE
WRITE(2, 1002) NID(i), X(i), Y(i), Z(i)
END DO
1002 FORMAT(I10,3(",",F12.5))
12 WRITE(*,*) "ERROR: MINIUMUM VALUE ALREADY ZERO NO TRANSLATION REQUIRED"
STOP
END PROGRAM
输出:
:~$ gfortran --version
GNU Fortran (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
:~$ gfortran stack.f90
:~$ ./a.out
MINIMUM Z DIMENSION IS: 4.00000000
ERROR: MINIUMUM VALUE ALREADY ZERO NO TRANSLATION REQUIRED
请使用错误检查进行编译
gfortran-g-Wall-fcheck=all
,再次运行并报告。当您遇到问题时,请始终这样做。谢谢,我已按要求这样做了。请参阅原始帖子代替您需要的-o-g-Wall-fcheck=all T2DATUM
。您当前的错误消息与您的问题无关。@ PeTrh,我们有几个关于如何做到这一点的QS/AS。@ Purh,您应该考虑是否值得再次编写类似的东西,或者链接到几个版本的现有问题。通常正确的做法是投票结束一个问题,而不是回答另一个问题。最糟糕的是,当你自己已经在其他地方写了同样的东西时,你也会回答同样的问题。我不是说这个问题是重复的/应该结束(我还没有进行这样的表决)。其他的可能与操作无法理解的崩溃无关。请使用错误检查进行编译gfortran-g-Wall-fcheck=all
,再次运行并报告。当您遇到问题时,请始终这样做。谢谢,我已按要求这样做了。请参阅原始帖子代替您需要的-o-g-Wall-fcheck=all T2DATUM
。您当前的错误消息与您的问题无关。@ PeTrh,我们有几个关于如何做到这一点的QS/AS。@ Purh,您应该考虑是否值得再次编写类似的东西,或者链接到几个版本的现有问题。通常正确的做法是投票结束一个问题,而不是回答另一个问题。最糟糕的是,当你自己已经在其他地方写了同样的东西时,你也会回答同样的问题。我不是说这个问题是重复的/应该结束(我还没有进行这样的表决)。其他的可能与操作人员不理解的崩溃无关。对这些修改说点什么总是好的。对于需要询问问题的人来说,识别这些代码可能并不容易。@VladimirF谢谢你的建议,我已经按照你的建议对代码进行了注释。对这些修改说点什么总是好的。对于需要询问问题的人来说,识别这些代码可能并不容易。@VladimirF谢谢你的建议,我已经按照你的建议对代码进行了注释。