错误:Fortran中的两个主程序

时间:2010-07-08 16:48:43

标签: fortran

我正在尝试编写一个带有函数的程序,该函数返回一个矩形,在对角线上有一个随机数,在子对角线上是1,在其他地方都是0。所以,我写了这个函数:

    real function am1d
    do i=1,L
        do j=1,L
            if (i.eq.j) then
                am1d(i,j)=rand()*w-w/2.
            elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
                am1d(i,j)=1
            else am1d(i,j)=0
        enddo
    enddo
end function am1d

并试图从这里调用它(在相同的源文件中,在函数上方)

    program make3d
    integer, parameter :: L = 20
    real, parameter    :: w = 0.5
    real :: x


    !x=rand(1234)   ! seed random manually
    x=rand(itime)   ! seed random from current local time
    print *,am1d()(:)


end program make3d

但是尝试编译它会引发错误:

   $ f95 make3d.f
make3d.f:18.21:

       print *,am1d()(:)                                                
                     1
Error: Syntax error in PRINT statement at (1)
make3d.f:7.72:

      program make3d                                                    
                                                                        1
make3d.f:24.72:

      real function am1d                                                
                                                                        2
Error: Two main PROGRAMs at (1) and (2)

这是什么意思?我不认为某个功能可能是一个程序?我之前在endprogram语句下面有一些小的逻辑函数,没有任何问题。

2 个答案:

答案 0 :(得分:2)

如果你想让函数am1d返回一个数组,你需要声明它。还有其他一些语法错误。编译器感到困惑....你忘记了“包含”语句......如果没有它或模块,编译器就不会“知道”如何处理另一个程序,并可能试图将其解释为第二个主程序。

尝试:

program make3d
    integer, parameter :: L = 20
    real, parameter    :: w = 0.5
    real :: x

    x=rand(1234)   ! seed random manually
    !x=rand(itime)   ! seed random from current local time
    write (*, *) am1d()

stop

contains

function am1d ()
real, dimension (L,L) :: am1d
    integer i, j
    do i=1,L
        do j=1,L
            if (i.eq.j) then
                am1d(i,j)=rand()*w-w/2.
            elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
                am1d(i,j)=1
            else 
               am1d(i,j)=0
            end if
        enddo
    enddo
end function am1d

end program make3d

或将例程放在一个模块中,我认为它提供了一个更清晰,更清晰的界面(使变量通信显式化) - 然后你需要在主程序中“使用”模块并传递w和L作为参数:

module a_mod

contains

function am1d (w,L)
real, intent (in) :: w
integer, intent (in) :: L
real, dimension (L,L) :: am1d

.....
end function am1d


end module a_mod

答案 1 :(得分:-2)

我遇到了同样的问题。它似乎是相同的答案。你把“END”放在标签的6个字符中。如果你只是将你的END 6字符移动得更远,它可能是魔法......