主题: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语句怎么会出现错误呢?百思不得其解,望指点!
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语句怎么会出现错误呢?百思不得其解,望指点!