主程序:
PROGRAM ap8ae8
real L_FROMFILE_Start,L_FROMFILE_End, L_FROMFILE_Gap,
1BB0_FROMFILE_Start,BB0_FROMFILE_End,BB0_FROMFILE_Gap,
1xlatStart,xlatEnd,xlatGap,xlongStart,xlongEnd,xlongGap,
1yearStart,yearEnd,yearGap,heightStart,
1heightEnd,heightGap, E1, E2
integer coordType,MODEL, FLUXTYPE
CHARACTER, dimension(*),intent(in):: OutputFileName
INTEGER :: lenFNM
Integer::i
Character,dimension(100)::crg
i=0
DO
CALL get_command_argument(i,crg)
IF(LEN_TRIM(crg)==0)EXIT
WRITE(*,*)i,crg
IF(i==1) THEN
OutputFileName=crg
ELSE IF(i==2) THEN
Read(crg,*)lenOfOutputFileName
ELSE IF(i==3) THEN
Read(crg,*)coordType
ELSE IF(i==4) THEN
Read(crg,*)L_FROMFILE_Start
ELSE IF(i==5) THEN
Read(crg,*)L_FROMFILE_End
ELSE IF(i==6) THEN
Read(crg,*)L_FROMFILE_Gap
ELSE IF(i==7) THEN
Read(crg,*)BB0_FROMFILE_Start
ELSE IF(i==8) THEN
Read(crg,*)BB0_FROMFILE_End
ELSE IF(i==9) THEN
Read(crg,*)BB0_FROMFILE_Gap
ELSE IF(i==10) THEN
Read(crg,*)xlatStart
ELSE IF(i==11) THEN
Read(crg,*)xlatEnd
ELSE IF(i==12) THEN
Read(crg,*)xlatGap
ELSE IF(i==13) THEN
Read(crg,*)xlongStart
ELSE IF(i==14) THEN
Read(crg,*)xlongEnd
ELSE IF(i==15) THEN
Read(crg,*)xlongGap
ELSE IF(i==16) THEN
Read(crg,*)yearStart
ELSE IF(i==17) THEN
Read(crg,*)yearEnd
ELSE IF(i==18) THEN
Read(crg,*)yearGap
ELSE IF(i==19) THEN
Read(crg,*)heightStart
ELSE IF(i==20) THEN
Read(crg,*)heightEnd
ELSE IF(i==21) THEN
Read(crg,*)heightGap
ELSE IF(i==22) THEN
Read(crg,*)MODEL
ELSE IF(i==23) THEN
Read(crg,*)FLUXTYPE
ELSE IF(i==24) THEN
Read(crg,*)E1
ELSE
Read(crg,*)E2
END IF
i=i+1
END DO
CHARACTER(len=lenOfOutputFileName):: FNM
do i=1,lenOfOutputFileName
FNM(i:i)=OutputFileName(i)
end do
call ap8ae8main (OutputFileName,lenOfOutputFileName,coordType,
1L_FROMFILE_Start,L_FROMFILE_End, L_FROMFILE_Gap,
1BB0_FROMFILE_Start,BB0_FROMFILE_End,BB0_FROMFILE_Gap,xlatStart,
1xlatEnd,xlatGap,xlongStart,xlongEnd,xlongGap,yearStart,yearEnd,
1yearGap,heightStart,heightEnd,heightGap, MODEL, FLUXTYPE, E1, E2)
END
注意:fortran中必须对变量进行声明,而lenOfOutputFileName变量用的其实是隐式声明,即默认i-n是整型
error #6850: This attribute specification is not valid in the main scoping unit. [INTENT]
错误分析:因为intent(in)/intent(out)是表示子程序虚变量属性,而本文是主程序,去掉该属性即可
error #6236: A specification statement cannot appear in the executable section.
错误分析:声明语句不能出现在执行语句部分,将该语句挪到声明部分即可
error #6364: The upper bound shall not be omitted in the last dimension of a reference to an assumed size array. [OUTPUTFILENAME]
错误分析:outputfilename的上边界不应该删除,意思是必须指出来。即针对CHARACTER, dimension(*):: OutputFileName语句。但是在子程序里面此种声明对于编译器是能通过的,只是主程序里面却不能通过。可以将CHARACTER, dimension(*):: OutputFileName改成CHARACTER, dimension(100):: OutputFileName
error #6364: The upper bound shall not be omitted in the last dimension of a reference to an assumed size array. [CRG]
错误分析:与上面一样,主程序里面dimension不能是默认,必须指出来
error #6360: A scalar-valued argument is required in this context. [GET_COMMAND_ARGUMENT]
错误分析:该报错是针对 CALL get_command_argument(i,crg)
error#6512: A scalar-valued expression is required in this context.
错误分析:该报错是针对IF(LEN_TRIM(crg)==0)EXIT
造成上面报错的原因是crg声明的错误引起的:
Character,dimension(100)::crg
改为Character(100)::crg
error #6219: This variable, used in a specification expression, must be a dummy argument, a COMMON block object, or an object accessible through host or use association. [LENOFOUTPUTFILENAME]
error #6591: An automatic object is invalid in a main program. [FNM]
错误分析:以上两个错误是针对CHARACTER(len=lenOfOutputFileName):: FNM,报错提示主程序里面FNM的长度设置为自动的是无效的,改成确定的即可leofoutputfilename只能作为虚参数,因为它是不确定的,而虚参数是子程序所用的,所以此处不能用
改成CHARACTER(100):: FNM即可
完成的正确代码如下:
PROGRAM ap8ae8
real L_FROMFILE_Start,L_FROMFILE_End, L_FROMFILE_Gap,
1BB0_FROMFILE_Start,BB0_FROMFILE_End,BB0_FROMFILE_Gap,
1xlatStart,xlatEnd,xlatGap,xlongStart,xlongEnd,xlongGap,
1yearStart,yearEnd,yearGap,heightStart,
1heightEnd,heightGap, E1, E2
integer coordType,MODEL, FLUXTYPE
CHARACTER, dimension(100):: OutputFileName
INTEGER :: lenFNM
CHARACTER(100):: FNM
Integer::i
Character(100)::crg
i=0
DO
CALL get_command_argument(i,crg)
IF(LEN_TRIM(crg)==0)EXIT
WRITE(*,*)i,crg
IF(i==1) THEN
OutputFileName=crg
ELSE IF(i==2) THEN
Read(crg,*)lenOfOutputFileName
ELSE IF(i==3) THEN
Read(crg,*)coordType
ELSE IF(i==4) THEN
Read(crg,*)L_FROMFILE_Start
ELSE IF(i==5) THEN
Read(crg,*)L_FROMFILE_End
ELSE IF(i==6) THEN
Read(crg,*)L_FROMFILE_Gap
ELSE IF(i==7) THEN
Read(crg,*)BB0_FROMFILE_Start
ELSE IF(i==8) THEN
Read(crg,*)BB0_FROMFILE_End
ELSE IF(i==9) THEN
Read(crg,*)BB0_FROMFILE_Gap
ELSE IF(i==10) THEN
Read(crg,*)xlatStart
ELSE IF(i==11) THEN
Read(crg,*)xlatEnd
ELSE IF(i==12) THEN
Read(crg,*)xlatGap
ELSE IF(i==13) THEN
Read(crg,*)xlongStart
ELSE IF(i==14) THEN
Read(crg,*)xlongEnd
ELSE IF(i==15) THEN
Read(crg,*)xlongGap
ELSE IF(i==16) THEN
Read(crg,*)yearStart
ELSE IF(i==17) THEN
Read(crg,*)yearEnd
ELSE IF(i==18) THEN
Read(crg,*)yearGap
ELSE IF(i==19) THEN
Read(crg,*)heightStart
ELSE IF(i==20) THEN
Read(crg,*)heightEnd
ELSE IF(i==21) THEN
Read(crg,*)heightGap
ELSE IF(i==22) THEN
Read(crg,*)MODEL
ELSE IF(i==23) THEN
Read(crg,*)FLUXTYPE
ELSE IF(i==24) THEN
Read(crg,*)E1
ELSE
Read(crg,*)E2
END IF
i=i+1
END DO
do i=1,lenOfOutputFileName
FNM(i:i)=OutputFileName(i)
end do
call ap8ae8main (OutputFileName,lenOfOutputFileName,coordType,
1L_FROMFILE_Start,L_FROMFILE_End, L_FROMFILE_Gap,
1BB0_FROMFILE_Start,BB0_FROMFILE_End,BB0_FROMFILE_Gap,xlatStart,
1xlatEnd,xlatGap,xlongStart,xlongEnd,xlongGap,yearStart,yearEnd,
1yearGap,heightStart,heightEnd,heightGap, MODEL, FLUXTYPE, E1, E2)
END