Я хотел бы проверить, был ли указатель в полученном типе уже определен или нет. Я написал следующий простой код, чтобы показать Вам мою проблему:
program test
implicit none
type y
real(8), pointer :: x(:)
end type y
type(y), pointer :: w(:)
allocate(w(2))
allocate(w(1)%x(2))
write(*,*) associated(w(1)%x), associated(w(2)%x)
end program test
Компилирование этого кодекса с gFortran 4.4.1 и управление им на Ubuntu дают результат:
T F
тогда как тот же кодекс, собранный на Windows Vista с компилятором Intel Fortran 11.0, обеспечивает:
T T
Первый результат (gFortran) - то, что я на самом деле ожидаю. Но то, что компилятор Intel обеспечивает другой результат, заставляет меня бояться, что мой код не мог бы быть правильным. Я делаю что-то ужасно неправильно с указателями в этом примере? Какая-либо идея или объяснение?
Большое спасибо заранее за Вашу помощь!
Вы проверяете, связан ли указатель, без явного использования обнулить
в указателях. Замечания на замечательной странице распространенных ошибок Fortran (с удаленным примером кода):
Многие люди думают, что статус указателя, который никогда не был связан, - .not. связанный. Это неправда. (...) Когда указатель объявлен, его статус не определен, и его нельзя безопасно запросить с
связанным
встроенным.
Похоже, что компилятор gfortran может быть настроен на явное обнуление указателей при объявлении - вы, вероятно, должны думать об этом, как о том, что компилятор автоматически устанавливает объявленные переменные в ноль и не рассчитывает на такое поведение. Если вы хотите быть уверенным, вы сами аннулируете его.
Правка :
I '