Возможны ли анонимные массивы в фортране?

Я пытаюсь создать массив массивов в Fortran.

Что-то вроде следующего

TYPE :: array_of_arrays
   REAL, DIMENSION(:), POINTER :: p => NULL()
END TYPE

TYPE(array_of_arrays), DIMENSION(2) :: some_array

Чтобы я мог сделать:

REAL, DIMENSION(3), TARGET :: some_vector1 = (/1.0, 2.1, 4.3/)
REAL, DIMENSION(3), TARGET :: some_vector2 = (/3.0, 1.2, 9.6/)

some_array(1)%p => some_vector1
some_array(2)%p => some_vector2

WRITE(*,*) some_array(1)%p ! I see some_vector1
WRITE(*,*) some_array(2)%p ! I see some_vector2

Теперь мне сложно объявить каждый из этих some_vector массивов соответствующим каждому элементу в моем массиве массивов.

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

Таким образом, я могу иметь анонимные массивы.

Однако это, похоже, не работает, и мне интересно, если я сначала делаю что-то, что Fortran не поддерживает.

Так поддерживает ли Fortran анонимные массивы, то есть (на случай, если я ошибаюсь в терминах), массив, к которому можно получить доступ только через ссылку?


person EMiller    schedule 17.08.2012    source источник
comment
Я не понимаю. Можно предположить, что ваша отдельная подпрограмма могла бы ВЫДЕЛИТЬ компоненты указателя таким образом, чтобы они указывали на временное хранилище. Вам нужно будет учитывать время жизни этого временного хранилища. Возможно, покажите код того, что не работает.   -  person IanH    schedule 17.08.2012


Ответы (1)


Конечно; как предлагает IanH, вы можете просто указать указатель на выделенную память напрямую, а не на переменную; это один из немногих случаев, когда выделенная память не освобождается автоматически, как только она выходит за пределы области действия.

eg,

module arrays


TYPE :: array_of_arrays
   REAL, DIMENSION(:), POINTER :: p => NULL()
END TYPE

contains

subroutine alloc(aa)
    type(array_of_arrays), intent(inout) :: aa(:)
    integer :: i

    allocate( aa(1)%p(1) )
    aa(1) % p = [1.]

    allocate( aa(2)%p(5) )
    aa(2) % p = [ (i, i=1,5) ]

end subroutine alloc

end module arrays



program usearrays
    use arrays

    TYPE(array_of_arrays), DIMENSION(2) :: some_array

    call alloc(some_array)

    WRITE(*,*) some_array(1)%p ! I see some_vector1
    WRITE(*,*) some_array(2)%p ! I see some_vector2

    deallocate( some_array(1) )
    deallocate( some_array(2) )

end program usearrays

и запуск дает

$ gfortran -o arrays arrays.f90 
$ ./arrays 
   1.0000000    
   1.0000000       2.0000000       3.0000000       4.0000000       5.0000000    
person Jonathan Dursi    schedule 17.08.2012
comment
Ага. Это сделало это. Я не понимал, что выделение указателей - это то, что я хотел. Я думал, что подпрограмма allocate предназначена для выделяемого массива, но теперь это имеет смысл. - person EMiller; 17.08.2012
comment
Не очевидно, что один и тот же синтаксис должен использоваться для двух условно (внутри языка) разных операций, но это так... - person Jonathan Dursi; 18.08.2012