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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Memory Fortran 90:信号SIGSEGV:分段故障-内存引用无效_Memory_Fortran_Gfortran_Dynamic Arrays - Fatal编程技术网

Memory Fortran 90:信号SIGSEGV:分段故障-内存引用无效

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

我在下面编写的代码使用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  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谢谢你的建议,我已经按照你的建议对代码进行了注释。