2012-01-17 7 views
20

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

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 
... 

Компилятор (pgf90 10.6-0 64-разрядная цель на x86-64 Linux -ТП стамбульской 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 (скалярные указатели). Каков правильный способ реализации этого?

Спасибо.

ответ

51

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

Проблема заключается в том, что это:

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

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

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

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 

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

+1

Спасибо Джонатан, это отличный ответ. – milancurcic

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