2016-11-21 1 views
1

Force 2.0 컴파일러와 편집기를 사용하고 있습니다. 다음 서브 루틴에서 기존 배열 KM(1:M)의 값을 주 프로그램 EIKM(1:M)의 계산에 사용하려하지만 얻은 값은 배열의 값과 일치하지 않습니다. 무엇이 잘못되었으며 무엇을해야합니까?서브 루틴에서 배열 값 호출

PROGRAM GENERATES_EIKM 

    IMPLICIT NONE 

    INTEGER I, M, N 
    PARAMETER (M=65, N=3) 
    REAL EIKM(1:M) 

    REAL ALFA, EPSILON, NU, PI 
    REAL U2RMS, KE, KEFISIENSI, KALI, KALE 
    REAL KM(1:M), LS 

    REAL KMLOW, KMHIGH, DELTAKM 

    KMLOW=100 
    KMHIGH = 10000 
    DELTAKM = (KMHIGH-KMLOW)/(M-1) 

    PI = 3.14 
    ALFA = 1.453 
    EPSILON = 10 
    NU = 7 
    LS = 23 
    KE = ALFA*9*PI/(55*LS) 
    KEFISIENSI = (EPSILON**(1/4))/(NU**(-3/4)) 


    CALL CALLING_THE_VALUE_OF_KM (M) 

    WRITE (*,*) 'CHECKING THE VALUE OF KM AT DATA NUMBER 2 : ', KM(2) 

    DO I=1,M 
    U2RMS = (2/3*KM(I))**2 
    KALI = KM(I)/KE 
    KALE = KM(I)/KEFISIENSI 
    EIKM(I) = ALFA*(U2RMS/KE)*((KALI**4)/((1+KALI**2)**(17/6)))* 
&   EXP(-2*(KALE**2)) 
    WRITE (*,*) 'THE VALUE OF EIKM AT (I) ', I, EIKM(I) 
    END DO 

    PAUSE 
    END 



    SUBROUTINE CALLING_THE_VALUE_OF_KM (M) 

    REAL KM(1:M) 
    INTEGER I 
    REAL KMLOW, KMHIGH, DELTAKM 
    KMLOW=100 
    KMHIGH = 10000 
    DELTAKM = (KMHIGH-KMLOW)/(M-1) 

    WRITE(*,*) 'START OF CALLING_THE_VALUE_OF_KM' 
    DO I=1,M 
    KM(I) = KMLOW + DELTAKM*(I-1) 
    WRITE(*,*) I, KM(I) 
    END DO 
    WRITE(*,*) 'END OF CALLING_THE_VALUE_OF_KM' 
    WRITE(*,*) '--------------------' 

    RETURN 
    END 
+0

프로그램 문과 일치하는'end'을 소스 파일의 끝으로 이동하십시오. 그 자리에 '포함하다'라는 단어를 씁니다. 컴파일러가 찾은 오류를 다시 컴파일하고 수정하십시오. 코드가 구조화되어 있으므로 컴파일러는 서브 루틴에 전달 된 인수가 예상 한 것과 일치하는지 확인할 수 없습니다. –

+0

또한 2016 년 초보자는 Fortran 77을 배우지 않아야합니다. 최신 버전의 언어에 추가 된 많은 유용한 기능이 있으며 40 년 된 버전의 40 년 버전으로 제한하는 것이 의미가 없습니다. 언어. 그렇습니다. 여전히 막대한 기존 코드베이스와의 통합을 위해 포트란 77을 알아야하지만, 아예 쓰지 않아도됩니다. 재미 있어요,하지만 그 시작에 대한 질문을 볼 수 없어요. * Java 2를 배우고 있습니다. * –

+0

누군가 어딘가 사람들 F77을 가르치고있는 것 같습니다. –

답변

1

귀하의 서브 루틴에 IMPLICIT NONE을 넣습니다. 만약 M이 정수로 정의된다면 도움이 될 것입니다. M에 INTENT (IN)을 넣고 컴파일러가 fortran90을 수행하는지 확인할 수도 있습니다. 서브 루틴이 뭔가를 출력한다고 가정하면() 안에 그 서브 루틴이 필요합니다. 당신은 proby ... 원하는 :

F90 :

Subroutine Callingthevalue_of_KM(M, KM) 
IMPLICIT NONE 
INTEGER   , INTENT(IN ) :: M 
REAL, DIMENSION (M), INTENT(INOUT) :: kM 

그 다음 힘 2.0.9+ 해야 컴파일 그리고 그때는 아마 필요가 없습니다 M

Subroutine Callingthevalue_of_KM(KM) 
IMPLICIT NONE 
REAL, DIMENSION (:), INTENT(INOUT) :: kM 
INTEGER       :: M 

M = Size(kM) 
... Or do the loops a DO I = 1, SIZE(kM) 

F77 경우 :

이러한 모든 경우 km는 킬로미터에 대한 참조를 통해 '반환됩니다. 업데이트 값은 k 그 다음 주인이 알 수 있습니다.

kM이 내부와 외부에서 알 수있는 다른 방법은 COMMON이지만이 시점에서 kM을 개념적으로 쉽게 벗어날 수 있다고 생각합니다.

+0

가정용 버전의 경우'(:)'를 추가하는 것보다 더 실질적인 변경 (명시 적 인터페이스 제공)이 필요합니다. – francescalus

+0

@Holmz 작동하지 않습니다. 예를 들어 데이터 번호 2를 호출하는 응답자는 여전히 0.000입니다. 제발 도와주세요! – dhan

+0

서브 루틴을 호출 한 후 이것을 사용해보고 얻은 결과를 확인하십시오. '데이터 갯수 (1 : 5)의 값 확인 :', KM (1 : 5) 서브 루틴 안에서 처리하는 것도 가치가 있습니다. – Holmz

관련 문제