2012-08-17 1 views
2

배열 배열을 Fortran에 만들려고합니다. 내가 할 수있는 포트란에서 익명 배열을 사용할 수 있습니까?

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

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

그래서 다음

같은

뭔가 : 나 실제로 이러한 some_vector 배열의 각을 선언하는

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 

은 이제 내 배열의 각 요소에 해당하는 성가신 배열.

임시 벡터가 대상으로 설정되어있는 별도의 서브 루틴을 갖고 싶습니다. 서브 루틴은 배열의 배열을 임시 벡터를 가리 키도록 설정합니다.

이렇게하면 익명 배열을 가질 수 있습니다.

그러나 이것이 작동하지 않는 것 같아서 처음으로 Fortran이 지원하지 않는 작업을 수행하고 있는지 궁금합니다.

Fortran은 익명 어레이를 지원합니까? (용어가 잘못되었을 경우를 대비하여) 참조를 통해서만 액세스 할 수있는 배열입니까?

+1

을 제공합니다 실행. 격렬하게 추측 해 보면, 별도의 서브 루틴은 포인터 구성 요소를 "임시"저장 장치를 가리 키도록 할당 할 수 있습니다. 임시 저장소의 수명을 고려해야합니다. 아마도 "작동하지 않는 것"에 대한 코드를 표시하십시오. – IanH

답변

4

확실히; IanH가 말했듯이 변수를 참조하기보다는 포인터가 할당 된 메모리를 직접 참조하도록 할 수 있습니다. 이는 할당 된 메모리가 범위를 벗어나면 자동으로 할당 해제되지 않는 몇 가지 경우 중 하나입니다.

예를 들어,

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  
+0

예. 그랬어. 나는 포인터를 할당하는 것이 내가 원하는 것임을 깨닫지 못했다. 할당 서브 루틴은 할당 가능한 배열을위한 것이라고 생각 했었지만 지금은 이해할 수 있습니다. – EMiller

+0

개념적으로 (언어 내에서) 서로 다른 두 가지 작업에 대해 동일한 구문을 사용해야한다는 것은 분명하지 않지만 거기에는 ... –

관련 문제