Написах тази програма, за да тествам друг код, тя се компилира добре, но по време на изпълнение получавам този вид грешки:
Fortran runtime error: Index '645778864' of dimension 1 of array 'tstar' above upper bound of 24
моят код приема като вход файл с данни (6 колони и 24 реда, съответстващи на различни часове от деня), чете ги и ги използва в подпрограмата "профил", за да извлече нови параметри (u и tp). Извиках броя на елементите (24) на векторите, съответстващи на 6-те колони, взети като входове, и не разбирам защо има тези грешки.
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 колони, първата от цели числа (часове от деня), а другата съответства на действителните количества, които се четат от реда:
read(60,*) ih,ustar,tk,(dt(i),i=1,2),Ho
Кодът е написан на Fortran90 и аз използвам gfortran за компилиране. Не съм експерт по Fortran, така че ви моля да не използвате термини, които са твърде специфични.
добре, присвоих "ред" като аргумент на подпрограмата, но сега ми дава грешка като:
At line 29 of file test.f90 (unit = 60, file = 'inputver.dat')
Fortran runtime error: End of file
защо ми дава тази грешка?