2011-04-13 2 views
1

Fortran 95에서이 프로그램의 출력에는 숫자 대신 별표가 표시됩니다. 또한 실험 #을 의도대로 인쇄 할 수 없습니다. 실험 1, 실험 2, 실험 3 등. 대신 다음과 같이 인쇄됩니다. 실험 1, 실험 1, 실험 1.배열을 사용하여 별표 및 색인을 출력하는 데 도움이 필요합니다.

이 문제를 해결할 수있는 방법에 대한 아이디어가 있습니까? 아래는 내 프로그램 전체입니다.

감사합니다.

PROGRAM numbersgen 
    IMPLICIT NONE 

     !Variable declaration 
     INTEGER, DIMENSION(:,:),ALLOCATABLE::numarray 
     INTEGER, DIMENSION(:),ALLOCATABLE::temparray 
     INTEGER:: numrolls, numexps 
     INTEGER:: i=0, j=0 
     REAL:: avg=0, sdv=0, variance=0, sum=0 
     INTEGER:: k, min, pos, temp 

     ............. 
     ------ 

     REAL, INTENT(IN):: sum 
     REAL, INTENT(IN):: avg, variance, sdv 

     PRINT*, " " 
     PRINT*, "Sum: ",sum 
     PRINT '(1X,A,F5.3)', "Average: ",avg 
     PRINT '(1X,A,F5.3)', "Variance: ",variance 
     PRINT '(1X,A,F5.3)', "Standard Deviation: ",sdv 

     END SUBROUTINE 

END PROGRAM 

답변

5

형식은 0과 9.999 사이의 값이어야합니다. 평균보다 높거나 음수이면 평균값이 표시됩니다. 합리적인 형식 사양이 무엇인지 알아 보려면 임시로 형식을 F15.3으로 변경하여 최소한 값을 볼 수 있습니다.

왜 실험 번호가 증가하지 않는지 알 수 없습니다. 어 오! 서브 루틴에 사용 된 주 프로그램의 i 범위입니까? 로컬 선언이없고 implicit none이 적용되므로 이것이 문제라고 생각하는 경향이 있습니다. 간단한 테스트는 주 프로그램의 i의 이름을 expidx과 같이 완전히 다른 것으로 변경하고 컴파일 오류가 있는지 확인하는 것입니다. (변경이 필요한 네 곳이 있습니다.)

+3

프로그램을 개발할 때 목록 지향 IO를 사용하는 것이 편리 할 수 ​​있습니다. "write (*, *)". 그러면 항목이 출력 필드에 맞는지 여부에 대해 걱정할 필요가 없습니다. 프로그램이 작동하고 있다고 확신하면 출력 형식을 더 좋게 만들기 위해 형식을 사용할 수 있습니다. –

+0

당신은 편집으로 내 대답을 이겼습니다 =) – steabert

+0

전에 'contains'를 보지 못했습니다. 나는 그것이 잘못 쓰여진 주석 또는 게시 해설이라고 생각했습니다. – wallyk

3

서브 루틴을 프로그램의 contains 문 안에 넣으면 프로그램에 선언 된 데이터에 액세스 할 수 있습니다. 따라서 i와 j를 사용하는 서브 루틴은 실제로 프로그램 자체 내에서 값을 변경합니다. 이러지 마!

'적절한 방법'은 서브 루틴을 별도의 프로그램 단위 또는 모듈에 넣고 주 프로그램 내에서 사용하는 것입니다.

+2

또는 프로 시저에서 별도의 루프 변수를 선언하십시오. – eriktous

관련 문제