回 帖 发 新 帖 刷新版面

主题:linux下的Fortran编程

lihong@linux:~/li/pro> ifort main.F main
fortcom: Error: ./rand_gen.F, line 1: This statement is positioned incorrectly and/or has syntax errors.
        subroutine rand_gen(sta_num,rand_nu)
--------^
fortcom: Error: ./rand_gen.F, line 42: A RETURN statement is invalid in the main program.
        return
--------^
fortcom: Error: ./rand_gen.F, line 43: This is an invalid statement; an END [PROGRAM]  statement is required.
        end subroutine 
--------^
fortcom: Error: ./rand_gen.F, line 3: A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association   [STA_NUM]
        integer :: sta_num,rand_no,rand_nu
-------------------^
fortcom: Error: ./rand_gen.F, line 3: An automatic object is invalid in a main program.   [RAND_NU]
        integer :: sta_num,rand_no,rand_nu
-----------------------------------^
fortcom: Warning: main.F, line 14: Program may contain only one main entry routine
        open (1,file='/data/lihong/li/gen_data/sta.csv',status='old')
--------^
fortcom: Warning: main.F, line 15: Program may contain only one main entry routine
        print *,'open sta'
--------^
fortcom: Warning: main.F, line 16: Program may contain only one main entry routine
        read (1,*)
--------^
fortcom: Warning: main.F, line 17: Program may contain only one main entry routine
        print *,'1st line'
--------^
fortcom: Warning: main.F, line 18: Program may contain only one main entry routine
        do i=1,sta_num,1
--------^
fortcom: Warning: main.F, line 23: Program may contain only one main entry routine
        close(1)
--------^
fortcom: Warning: main.F, line 24: Program may contain only one main entry routine
        call rand_gen(sta_num,rand_nu)
--------^
fortcom: Warning: main.F, line 25: Program may contain only one main entry routine
        print *,'call rand_gen'
--------^
fortcom: Warning: main.F, line 26: Program may contain only one main entry routine
        do i=1,group,1
--------^
fortcom: Warning: main.F, line 38: Program may contain only one main entry routine
        print *,'ok'
--------^
fortcom: Warning: main.F, line 39: Program may contain only one main entry routine
        end program 
--------^
出现这样的错误,在此附上代码,

        program main
        include 'rand_gen.F'
        include 'divide_sta.F'
        include 'TIDW_CHINA_top.F'
        implicit none
        integer :: sta_num,group,est,sta,i
        parameter (sta_num=755,group=5,est=sta_num/group,sta=sta_num-est)
        integer :: rand_nu(sta_num)
        integer :: id(sta_num),sta_id(sta),est_id(est)
        real :: x(sta_num),y(sta_num),elev(sta_num),oc(sta_num),
     *          est_x(est),est_y(est),est_elev(est),est_oc(est),
     *          sta_x(sta),sta_y(sta),sta_elev(sta),sta_oc(sta)

        open (1,file='/data/lihong/li/gen_data/sta.csv',status='old')
        print *,'open sta'
        read (1,*)
        print *,'1st line'
        do i=1,sta_num,1
                read(1,*) id(i),x(i),y(i),elev(i),oc(i)
                print *,i,id(i),x(i),y(i),elev(i),oc(i)
                pause
        end do
        close(1)
        call rand_gen(sta_num,rand_nu)
        print *,'call rand_gen'
        do i=1,group,1
                print *,i,'st group'
                call divide_sta(i,est,sta,rand_nu,
     *          id,x,y,elev,oc,
     *        sta_id,sta_x,sta_y,sta_elev,sta_oc,
     *          est_id,est_x,est_y,est_elev,est_oc)
                print *,'call divide_sta'
                call TIDW_CHINA_top(est,sta,
     *          sta_id,sta_x,sta_y,sta_elev,sta_oc,
     *          est_id,est_x,est_y,est_elev,est_oc)
                print *,'call TIDW_CHINA_top'
        end do
        print *,'ok'
        end program




        subroutine rand_gen(sta_num,rand_nu)
        implicit none
        integer :: sta_num,rand_no,rand_nu
        dimension ::rand_nu(sta_num)
        real :: rand
      integer :: i,j
        logical :: neq
c       call surand(rand)
        call rand_seed(rand)
        call random(rand)
        rand_no=int(rand*(sta_num-1)+1)
        rand_nu(1)=rand_no
        print *,1,rand_no;pause
        do i=2,sta_num-1,1
100             call random(rand)
                rand_no=int(rand*(sta_num-1)+1)
                print*, i,rand,rand_no;pause
                neq=.false.
                do j=1,i-1,1
                        if (rand_no.eq.rand_nu(j)) then
                                goto 100
                        else
                                neq=.true.
                        end if
                end do
                if (neq.eq..true.)      rand_nu(i)=rand_no
        print *,i,rand_nu(i);pause
        end do

        do j=1,sta_num,1
                neq=.false.
                do i=1,sta_num-1,1
                        if (j.eq.rand_nu(i)) then
                                exit
                        else
                                neq=.true.
                        end if
                end do
                if (neq.eq..true.) rand_nu(sta_num)=j
        end do

        return
        end subroutine
按照错误提示,rand_gen也是一个主程序,但是我明明定义的是子程序,最后结束的时候也是end subroutine。而且print,和open file语句怎么会出现错误呢?百思不得其解,望指点!

回复列表 (共1个回复)

沙发


是include的位置放错了,应该放在最后。也就是说include的内容应该插在什么地方,include语句就在什么地方。

我来回复

您尚未登录,请登录后再回复。点此登录或注册