Массивы автоматически изменяются в подпрограмме, которую они прочитали - PullRequest
0 голосов
/ 08 февраля 2019

Я не эксперт, но я пишу код, используя Absoft Fortran 2016. Вкратце: кажется, что массивы пишут друг на друга или, возможно, они используют одну и ту же часть памяти.Я выяснил, что выходные значения не рациональны. После некоторых проверок я обнаружил, что существует проблема с массивами. Я упростил код до той части, которая столкнулась с проблемой.Есть основной корпус и 2 подпрограммы.Первая подпрограмма (SubInput0) считывает основные данные, а вторая (SubInput1) считывает подробные данные.В SubInput1 некоторые координаты должны быть прочитаны из некоторых файлов.они читаются правильно, но в следующем цикле значения начинают меняться!Я имею в виду, что пока следующий цикл читает следующий массив, предыдущий массив также изменился, хотя между ними нет никакой связи.Выходные данные показывают, что следующий массив записывает себя в предыдущий.Это действительно смутило меня.

Спасибо за вашу помощь.

Я пробовал разные способы объявлять массивы по-разному, также объявлять или не объявлять массивы внутри тела, пробовал разные неявные подходы.

SubRoutine Control()
!THIS SUBROUTINE CONTROLS THE PROGRAM
!==================================================
  Common /A/NNP,NODB3
  Common /A1/NB3,NNPBED3,NNE,NNPEN
  Common /C/NLoad,NTime,ITime,DTime
  Common /E/GRAV

    Real,Dimension(2,NNP)   :: X
    Real,Dimension(2,NNE)   :: XEncl
    Real,Dimension(3)       :: MATERIAL

    Open (10,FILE=Input.TXT)              !Open Input File
Open (20,FILE=Output.TXT)             !Open Output File
Open (30,FILE='Log.txt')              !Open Log File
Open (40,FILE='Node.txt')             !Open Node Coordinate File
Open (50,FILE='Encl.txt')             !Open Encl Node Coordinate File

!--------Calling Sub Routines

!==============================              
    Call SubInput0 ()                     !Call Sub to read the basic info             
!==============================  
!==============================              
    Call SubInput1 (X,XEncl,MATERIAL)     !Call Sub to read the Details             
!==============================   

RETURN 
END

SubRoutine SubInput0

SubRoutine SubInput0()
!This SubRoutine Reads The Basic Data From The Input Files

! Commons -----------------------------------------
  Common /A/NNP,NODB3
  Common /A1/NB3,NNPBED3,NNE,NNPEN
  Common /C/NLoad,NTime,ITime,DTime
  Common /E/GRAV
!--------------------------------------------------      
Character*10 C$

Write(*,*) "SubInput0 Started"        

    Read(10,*) C$                        ! Read Project Name       
    Read(10,*) NNP                       ! Read Num of total Nodes
    Read(10,*) NNPBED3,NNPEN
    Read(10,*) NLOAD,NTIME,DTime         ! Read Num of Load and Time Steps

    Grav=9.81

  NB3=NNPBED3
  NNE=NNPEN

RETURN 
End

SubRoutine SubInput1

SubRoutine SubInput1(X,XEncl,MATERIAL)
!This SubRoutine Reads The Basic Data From The Input Files

! Commons -----------------------------------------
  Common /A/NNP,NODB3
  Common /A1/NB3,NNPBED3,NNE,NNPEN
  Common /C/NLoad,NTime,ITime,DTime
  Common /E/GRAV
!-------------------------------------------------- 

    Real,Dimension(2,NNP), intent(out)   :: X
    Real,Dimension(2,NNE), intent(out)   :: XEncl
    Real,Dimension(3),     intent(out)   :: MATERIAL


Write(*,*) "SubInput1 Started"        

    Do i=1,NNP
    read(40,*) NN,X(1,i),X(2,i)          ! First it's readed correctly
    Enddo

    Do i=1,NNE
    read(50,*) NE,XEncl(1,i),XEncl(2,i)  ! But here the X will also change
    Enddo

!Read Material Data------------------------------
    Read(10,*) MATERIAL(1),MATERIAL(2),MATERIAL(3) 
                                   ! Also here both X and XEncl change
!------------------------------------------------
RETURN 
END

X, сразу после его чтения в первом цикле, которые являются правильными:

-100.000 0,000000 -80,0000 0,000000 -60,0000 0,000000 -40,0000 0,000000 -20,0000 0,000000 0,000000 0,000000 20,0000 0,000000 40,0000 0,000000 60,0000 0,000000 80,0000 0,000000 100 000 0,000000

X, значения после второго цикла неверны:

-100.000 -20.0000 -100.000 -40.0000 -100.000 -60.0000 -100.000 -80.0000 -100.000 -100.000 -80.0000 -100.000 -60.0000 -100.000 -40.0000 -100.000 -20.0000 -100.000 0.000000 -100.000 20.0000 -100.000

XEncl Значения, которые, я думаю, как-то связаны с измененными значениями X:

-100.000 -20.0000 -100.000 -40.0000 -100.000 -60.0000 -100.000 -80.0000 -100.000 -100.000 -80.0000 -100.000 -60.0000 -100.000-40.0000 -100.000 -20.0000 -100.000 0.000000 -100.000 20.0000 -100.000 40.0000 -100.000 60.0000 -100.000 80.0000 -100.000100.000 -100.000 100.000 -80.0000 100.000 -60.0000 100.000 -40.0000 100.000 -20.0000

...