2014-12-04 5 views
1
이차원 배열은, 예를 들면 열 주요 형식으로 저장된다 포트란

:포트란 파생 데이터 형식 이차원 배열 저장

integer, allocatable, dimension(:,:)::A 
allocate(A(3,4)) 

배열 "A"A (1,1)와 같은 메모리에 저장 될 , A (2,1), A (3,1), A (1,2), A (2,2), A (3,2), ... 등이 있습니다. 내가 예를 들어, 파생 데이터 형식이있을 때

는하지만 발생합니다

배열이 메모리에 현재 저장되어있는 "A"않습니다 어떻게
type :: innerdata 
integer :: i 
real :: j  
end type innerdata 
type(innerdata), allocatable, dimension(:,:) :: A 
allocate(A(3,4)) 

? 감사!

+2

왜 다르게 저장 될 것이라고 생각합니까? –

+0

일부 사용자 정의 형식은 총 크기를 8 바이트 등의 배수가되도록 패딩을 가질 수 있습니다. 이 문제에 영향을주는 컴파일러 설정이 있습니다. – ja72

답변

5

파생 형식의 배열은 동일한 열 - 주 순서로 저장됩니다.

개별 구성 요소가 저장된 위치가 궁금 할 수 있습니다. 배열 요소의 주소로부터의 오프셋은 지정되지 않으며 순서는 선언 순서와 다를 수 있으며 여러 순서 사이에 다양한 간격이있을 수 있습니다. 그러나 일단 오프셋 값을 (loc() 또는 c_loc()을 호출하여) 설정하면 해당 배열 내부 또는 그 밖의 다른 위치에 상관없이 해당 유형의 모든 인스턴스에 대해 일정합니다.

그래서, 구성 요소의 순서가 될 수

A(1,1)%i,optional_padding,A(1,1)%j,optional_padding,A(2,1)%i,optional_padding,A(2,1)%j,optional_padding,... 

하지만

type :: innerdata 
sequence 
integer :: i 
real :: j  
end type innerdata 

당신이 순서를 강제로 사용 sequence 유형으로 유형을 정의함으로써도

A(1,1)%j,optional_padding,A(1,1)%i,optional_padding,A(2,1)%j,optional_padding,A(2,1)%i,optional_padding,... 

A(1,1)%i,A(1,1)%j,A(2,1)%i,A(2,1)%j,... 

그러나 요소 또는 구성 요소에 대한 액세스가 느려질 수 있고 일부 플랫폼에서 일부 바이트 수에 맞춰 정렬되지 않은 메모리 액세스가 허용되어 (매우 느린 액세스로 이어질 수 있기 때문에) 권장하지 않습니다.

유형의 저장소 크기를 알고 싶다면 storage_size() 내장 (Fortran 2008)을 사용하십시오. 결과는 비트 단위입니다. 변수의 주소를 제공하는 비표준이지만 일반적인 공통 확장 인 loc()을 사용해 볼 수도 있습니다. 두 인접 요소의 loc의 차이는 요소 크기입니다. c_loc() (Fortan 2003) 및 transfer()- 결과를 integer(c_intptr_t)으로 사용하여 동일하게 수행 할 수 있습니다. MPI에서 MPI_Sizeof() 기능도 도움이 될 수 있습니다.