简体   繁体   English

Fortran错误含义

[英]Fortran Error Meanings

I have been following books and PDFs on writing in FORTRAN to write an integration program. 我一直在跟踪有关使用FORTRAN编写的书籍和PDF,以编写集成程序。 I compile the code with gfortran and get several copies of the following errors. 我使用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)

I do not know hat they truly mean or how to fix them, google search has proven null and the other topics on this site we about other errors. 我不知道它们的真正含义或如何解决,Google搜索证明为null,并且我们在本网站上的其他主题涉及其他错误。 for Error 5) i put in Program main and end program main like i might in C++ but still got the same result. 对于错误5)我像在C ++中一样放入Program main和end program main,但仍然得到相同的结果。 Error 7) makes no sense, i am trying for recursion in the program. 错误7)毫无意义,我正在尝试在程序中进行递归。 Error 8) i read implicit none was to prevent unnecessary decelerations. 错误8)我读到隐含的无内容是为了防止不必要的减速。

Ill post the code itself but i am more interested in the compiling errors because i still need to fine tune the array data handling, but i cant do that until i get it working. 糟糕的代码本身,但我对编译错误更感兴趣,因为我仍然需要微调数组数据处理,但是直到我能正常工作时,我才能这样做。

         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

I can provide a more detailed description of the exact errors, i was hoping that the error name would be enough since i have a few of each type. 我可以提供确切错误的更详细描述,我希望错误名称就足够了,因为每种类型我都有一些。

I think I can spot a few serious errors in your code sample. 我想我可以在您的代码示例中发现一些严重的错误。 The syntax error is that you have unbalanced parentheses in the exp(... statements. They should be like this: 语法错误是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) )

It's precisely things like this that can produce long strings of confusing errors like you're getting; 正是这样的事情可能会产生一长串令人困惑的错误,就像您得到的一样。 therefore the advice Dave and Jonathan have given can't be repeated often enough. 因此,戴夫(Dave)和乔纳森(Jonathan)给出的建议不能经常重复。

Another error (the "unclassifiable statement") applies to your loops: 另一个错误(“无法分类的语句”)适用于您的循环:

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

These should be written without parentheses. 这些应写成无括号。

The "data declaration error" stems from your attempt to declare and initialise multiple variables like “数据声明错误”源于您尝试声明和初始化多个变量,例如

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

Along with being positioned incorrectly in the code (as noted), this can only be done with the double colon separator: 除了在代码中的位置不正确(如前所述)外,这只能通过双冒号分隔符完成:

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

I personally recommend always writing declarations like this. 我个人建议始终编写这样的声明。 It must be noted, though, that initialising variables like this has the side effect of implicitly giving them the save attribute. 但是,必须注意的是,像这样的初始化变量具有隐式赋予它们save属性的副作用。 This has no effect in a main program, but is important to know; 这在主程序中没有影响,但重要的是要知道; you can avoid it by putting the initialisations on a separate line. 您可以通过将初始化放在单独的行中来避免这种情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM