2015-03-23 3 views
2

У меня есть производный тип данных в Фортране Wich выглядят следующим образом:Fortran: Cray указатели и производные типы данных

TYPE mytype 
     INTEGER a 
     DOUBLE COMPLEX, dimension(:), allocatable :: elem 
END TYPE mytype 

Теперь я хочу, чтобы запрограммировать функцию, которая получает двойной комплекс массива в качестве аргумента. Этот массив должен стать массивом «elem» из «mytype» без выделения памяти и копирования данных. Я пытался использовать указатель Cray следующим образом:

DOUBLE COMPLEX, INTENT(IN) :: eleminput(5) !input array which should become x%elem 
TYPE(mytype) :: x 
pointer(xpntr,x%elem) 
xpntr = LOC(eleminput) 

Когда я пытаюсь скомпилировать я получаю сообщение об ошибке сказав это expacting «)» вместо «%» в строке «указатель (xpntr, х% эль)». Поэтому кажется, что указатели cray не работают с элементами производного типа данных. Есть ли возможность получить эту работу с или без указателей? Производный тип данных не может быть изменен. Надеюсь, вы оставите свой вопрос и спасибо за вашу помощь.

+0

Имеет ли аргумент eleminput значение, которое требуется x% elem? – IanH

ответ

3

Вы можете переместить выделение. Если eleminput аргумент размещаемый:

integer, parameter :: dp = kind(1.0d0) 
type mytype 
    integer :: a 
    complex(kind=dp), dimension(:), allocatable :: elem 
end type 

...  

subroutine foo(eleminput) 
    complex(kind=dp), intent(inout), allocatable :: eleminput(:) 
    type(mytype) :: x 
    call move_alloc(eleminput, x%elem) 
    !... work with x 
end subroutine foo 

Фактический аргумент, связанный с распределяемым фиктивным аргументом сам по себе должен быть размещаемым - то есть - вызов foo должен выглядеть примерно так:

complex(kind=dp), allocatable :: fred(:) 
fred = [(0,0),(0,1),(1,1),(1,0)] 
call foo(fred) 

Из-за выделение выведен из аргумента eleminput внутри подпрограммы foo, фактический аргумент fred будет нераспределенным при возврате этой подпрограммы.

2

Указатели cray не работают с allocatables. Я бы настоятельно рекомендую использовать указатель Cray в новом коде, потому что Cray указатели тонко отличаются в деталях реализации, а нормальный Fortran указатели работают здесь:

module bar 
    integer, parameter :: dp = selected_real_kind(15) 
    TYPE mytype 
    INTEGER:: a 
    complex(kind=dp), dimension(:), allocatable :: elem 
    END TYPE mytype 

contains 

    subroutine foo(eleminput) 
    complex(kind=dp), dimension(:), intent(out), pointer :: eleminput 
    type(mytype), target, save : : x 
    allocate (x%elem(.....)) 
    eleminput => x%elem 
    end subroutine foo 
end module bar 
+0

Благодарим вас за ответ. Есть ли возможность без изменения mytype% elem на указатель? – Yannick

+0

Я думаю, что версия для редактирования должна работать. 'elem' теперь выделяется, и также важно добавить' save' в x или он будет освобожден после выхода из foo (не очень хорошая идея, если вы все еще держите указатель на него). Также сохраните инструкцию allocate, чтобы вы не выделяли дважды. –

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