2016-07-20 4 views
0

3D 배열 포인터를 4D 배열 포인터에 저장하려고하는데 문제가 있습니다. 예를 들어 functionp(:,:,:)와 같은 포인터를 반환하는 함수 포인터이며,이 잘 작동Fortran의 포인터 배열 작업 - 하한 오류

real,pointer :: p(:,:,:,:) => null() 
integer :: ndims,d 

ndims = 3 
do d=1,ndims 
    p(d,:,:,:) => function 
end do 

. 내가 얻는 오류는이 줄에 Lower bound has to be present이 있습니다 : p(d,:,:,:) => function,하지만 전에는 이런 종류의 작업을 수행했습니다 (포인터가 아닌) 그리고 괜찮 았는데. 내가 여기서 무엇을 놓치고 있니?

+0

현재 하나의 등급 4 개 p ointer. 언제든지 단일 타겟 배열에 단일 랭크 4 포인터를 가리킬 수 있습니다. 아마도 http://stackoverflow.com/a/8901228/1234550 도움이 될 수 있습니다. – IanH

+0

네,하지만 다른 순위 3 배열을 가리키고 이것을 순위 4 포인터에 저장하고 싶습니다. 추가 순위는 이러한 여러 배열을 고려합니다. 이것은 실제로 가능합니까? –

답변

3

나는이 실제로 포트란에서 무엇을하고 있는지

real,pointer :: p(:,:,:,:) => null() 

의 일반적인 오해에서 비롯됩니다 생각합니다.

포인터의 4 차원 배열이 아니라 4D 배열의 포인터 'p'입니다.

type pointer4D 
    real, pointer :: p 
end type pointer4D 
type(pointer4D), dimension(:) :: arr 

귀하의 코드가 이렇게 될 것입니다 : 당신이 할 수있는 일

약간의 트릭을 재생하고 내부 포인터 구조체 만드는 것입니다

do d=1,ndims 
    arr(d)%p => function 
end do 

'기능을'가정의 일종이다 3D 개체를 사용하면 치수 N의 요소 I, j, k에 액세스 할 수 있습니다.

arr(N)%p(I,j,k) 
+0

좋습니다. Yeap, 나는'p'의 정의에 의해 기본적으로 혼란스러워했습니다. 이것은 C++과 다른 것입니까? –

+0

@bfg 예. C++에서 내가 잘못 본 것이 아니라면 포인터의 배열을 p [ndim]으로 정의 할 수 있습니다. 이것은 Fortran에서는 불가능합니다. – Scarlehoff