2015-03-08 3 views
1

В Fortran можно выделить память для указателя, или один не может:Понимание Fortran указатели

real(kind=jp), target :: bt(100,100) 
real(kind=jp), pointer :: pt(:,:) 

Но тогда вы можете выделить память для указателя pt:

allocate(pt(100,100)) 

Мой вопрос: что являются плюсами и минусами? Для всех, что я вижу, выделение памяти указателю поражает цель указателя и использует больше памяти. Конечно, мои знания указателей ограничены, поэтому, если кто-то может объяснить мне, что происходит здесь, я был бы благодарен.

Я использую модель со смешанным кодом FORTRAN 77 и Fortran 90, плюс, я компилирую код с использованием компиляторов Intel.

ответ

4

Как Владимир Ф сказал в комментарии к другому ответу, может возникнуть некоторая путаница в отношении того, что делает пример кода. Хотя и не очень широкий ответ на все указатели (которые уже частично охвачены), я кратко прокомментирую.

real(kind=jp), target :: bt(100,100) 
real(kind=jp), pointer :: pt(:,:) 

Указатель pt не в этой точке, указывающей ни к чему: он имеет неопределенный статус ассоциации. То, что у вас есть два объекта, объявленные вместе, один с атрибутом target и один с атрибутом pointer, ничего не означает.

Чтобы связать pt с целью bt, требуется назначение указателя:

pt => bt 

Таким образом, можно идти вперед и делать то, чтобы bt через указатель pt без каких-либо дополнительных выделения памяти (там будет некоторые служебные данные связаны с переменной указателя, но не будем игнорировать это).

Да, один также может сделать выделение указателя, как в вопросе

allocate(pt(100,100)) 

но новоиспеченный кусок памяти не имеет ничего общего с bt.

Как в Alexander Vogt said в современных случаях есть причины, по которым нужно делать подобные вещи (вместо этого полезно использовать распределяемые массивы).

Таким образом, для «каковы плюсы и минусы?»: Назначение и распределение указателей делают совершенно разные вещи. Выберите подходящий вариант.

3

Выделяемые указатели, как вы их используете, были широко использованы, прежде чем фиктивные аргументы могут быть allocatable (Fortran 2003). Таким образом, вы можете передать массив и выделить его в другой подпрограмме, что очень полезно для входных процедур, где вы не знаете размер ввода заранее.

Выделенные указатели ведут себя очень сходно с обычными аналогами, но не автоматически освобождаются. Некоторые говорят, что использование указателей таким образом вредно для производительности, но я никогда не испытывал этого сам (вероятно, специфический для компилятора). Тем не менее, одна проблема с указателями - это возможное сглаживание при использовании в качестве фиктивных аргументов.

В настоящее время я не буду использовать указатели, если бы мог использовать массив allocatable. Это имеет много преимуществ, ключевым из которых является автоматическое освобождение и улучшенная читаемость кода. (Если вам нравится, вы также можете использовать автоматическое распределение LHS, но обычно я отключу это).

Для указателей ООП необходимы, и я использую их много, например. связанные списки, деревья и т. д. Если у вас есть вложенные производные типы, также довольно элегантно использовать указатели, чтобы уменьшить удаление ссылок.

+0

У меня другое беспокойство, ОП не упоминает 'allocatable' вообще. Я не уверен, правильно ли он понимает, что делают три строки кода. –

+0

Я не про программист, но в своей работе я занимаюсь множеством задач программирования, которые часто требуют, чтобы я выбрал оптимальный способ решения проблемы, а не просто сделать это жестоким образом. К сожалению, я сталкиваюсь с большим количеством старого кода и должен попытаться понять, что происходит. Итак, да, я не полностью понял указатели в Фортране. Моя первая встреча с указателями заключалась в том, что главной проблемой было потребление памяти. Теперь я понимаю немного лучше. В моей текущей задаче мы используем производные типы для передачи большого количества данных в виде указателей с выделенной памятью. Спасибо, парни :-) – Shejo284

Смежные вопросы