2010-12-12 8 views
1

스칼라 INTEGER를 생성하고 서브 루틴으로 전달하면 해당 값이 부동 소수점으로 변환되고 끔찍하게 부정확합니다. 예를 들어, s = 2로 설정하고 print_my_int를 호출하면 (,) 콘솔에 출력되며, 그 값은 2.80259693E-45로 표시됩니다. 다른 스칼라 정수는 s = 0 인 경우를 제외하고는 유사하게 동작합니다.이 경우 출력은 0.0000000입니다. 그러나 정수는 분명히 소수점과 가수를 표시하지 않아야하기 때문에 이것은 여전히 ​​잘못된 것입니다. 로컬로 표시 될 때 다른 정수가 올바르게 표시되도록 할 수 있으므로 출력 형식 문제가 아닙니다.Help! FORTRAN 정수를 전달하면 부정확 한 수레로 변환됩니다.

여기에 무슨 일이 일어나고 있는지 실마리가 있습니까? 서브 루틴 정의에서 인수 데이터 형식을 강제로 사용해야합니까? 이것도 할 수 있습니까?

예제 코드 :

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

결과 출력 :

2.80259693E-45 

답변

1

좋아, 조기 포스트,하지만 난 같은으로 실행하는 사람을 위해 그것을 떠날거야. FORTRAN에서 매개 변수 유형을 적용하는 구문에 익숙하지 않습니다. 서브 루틴 정의에서 매개 변수의 데이터 유형은 이름 및 매개 변수 목록 아래에 있습니다. 포함되어 있지 않으면 GNU 컴파일러는 경고하거나 스 쿼크하지 않습니다. 기본적으로 다른 유형으로 캐스팅 한 것 같습니다. 그래서, 내 위의 예는 다음과 같이 읽어야 ...

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    INTEGER x 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 
+1

FORTRAN에 변수 이름의 초기 문자를 기반으로 유추가 있기 때문에 매개 변수 이름을'x'에서'i' 또는'j'로 변경하면 작동합니다. 그러나 그렇게하지 마십시오. 나쁜 습관입니다. – JasonFruit

+0

고마워요. 핸디 팁,하지만 과실을 피하기 위해주의 할 것입니다. –

+3

선언되지 않은 변수에 컴파일러 초크를 만들려는 경우 모든 프로그램/서브 루틴의 시작 부분에 "암시 적 없음"문을 사용하는 것이 좋습니다. – steabert

2

을 새로운 것이 아니다 아무것도, 단지 주석에 적합하지 않은 일부 코드를 제공하여 인터페이스의 사용을 지적하고 싶었 :

PROGRAM print_int 
INTERFACE 
    SUBROUTINE print_my_int(x) 
    END SUBROUTINE 
END INTERFACE 
INTEGER s 
s = 2 
CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
WRITE(*,*) x 
END SUBROUTINE print_my_int 
3

또 다른 확장 코멘트 : 당신이 선언 섹션의 시작 부분에 사방 implicit none을 넣을 수 있습니다, 또는 대안이 서브 루틴을 사용하는 프로그램에서 인터페이스를 넣을 수 있습니다 언급 한 바와 같이, 다음 컴파일러는 형식 불일치 오류가 발생합니다 , 여전히 @steabert보다 간단하다. '들 :

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 

CONTAINS 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

END PROGRAM print_int 

프로그램에서 서브 루틴을 포함하여 당신은 명시 적 인터페이스를 만드는 코드의 3 개 라인 절약에 컴파일러를 강요. 서브 루틴 내에 x의 선언을 내재적으로두면 컴파일러는 오류를 찾습니다.

관련 문제