2012-04-08 2 views
0

저는 유한 요소 분석 프로그램의 fortran 서브 루틴을 연구하고 있습니다. 공통 블록을 사용하고 있으므로 두 서브 루틴 사이에 변수를 공유해야합니다 (EDIT : 모듈이 더 좋습니다). 문제는 일부 변수 만 다른 서브 루틴에 전달되고 다른 변수는 전달되지 않는다는 것입니다. 첫 번째 서브 루틴 :Fortran에서 공통 블록을 사용하는 문제

내 코드는 다음과 같다

real knom, krot 

COMMON /kVAR/ kmom, krot 
SAVE /kVAR/ 

두 번째 서브 루틴 내가 같은 구문을 사용합니다. 나는 txt 파일에 각 서브 루틴에 kmom 및 krot 값을 작성하여 결과를 제어하고 있습니다 :

write(6,*) 'I am in URDFIL', or 'I am in UFIELD' 
1 KINC, kmom, krot 

결과는 다음과 같습니다

I am in URDFIL   1  -16700 -2.3857285E-03 
I am in UFIELD   2  -16700 -1155769886 

그래서 krot의 값이 손실됩니다. 모든 조언을 가장 환영합니다.

주앙

해결 :

module shared_var 
    implicit none 
    real*8 kmom, krot 
    save 
end module shared_var 

그리고 각 서브 루틴

는 :

use shared_var 
+2

'common' 대신'module'을 사용하여 _one_ 선언 만하면됩니다. – ja72

+0

네, 제안 해 주셔서 감사합니다! – jpcgandre

답변

3

당신은 두 번째 루틴에서 knom의 선언, krot을 포함나요? 아마 당신은 암묵적인 타이핑을하고 있고 krot은 정수로 출력되고있을 것입니다. 그리고 당신은 오타가 있습니다 : knom 대 kmom. 이것이 kmom이 정수인데, knom이 실제이므로 암시적인 형식 지정은 정수로 출력되는 이유입니다. 암시 적 타이핑이 유효한 경우 이러한 변수는 "k"로 시작하므로 정수가됩니다. 레거시 코드에서 제거하기에는 너무 많은 작업이 아니라면 내 암시 적 타이핑을 사용하지 않는 것이 좋습니다. 변수를 입력하거나 변수 이름에 오타를 잊어 버리면 컴파일러에서 경고 할 수 있도록 "암시 적 없음"을 사용하는 것이 좋습니다. 대부분의 컴파일러에는 "암시 적 none"과 동일한 옵션이 있습니다.

+0

맞습니다. 문제가 해결되었습니다. – jpcgandre

관련 문제