Из этого ответа я понимаю (Fortran копия указателя), что я должен попытаться использовать выделяемые массивы, а чем указатели на массивы как компоненты производных типов. Я намереваюсь сделать это, но я привязан к своему текущему коду на следующий год, и мне нужно уметь его использовать и понимать, пока я не смогу внести более крупные и лучшие изменения в следующем году.
Я также думаю, что этот вопрос представляет некоторый общий интерес, потому что я считаю, что поведение fortran здесь довольно неинтуитивно, хотя, по-видимому, правильно. Так что, вероятно, есть смысл в лучшем понимании того, как и почему это работает (иначе я предполагаю, что компилятор вообще не позволит нам это сделать, верно?).
Простите за длинное вступление. Я постараюсь сделать это как одну аннотированную программу, которая была максимально сокращена:
program main
type tRet
real :: agi
real :: wages_tgt(5) ! compiler won't let me declare as
! target but later I point to this
real, pointer :: wages(:)
end type tRet
type(tRet), target :: ret ! I don't quite understand
type(tRet), target :: orig1, orig2 ! why but compiler insists
! these be targets
ret%wages => ret%wages_tgt(1:1)
ret%wages = (/ 11. /)
orig1 = ret
ret%wages = (/ 99. /)
orig2 = ret
Это верхняя половина программы, вот некоторые результаты с выводом на печать, показанным в виде комментариев справа:
! This is not want I want and I was surprised, but it is kind
! of explained in the other answer why this happens, so OK...
print *, "orig1%wages ", orig1%wages ! 99.
print *, "orig2%wages ", orig2%wages ! 99.
! But if I copy from orig1 or orig2 into ret then it
! works like I wanted it to work in the first place!
! But I don't completely understand why it works...
ret = orig1
print *, "ret%wages ", ret%wages ! 11.
print *, "orig1%wages ", orig1%wages ! 11.
print *, "orig2%wages ", orig2%wages ! 11.
ret = orig2
print *, "ret = orig2 "
print *, "ret%wages ", ret%wages ! 99.
print *, "orig1%wages ", orig1%wages ! 99.
print *, "orig2%wages ", orig2%wages ! 99.
end program main
Я рад любому хорошему объяснению того, что здесь происходит. Ирония здесь, я полагаю, в том, что я не так беспокоюсь о том, почему это плохая идея, а скорее о том, почему мой обходной путь работает нормально?
Или, может быть, самый простой способ резюмировать мой вопрос: Что именно указывает на что?
Компилятор: GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
associated
вывод отладки помещается в ваш код? В конце концов, послеret=orig2
? - person Ross   schedule 08.02.2018