Связанные указатели в производном типе? gFortran против Intel - PullRequest
8 голосов
/ 15 декабря 2009

Я хотел бы проверить, был ли указатель внутри производного типа уже определен или нет. Я написал следующий простой код, чтобы показать вам мою проблему:

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 дает другой результат, заставляет меня опасаться, что мой код может быть неправильным. Я делаю что-то ужасно не так с указателями в этом примере? Любая идея или объяснение?

Большое спасибо заранее за вашу помощь!

1 Ответ

12 голосов
/ 15 декабря 2009

Вы проверяете, связан ли указатель без явного использования nullify на указателях. Отличная страница о распространенных ошибках Фортрана замечания (с удаленным примером кода):

Многие думают, что состояние указателя, который никогда не был связан, - .not. связано. Это неверно (...) Когда указатель объявлен, его состояние не определено, и его нельзя безопасно запросить с помощью встроенного associated.

Похоже, что компилятор gfortran может быть настроен на явное аннулирование указателей при объявлении - вы, вероятно, должны думать об этом, как компилятор, автоматически устанавливающий объявленные переменные в ноль, и не рассчитывает на такое поведение. Если вы хотите быть уверены, вы сами аннулируете это.

Редактировать

Я читаю руководство компилятора Intel, и оно определяет, как убедиться, что указатель обнуляется правильно - вы можете установить свой производный тип как

type y
    real(8), pointer :: x(:) => null()
end type y

Обратите внимание, однако, что кажется, что это ограничено Fortran 95, как упомянуто в связанной статье.

...