Грешка при изпълнение на Fortran: Индекс „645778864“ на измерение 1 на масив „tstar“ над горната граница на 24

Написах тази програма, за да тествам друг код, тя се компилира добре, но по време на изпълнение получавам този вид грешки:

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

защо ми дава тази грешка?


person Alessio De Luca    schedule 17.11.2014    source източник
comment
Винаги използвайте етикет fortran и добавяйте версията само когато е необходимо, за да различите, че въпросът ви е конкретен. Например, че не можете да използвате Fortran 2008, а само Fortran 90.   -  person Vladimir F    schedule 17.12.2015


Отговори (1)


Никога не сте задавали row, така че съдържа произволна стойност, във вашия случай 645778864. От вашия код прочетох, че tstar е с дължина 24, оттук и грешката.

Трябва да посочите row напр. като фиктивен аргумент към вашата подпрограма.

person Alexander Vogt    schedule 17.11.2014