Массивы указателей - PullRequest
       7

Массивы указателей

26 голосов
/ 17 января 2012

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

TYPE(domain),POINTER              :: d01,d02,d03
TYPE(domain),DIMENSION(:),POINTER :: dom
...

dom(1) => d01
dom(2) => d02
dom(3) => d03
...

, а затем:

...
IF(ASSOCIATED(dom(2),d02))THEN
...

Компилятор (64-битная цель pgf90 10.6-0 на x86-64 Linux -tpistanbul-64) выдает мне следующее сообщение об ошибке:

 PGF90-S-0074-Illegal number or type of arguments to associated - keyword argument pointer (test_ptr.f90: 10)
  0 inform,   0 warnings,   1 severes, 0 fatal for MAIN

Насколько я понимаю, что-то не так в том, как я подставляю массив указателей.И dom(2), и d02 имеют ранг 0 (скалярные указатели).Как правильно это реализовать?

Спасибо.

1 Ответ

61 голосов
/ 18 января 2012

Да, массивы указателей смешны в Фортране.

Проблема в том, что это:

TYPE(domain),DIMENSION(:),POINTER :: dom

определяет не массив указателей, как вы могли бы подумать, но указатель на массив. Есть несколько классных вещей, которые вы можете делать с этими вещами в Фортране - указывать на куски больших массивов, даже с шагами - но это определенно указатель на массив, а не массив указателей.

Единственный способ получить массивы указателей в Фортране - это определить тип:

type domainptr
  type(domain), pointer :: p
end type mytype

type(domainptr), dimension(3) :: dom

dom(1)%p => d01
dom(2)%p => d02
dom(3)%p => d03

и т.д.. Насколько я могу судить, единственная реальная причина, по которой вы должны сделать это на Фортране, - это синтаксис. Я бы хотел, чтобы это было исправлено в более поздней версии стандарта.

...