2014-02-12 2 views
0

제 문제는 계산을하고 이전에 크기를 모르는 배열을 생성하는 서브 루틴이 있다는 것입니다. I 알았을 최상의 솔루션이 type(ragged) 다양한 분리 된 할당 배열 작업 (station%trac)을 사용 하였다 : 그러나1 차원 배열에 비정형 배열 만들기

module ragged_module 
    type ragged 
    real,allocatable,dimension(:)::trac 
    end type ragged 
end module ragged_module 

program chrag 
use ragged_module 
implicit none 
type (ragged), allocatable, dimension (:) :: station 
(...) 
call calculation(station, othervariables) 

call calculus(station1D,othervariables) !station need to be seen as an 1D array here 

end program chrag 

를, I는 일차원 배열과 같은 가변 station을해야 (다른 루틴에 전달할) . 2D 배열로 작업하는 경우 메모리 액세스가 어떻게되는지 알 수 있기 때문에 쉽습니다. 그러나 유형의 경우에는 찾지 못했습니다.

쉬운 방법이 있나요? 또는 1D 할당 배열을 선언하고 필요한 길이를 할당 한 후 station의 각 구성 요소 값을이 새로운 1D 배열에 전달해야합니까? 내 관심사는 거대한 배열로 작업하고 있기 때문에 나의 오래된 해결책은 move_alloc을 사용하여 내 코드를 매우 느리게 만들었 기 때문이다.

답변

0

의사 배열 station(:)%trac을 순위 1 배열로 쉽게 패싱 할 수있는 방법은 없습니다. 나는 순위 1 배열의 첫 번째 요소를 station(1)%trac(1)으로 동일화하는 것과 같은 오래된 포트란 트릭의 '영리한'사용은 컴파일러가 그러한 선언을 허용하더라도 작동 할 것이라고 생각하지 않습니다. 그 유형의 트릭은 메모리에있는 배열 요소의 특정 레이아웃에 달려 있는데, 이는 표준에 의해 보장되지 않습니다. 시도해 볼 수도 있지만 성공을위한 많은 희망을 가지지 않을 것입니다.

쓰기와 너덜 너덜 배열에서 읽는, 사용의 당신의 패턴에 따라 다른 디자인을 채택 할 수있는 너덜 너덜 배열의 모든 항목이 순위에 저장되어있는 같은

type :: ragged_array 
    integer, dimension(:), allocatable :: indices 
    real, dimension(:), allocatable :: elements 
end type ragged_array 

-1 배열 elements. indices은 물론, 비정형 배열의 각 '행'시작 (또는 끝) 색인을 보유합니다. 이 접근법은 비정형 배열을 더 어렵게 만들고, '행'을 추출합니다. 마지막 행 이외의 '행'길이를 조정하려는 경우 무서워요.

그러나 모든 요소는 랭크 1 배열에 저장되어 한 번의 룰에서 처리 할 준비가되며 데이터를 마샬링하는 동안 대형 배열의 임시 복사본을 만들 필요가 없습니다.

귀하가 선택한 것보다 귀하의 응용 프로그램이 더 뛰어나다는 것을 알고 있습니다.

관련 문제