2014-03-04 4 views
4

나는 서브 루틴에 할당 가능한 배열을 사용하기 위해 노력하고있어하지만 컴파일러는 내가 찾을 수있는 유일한 것은 내가 명시 적 인터페이스를 사용 하죠이었다FORTRAN - 서브 루틴

Error: Dummy argument 'locs' with INTENT(IN) in variable definition context (ALLOCATE object) at (1) 

불평에 할당 가능한 배열, 나는하고있다. 다음은 서브 루틴 관련 코드입니다.

RECURSIVE SUBROUTINE together(locs, LL, RL) 

    INTEGER, DIMENSION(:,:), ALLOCATABLE, INTENT(IN)   :: locs 
    INTEGER, INTENT(IN)           :: LL, RL 


    ALLOCATE(locs(LL,RL)) 


END SUBROUTINE together 

답변

5

컴파일러의 오류 메시지는 문제를 설명하는 메시지입니다. INTENT(IN)을 사용하면 개체가 변경되지 않는다고 말하면서 다음에 시도하여 ALLOCATE으로 시도하십시오.

예, 명시 적 인터페이스가 호출에 필요하지만 문제는 아닙니다.

포트란 2008 표준은

할당 한 같은 맥락이다

의도가있는 nonpointer 객체 (IN) 속성이 변수 denition 컨텍스트에 표시되지 아니한다 섹션 5.3.10 말한다 : 16.6.7 항, (11) 항.

2

가짜 인수는 할당 가능하며 INTENT (IN) 속성을가집니다. 여기서 intent 속성은 호출 프로 시저가 서브 루틴에 정보를 제공하고 있음을 나타냅니다.

INTENT (IN) 속성의 결과는 locs의 할당 상태 (또는 값)를 변경할 수 없다는 것입니다. ALLOCATE 문은이를 수행하려고 시도하고 있습니다.

+0

감사합니다. 이제는 말이 되네! 내가 이것을하려고하는 이유는 이것을 작동 시키려고하기 때문이다 : 'IF (ANY (loc. .eq. next (k : k + 1))) THEN' 이들은 동일하지 않다. 순위, 전체 경로를 반복하지 않고이 문제를 해결할 방법을 생각할 수는 없다는 것을 알고 있습니다. –

+2

당신이하려는 일에 대해 세부적인 질문을 해보십시오. – IanH

+0

댓글의 새 질문을 다시 작성하십시오. 논리 플래그를 false로 설정하십시오. IF 문을 포함하는 명명 된 루프를 설정하여 조건을 확인하십시오. 조건이 만족되면, 플래그를 true로 설정하고 'exit'를 사용하여 루프를 일찍 종료하십시오. –

0

주 프로그램에 배열을 할당 한 다음 locs을 서브 루틴으로 푸시하는 경우 INTENT(INOUT)을 사용하여 배열의 내용을 변경하려는 경우 컴파일러에 알리십시오.