Я компилирую так:
f77 -c readheader.F
f77 -c readheader2.F
make (for the main program, which is necessary to have a makefile for)
и запускаю:
./decpar
Вывод:
Which datafile?
Point 2a
Program received signal SIGSEGV: Segmentation fault - invalid memory
reference.
Backtrace for this error:
#0 0x7FF5E4A62E08
#1 0x7FF5E4A61F90
#2 0x7FF5E41934AF
#3 0x7FF5E4B25C40
#4 0x7FF5E4B26197
#5 0x7FF5E4B34B87
#6 0x4056B8 in __mysubs2_MOD_readheader2
#7 0x401CA5 in MAIN__ at decpar.F:29 (discriminator 88)
Segmentation fault (core dumped)
Я не собираюсь публиковать весь кодпотому что это огромный и ненужный.К счастью, ошибка появляется в первых нескольких строках.У меня есть два модуля, в обоих из которых пользователю необходимо ввести имя файла данных, чтобы информация извлекалась и направлялась в основную программу.Я попытался очистить (5) файл данных на случай, если по какой-то странной причине он не будет перезаписан вторым пользовательским вводом, и я получаю «Ошибка сегментации - недопустимая ссылка на память».Я попытался изменить имя файла данных на datafile2, чтобы создать новое пространство для второго ввода, но у меня возникла та же проблема, что и при том же имени.Все, что я пробовал, останавливается в «пункте 2а».Также, если я переключаю порядок вызова модулей, проблема сохраняется во втором файле.После дополнительных попыток gfortran -c -g -fbacktrace -fcheck = all я получил следующую ошибку: Ошибка времени выполнения Fortran: индекс «1» измерения 1 массива «thetax» выше верхней границы 0.
PS: Некоторые команды, которые не имеют правильного отступа, просто пишутся как таковые для форматирования здесь.
module MySubs
contains
subroutine readheader(theta,thetax,thetay,thetaz)
include 'psize.inc'
include 'pinfo.inc'
#include "rvarrays.inc"
include 'itype.inc'
include 'iodefs.inc'
REAL,ALLOCATABLE, intent(inout), DIMENSION (:) :: thetay, thetaz
REAL,ALLOCATABLE, intent(inout), DIMENSION (:) :: theta, thetax
ALLOCATE (theta(nobj),thetax(nobj),thetay(nobj),thetaz(nobj))
1 print*,'Which datafile?'
read(*,'(a)') datafile
CALL readdata
do i=1,nobj
if (i.LT.nobj) then
thetax(i)=(v(1,i+1)-v(1,i))*(r(1,i+1)-r(1,i))**(-1)
thetay(i)=(v(2,i+1)-v(2,i))*(r(2,i+1)-r(2,i))**(-1)
thetaz(i)=(v(3,i+1)-v(3,i))*(r(3,i+1)-r(3,i))**(-1)
theta(i)=thetax(i)+thetay(i)+thetaz(i)
else
thetax(i)=(v(1,i)-v(1,i-1))*(r(1,i)-r(1,i-1))**(-1)
thetay(i)=(v(2,i)-v(2,i-1))*(r(2,i)-r(2,i-1))**(-1)
thetaz(i)=(v(3,i)-v(3,i-1))*(r(3,i)-r(3,i-1))**(-1)
theta(i)=thetax(i)+thetay(i)+thetaz(i)
endif
end do
RETURN
end subroutine readheader
end module MySubs
module MySubs2
contains
subroutine readheader2(thetapx, thetapy, thetapz,thetap)
include 'psize.inc'
include 'pinfo.inc'
#include "rvarrays.inc"
include 'itype.inc'
include 'iodefs.inc'
character*1 answer
REAL :: z2
REAL,ALLOCATABLE,intent(inout),DIMENSION (:) :: thetapz,thetap
REAL,ALLOCATABLE,intent(inout),DIMENSION (:) :: thetapx, thetapy
ALLOCATE (thetapx(nobj),thetapy(nobj),thetapz(nobj))
1 print*,'Which datafile?'
print*, 'Point 2a'
read(*,'(a)') datafile
print*, 'Point 2b'
CALL readdata
do i=1,nobj
if (i<nobj) then
thetapx(i)=(v(1,i+1)-v(1,i))*(r(1,i+1)-r(1,i))**(-1)
thetapy(i)=(v(2,i+1)-v(2,i))*(r(2,i+1)-r(2,i))**(-1)
thetapz(i)=(v(3,i+1)-v(3,i))*(r(3,i+1)-r(3,i))**(-1)
thetap(i)=thetapx(i)+thetapy(i)+thetapz(i)
else
thetapx(i)=(v(1,i)-v(1,i-1))*(r(1,i)-r(1,i-1))**(-1)
thetapy(i)=(v(2,i)-v(2,i-1))*(r(2,i)-r(2,i-1))**(-1)
thetapz(i)=(v(3,i)-v(3,i-1))*(r(3,i)-r(3,i-1))**(-1)
thetap(i)=thetapx(i)+thetapy(i)+thetapz(i)
endif
end do
RETURN
end subroutine readheader2
end module MySubs2
PROGRAM decpar
use MySubs
use MySubs2
include 'psize.inc'
include 'pinfo.inc'
#include "rvarrays.inc"
include 'itype.inc'
include 'iodefs.inc'
REAL,ALLOCATABLE,DIMENSION(:) :: dztheta,dthetax,dthetay,dthetaz
REAL,ALLOCATABLE,DIMENSION(:) :: convtheta,dttheta,q1,q2,q3,q
REAL,ALLOCATABLE,DIMENSION(:) :: theta,thetax,thetay,thetaz
REAL,ALLOCATABLE,DIMENSION(:) :: thetapx, thetapy, thetapz,thetap
REAL,ALLOCATABLE,DIMENSION(:) :: dthetasp
ALLOCATE(dztheta(nobj),dthetax(nobj),dthetay(nobj),dthetaz(nobj))
ALLOCATE(q(nobj),dthetasp(nobj),q3(nobj))
ALLOCATE(convtheta(nobj),dttheta(nobj),q1(nobj),q2(nobj))
CALL readheader(theta,thetax,thetay,thetaz)
CALL readheader2(thetapx, thetapy, thetapz,thetap)
q0=-0.55
do i=1,nobj
dztheta(i)=(thetap(i)-theta(i))*(z1-z2)**(-1)
dttheta(i)=-(2./3.)*dztheta(i)
if (i<nobj) then
dthetax(i)=r(1,i)*(thetax(i+1)-thetax(i))/(r(1,i+1)-r(1,i))
dthetay(i)=r(2,i)*(thetay(i+1)-thetay(i))/(r(2,i+1)-r(2,i))
dthetaz(i)=r(3,i)*(thetaz(i+1)-thetaz(i))/(r(3,i+1)-r(3,i))
dthetasp(i)=dthetax(i)+dthetay(i)+dthetaz(i)
else
dthetax(i)=r(1,i)*(thetax(i)-thetax(i-1))/(r(1,i)-r(1,i-1))
dthetay(i)=r(2,i)*(thetay(i)-thetay(i-1))/(r(2,i)-r(2,i-1))
dthetaz(i)=r(3,i)*(thetaz(i)-thetaz(i-1))/(r(3,i)-r(3,i-1))
dthetasp(i)=dthetax(i)+dthetay(i)+dthetaz(i)
endif
convtheta(i)=dttheta(i)+h100*100.0*dthetasp(i)
q1(i)=-1+(1+q0)*(1+theta(i)/(3.0*100.0*h100))**(-2)
q2(i)=-(dttheta(i)/(3*100*h100)**2)
q3(i)=(1+theta(i)/(3*100*h100))**(-2)
q(i)=q1(i)+q2(i)*q3(i)
end do
DEALLOCATE(dztheta,dthetax,dthetay,dthetaz)
DEALLOCATE(q,q1,q2,q3,dthetasp)
DEALLOCATE(convtheta,dttheta)
end