2

我一直在关注关于用 FORTRAN 编写的书籍和 PDF 来编写集成程序。我用 gfortran 编译代码并得到以下错误的几个副本。

1)Unexpected data declaration statement at (1)
2)Unterminated character constant beginning at (1)
3)Unclassifiable statement at (1)
4)Unexpected STATEMENT FUNCTION statement at (1)
5)Expecting END PROGRAM statement at (1)
6)Syntax error in data declaration at (1)
7)Statement function at (1) is recursive
8)Unexpected IMPLICIT NONE statement at (1)

我不知道他们真正的意思或如何解决它们,谷歌搜索已被证明是无效的,而本网站上的其他主题是关于其他错误的。对于错误 5)我像在 C++ 中一样放入 Program main 和 end program main 但仍然得到相同的结果。错误 7) 没有意义,我正在尝试在程序中进行递归。错误 8) 我读到了隐式没有是为了防止不必要的减速。

我会发布代码本身,但我对编译错误更感兴趣,因为我仍然需要微调数组数据处理,但在我让它工作之前我不能这样做。

         Program main
  implicit none      
  real, dimension(:,:), allocatable :: m, oldm
  real a
  integer io, nn
  character(30) :: filename
  real, dimension(:,:), allocatable :: alt, temp, nue, oxy
  integer locationa, locationt, locationn, locationo, i
  integer nend
  real dz, z, integral
  real alti, tempi, nuei, oxyi
  integer y, j

  allocate( m(0, 0) ) ! size zero to start with?

  nn = 0
  j = 0

   write(*,*) 'Enter input file name: '

   read(*,*) filename

   open( 1, file = filename )



  do !reading in data file

   read(1, *, iostat = io) a

   if (io < 0 ) exit

   nn = nn + 1

   allocate( oldm( size(m), size(m) ) )

   oldm = m 

   deallocate( m )

   allocate( m(nn, nn) )

   m = oldm

   m(nn, nn) = a ! The nnth value of m

   deallocate( oldm )

  enddo



  ! Decompose matrix array m into column arrays [1,n]

  write(*,*) 'Enter Column Number for Altitude'
  read(*,*) locationa
  write(*,*) 'Enter Column Number for Temperature'
  read(*,*) locationt
  write(*,*) 'Enter Column Number for Nuetral Density'
  read(*,*) locationn 
  write(*,*) 'Enter Column Number for Oxygen density'
  read(*,*) locationo

  nend = size(m, locationa) !length of column #locationa

  do i = 1, nend

   alt(i, 1) = m(i, locationa)

   temp(i, 1) = log(m(i, locationt))

   nue(i, 1) = log(m(i, locationn))

   oxy(i, 1) = log(m(i, locationo))

  enddo



  ! Interpolate Column arrays, Constant X value will be array ALT with the 3 other arrays

  !real dz = size(alt)/100, z, integral = 0
  !real alti, tempi, nuei, oxyi
  !integer y, j = 0
  dz = size(alt)/100


  do z = 1, 100, dz
  y = z !with chopped rounding alt(y) will always be lowest integer for smooth transition.
  alti = alt(y, 1) + j*dz ! the addition of j*dz's allow for all values not in the array between two points of the array. 

   tempi = exp(linear_interpolation(alt, temp, size(alt), alti))

   nuei = exp(linear_interpolation(alt, nue, size(alt), alti))

   oxyi = exp(linear_interpolation(alt, oxy, size(alt), alti))
   j = j + 1



   !Integration

   integral = integral + tempi*nuei*oxyi*dz 

  enddo


  end program main


  !Functions

  real function linear_interpolation(x, y, n, x0)

   implicit none

   integer :: n, i, k

   real :: x(n), y(n), x0, y0

   k = 0


  do i = 1, n-1

   if ((x0 >= x(i)) .and. (x0 <= x(i+1))) then  

    k = i ! k is the index where: x(k) <= x <= x(k+1)
    exit ! exit loop

   end if

  enddo


  if (k > 0) then  ! compute the interpolated value for a point not in the array

   y0 = y(k) + (y(k+1)-y(k))/(x(k+1)-x(k))*(x0-x(k))

  else

   write(*,*)'Error computing the interpolation !!!'

   write(*,*) 'x0 =',x0, ' is out of range <', x(1),',',x(n),'>'

  end if

  ! return value

     linear_interpolation = y0

  end function linear_interpolation

我可以提供对确切错误的更详细描述,我希望错误名称就足够了,因为每种类型都有一些。

4

1 回答 1

0

我想我可以在您的代码示例中发现一些严重的错误。语法错误是exp(...语句中的括号不平衡。它们应该是这样的:

tempi = exp(linear_interpolation(alt, temp, size(alt), alti) ) ! <- extra ")"
nuei = exp(linear_interpolation(alt, nue, size(alt), alti) )
oxyi = exp(linear_interpolation(alt, oxy, size(alt), alti) )

正是这样的事情会产生一长串令人困惑的错误,就像你得到的那样;因此,Dave 和 Jonathan 给出的建议不能被重复多次。

另一个错误(“不可分类声明”)适用于您的循环:

do(i=1, nend)
! ...
do(z=1, 100, dz)
! ...

这些应该写不带括号。

“数据声明错误”源于您尝试声明和初始化多个变量,例如

real dz = size(alt)/100, z, integral = 0

除了在代码中定位不正确(如前所述)外,这只能使用双冒号分隔符来完成:

real :: dz = size(alt)/100, z, integral = 0

我个人建议总是写这样的声明。save但是必须注意,像这样初始化变量具有隐式赋予它们属性的副作用。这在主程序中没有影响,但知道这一点很重要;您可以通过将初始化放在单独的行上来避免它。

于 2012-11-14T15:56:25.690 回答