2017-02-06 4 views
1

다른 서브 루틴에서 서브 루틴으로 값을 전달하는 방법을 이해하려고합니다.Fortran에서 서브 루틴으로 매개 변수 전달하기

나는 코드가 있습니다

program pg 
call sub() 
end 

subroutine sub() 
character :: P(12,12) 
character :: D(20), N(26), userInput 
integer :: A,B 

A = 5 
B = 2 
userInput = "hello" 
call test(P,D,N,userInput,A,B) 

end subroutine 

subroutine test(P,D,N,userInput,A,B) 

end subroutine test 

을하지만 그 날의 경고를 제공합니다, 말할 것도없고 만약 내가이 경고를 제거하는 방법을 정확히 모르겠어요

Warning: Type mismatch in argument 'p' at (1); passed CHARACTER(1) to REAL(4) 

을 서브 루틴 호출이 정확합니다 (구문 현명한). 어떤 도움이라도 대단히 감사 할 것입니다.

+0

서브 루틴'test'를 완료해야합니다. 그곳에는 인수의 유형을 선언하지 않았으므로 기본 입력 규칙이 사용됩니다. 컴파일러가 인터페이스를 확인하고 일치하지 않는 것처럼 보이는 것 같습니다. – francescalus

+0

저는 Fortran을 처음 보았습니다. 그곳에서 논쟁의 유형을 어떻게 선언 할 수 있습니까? 나는 실제로 그렇게하는 법을 실제로 모른다. – werrer

+0

아마도 대답이 너무 광범위 할 수 있지만 [documentation] (http://stackoverflow.com/documentation/fortran/1106/procedures-functions-and-subroutines#t=20170206030408357924) 도움이 될 수 있습니다. – francescalus

답변

1

먼저,이 오류가 발생하는 이유 : 당신은 명시 적으로 기본적으로 이렇게 서브 루틴 test의 모든 변수는 IMPLICIT 변수 유형의 규칙이 적용 선언하지 않은 - [A-H,O-Z]로 시작하는 변수는 단 정밀도 실수 (REAL(4))과 같이 취급됩니다 나머지 ([I-N]으로 시작)는 정수입니다. 이 경우 test의 실제 인수는 P, D, userInput, AB입니다. N은 정수로 처리됩니다. 또한 이들은 모두 차원 정보가 test에 제공되지 않으므로 스칼라 수량으로 처리됩니다.

서브 루틴 에서 변수 P은 길이 1 문자열 (단일 문자 또는 CHARACTER(1))의 12x12 배열로 선언됩니다. 왜 유형 불일치 오류가 발생하는지 설명합니다.

조언 : IMPLICIT 문장을 읽고 항상 IMPLICIT NONE으로 코드를 시작하십시오. 이렇게하면 모든 변수를 선언해야합니다. 이 약간의 불편 함은 컴파일러가 오타 및 네임 스페이스 충돌을 잡아 내고 모범 사례로 간주됩니다. 다음 문제는 해결되지 않습니다 (P, DN은 스칼라가 될 것으로 예상되는 루틴에 인수로 전달 된 배열입니다.) 그러나 형식 불일치 오류를 제거합니다.

보너스 포인트는 인수 선언에 대해 INTENT 속성을 조사하십시오. 특정 인수가 읽기 전용이거나 루틴 내에서 값이 설정되는 경우에는 INTENT(IN) 또는 INTENT(OUT)으로 선언 할 수 있습니다. 이는 실수로 읽기 전용 변수를 변경하거나 초기화하기 전에 변수를 읽지 않도록 방지하는 추가 기능입니다.

관련 문제