错误:数组引用中的排名不匹配和警告:实数组索引

时间:2016-09-19 08:42:37

标签: arrays fortran subroutine

我在Fortran中编写了2个程序,每个程序用于对某些参数进行一些计算。 在我加入他们之后,我遇到了一些错误。由于我缺乏Fortran的经验,我无法理解这些错误的原因。

以下是错误;

    CC2=CUBEROOT(NN,wq)
                 1
Warning: Extension: REAL array index at (1)
growthrate_vs_Il2.f90:46.20:

    CC2=CUBEROOT(NN,wq)
                    1
Warning: Extension: REAL array index at (1)
growthrate_vs_Il2.f90:46.16:

    CC2=CUBEROOT(NN,wq)
                1
Error: Rank mismatch in array reference at (1) (2/1)
growthrate_vs_Il2.f90:48.27:

    call fsub(CC2,Delta0,b,z1,z2,z3)
                           1
Warning: Type mismatch in argument 'f1' at (1); passed COMPLEX(4) to COMPLEX(8)

代码:

program main
implicit none
integer::i,j
real*8,dimension(1000)::Il2,Il3,a0,omega,nominator,dominator,ff,lamda,kk,b,c,d
real*8,dimension(1000)::growth_rate,cb1,cb2   
real*8,dimension(1000)::Il,Delta0, Delta1,m,CC,CC2,BB,mm,NN,wq
real*8::sumo,sumo2,a
real*8,parameter::mass_ratio=0.00870
complex*8,dimension(1000)::z1,z2,z3,f1,f2,f3
real*8,dimension(1000)::cuberoot
      Il=0.0
      Il2=0.0
      sumo=0.0
      a=1.0
do i=1,1000

      Il(i)=sumo+0.1

      omega(i) = 2.359*Il(i)
      nominator=2-omega(i)
      dominator=1-omega(i)
      ff(i)=nominator(i)/dominator(i)
      lamda(i)=sqrt(ff(i))
      kk(i)=1/lamda(i)

      Il2(i)=sumo2+0.001
      a0(i) = 0.68*Il2(i)


      b(i)=-(2.0+omega(i))
      cb1(i)=2.0*omega(i)
      cb2(i)=2.0*kk(i)*a0(i)*mass_ratio
      c(i)=(1.0d0+cb1(i)-cb2(i))
      d(i)=-(omega(i)+cc2(i))
      sumo=Il(i)
      sumo2=Il2(i)
end do

      Delta0= (b**2)-(3*a*c)
      Delta1= (2*(b**3))-(9*a*b*c)+(27*(a**2)*d)
      m=(Delta0)**3
      BB=(Delta1)**2
      mm= BB-(4*m)
      CC=sqrt(mm)
      NN=(Delta1+CC)/2
      CC2=CUBEROOT(NN,wq)

call fsub(CC2,Delta0,b,z1,z2,z3)

      print*,'Delta0',Delta0,'Delta1',Delta1,'mm',mm,'CC2',CC2

      print *, "Omega1_square= ",z1
      print *, "Omega2_square= ",z2
      print *, "Omega3_square= ",z3

end program

子程序和功能如下:

subroutine fsub(x,t,s,f1,f2,f3)
implicit none
integer::k
real(kind=8), intent(in),dimension(1000) :: x,t,s
complex(kind=8), intent(out),dimension(1000) :: f1,f2,f3
complex(kind=8),dimension(1000)::z1,z2,z3

    z1=(1,0)
       f1=(-1/3)*(s+(z1*x)+(t/(z1*x)))
    z2=(-0.5,0.866)
       f2=(-1/3)*(s+(z2*x)+(t/(z2*x)))
    z3=(-0.5,-0.866)
       f3=(-1/3)*(s+(z3*x)+(t/(z3*x)))
end subroutine fsub

real (kind=8)   FUNCTION CUBEROOT (XX,cube_root)

  IMPLICIT NONE

  real(kind=8), INTENT(IN),dimension(1000) :: XX
  Real*8,dimension(1000):: log_x
  real(kind=8),Intent(out),dimension(1000) :: cube_root

       log_x=LOG(XX)
       cube_root=EXP(log_x/3.0)

  RETURN
END FUNCTION CUBEROOT

1 个答案:

答案 0 :(得分:1)

只是立即导致编译器报告错误的点的集合。我并不是说在修复这些程序后,程序将编译或运行正确。

  1. kind=8*8不一样。你很幸运他们为这个编译器的real类型提供相同的东西,但它们不适用于复杂类型。请注意,complex*8是单精度,complex(kind=8)是编译器的双精度。
  2. 但请注意,除*8之外的其他类型的character符号不是Fortran。它不是也从未成为任何Fortran标准的一部分。

    1. 在主代码中,您将函数cuberoot定义为

      real*8,dimension(1000)::cuberoot
      
    2. 首先,你的函数不返回一个数组(但也许它应该),所以它是错误的。其次,无论如何都不能以这种方式声明数组返回函数。将您的程序放入模块中,而不是如上所述声明类型。

      1. 您的函数CUBEROOT错误。它没有返回任何东西。也许你想要像

        这样的东西
         FUNCTION CUBEROOT (XX)
           real(kind=something_better_than_8),dimension(1000) :: CUBEROOT
           real(kind=something_better_than_8), INTENT(IN),dimension(1000) :: XX
        
           cuberoot = EXP(LOG(XX)/3) !or just XX**(-1._something_better_than_8/3) if that is what you wanted
         END FUNCTION CUBEROOT
        
      2. 必须放在包含implicit none的模块中。