Fortran 90: сигнал SIGSEGV: ошибка сегментации - недопустимая ссылка на память - PullRequest
0 голосов
/ 24 января 2020

Код, который я написал ниже, прекрасно компилируется с использованием 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

Но я понятия не имею, что это означает

Что вызывает эту проблему?

Я думаю, что это связано с размещаемыми массивами? Я надеялся использовать динамические c массивы, потому что мне не нужно перекомпилировать каждый раз, когда мне нужно изменить размер массивов. Это лучший способ сделать это?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 24 января 2020

Это рабочая версия с небольшими изменениями:

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
...