2014-11-17 1 views
1

나는 그것을 잘 컴파일, 다른 코드를 테스트하려면이 프로그램을 작성하지만, 런타임에 나는 오류 이런 종류의가 나타납니다포트란 런타임 오류 : 인덱스 '645778864'상한 위의 배열 'tstar'의 차원 1의 24

Fortran runtime error: Index '645778864' of dimension 1 of array 'tstar' above upper bound of 24 

내 코드는 데이터 파일 (하루 중 다른 시간대에 해당하는 6 개의 열과 24 개의 행)을 입력으로 받아이를 서브 루틴 "프로필"에서 사용하여 새로운 매개 변수 (u 및 tp)를 추출합니다. 필자는 입력으로 취한 6 개의 열에 해당하는 벡터의 요소 수 (24)를 호출했으며 이러한 오류가있는 이유를 이해하지 못합니다.

read(60,*) ih,ustar,tk,(dt(i),i=1,2),Ho 

코드는 :

program test 
implicit none 

character(len=12) filein,fileout 
integer :: row,ih,i 
real :: k = 0.4 
real :: z0 = 0.0012 
real, dimension(6) :: z=(/0.5,1.,2.,4.,8.,16./) 
real, dimension(6) :: u 
real, dimension(2) :: teta,tp 
real, dimension(2) :: dt 
real, dimension(24) :: L,tstar,Ho,ustar,tk 
real :: g = 9.81 

write(*,'(2x,''File di input .......''/)') 
read(*,'(a12)') filein 
write(*,'(2x,''File di output........''/)') 
read(*,'(a12)') fileout 


open(unit=60,File=filein) 
open(unit=80,File=fileout) 

write(80,*) 

    do row = 1,24  
    read(60,*) ih,ustar,tk,(dt(i),i=1,2),Ho 

    teta(1) = dt(1) + tk(row) 
    teta(2) = (dt(2)-dt(1)) + teta(1) 

    call profile(ustar,Ho,u,teta,tp) 
    write(80,*) u,tp 

enddo 

close(60) 
close(80) 


end program test 

subroutine profile(ustar,Ho,u,teta,tp) 
implicit none 
integer :: i,j,row 
integer :: N = 6 
real, dimension(24), intent(in) :: ustar,Ho 
real, dimension(24) :: tstar,L,tk 
real, dimension(6),intent(out) :: u 
real, dimension(6) :: z=(/0.5,1.,2.,4.,8.,16./) 
real, dimension(2),intent(out) :: tp 
real, dimension(2) :: teta 
real :: k = 0.4 
real :: z0 = 0.0012 
real :: g = 9.81 

tstar = 0. 
L = 0. 

tstar(row) = -(Ho(row)/(1200.*ustar(row))) 
L(row) = (tk(row)*ustar(row))/(k*g*tstar(row)) 

! convective situation 
do i=1,6 
    u(i) = (ustar(row)/k)*(alog(z(i)/z0) +1. - (1. - (16.*(z(i)/L(row))))**0.25) 
    if(i.le.2) then 
    tp(i) = teta(i) + (tstar(row)/k)*(alog(z(i+2)) - (2.*(alog(0.5 + (0.5*(sqrt(abs(1.-(16.*(z(i+2)/L(row))))))))))) 
    endif 

enddo 


end 

입력 파일은 6 개 컬럼, 정수 (하루의 시간) 제, 다른 로우로부터 판독 된 실제 양에 대응 이루어져 Fortran90으로 작성되었으며 gfortran을 사용하여 컴파일합니다. 나는 Fortran 전문가가 아니므로 너무 구체적 인 용어를 사용하지 말 것을 요청합니다.

At line 29 of file test.f90 (unit = 60, file = 'inputver.dat') 
Fortran runtime error: End of file 

이 왜 나에게이 오류를 주는가 : 나는 서브 루틴의 인수로 "행"을 할당하지만 지금은 같이 나에게 오류를 제공

확인?

+0

항상 태그 [tag : fortran]을 사용하고 질문이 구체적이라는 것을 구별하기 위해 필요한 경우에만 버전을 추가하십시오. 예를 들어, Fortran 2008은 사용할 수없고 Fortran 90 만 사용할 수 있습니다. –

답변

4

row을 설정 한 적이 없으므로 여기에 임의의 값인 645778864이 포함되어 있습니다. 귀하의 코드에서 나는 tstar이 길이가 24이므로 오류라고 읽었습니다. 예 : row 귀하의 서브 루틴에 대한 가짜 인수로.