Fortran Coder

查看: 163|回复: 5

[求助] fortran如何编写需要输入参数的exe

[复制链接]

8

帖子

3

主题

0

精华

入门

F 币
44 元
贡献
26 点
发表于 2020-7-10 22:26:21 | 显示全部楼层 |阅读模式
各位大神,请问有谁知道怎么编写需要输入参数的exe呢,一般program都是不用输入参数的,但是要使调用EXE的时候输入一个参数该怎么办呢?
回复

使用道具 举报

111

帖子

8

主题

0

精华

版主

F 币
537 元
贡献
325 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

发表于 2020-7-10 23:20:06 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
PROGRAM test                                                                                              
  IMPLICIT NONE                                                                                           
                                                                                                          
  INTEGER, PARAMETER :: max_length=1024                                                                   
  INTEGER, PARAMETER :: max_number=40                                                                     
                                                                                                          
  ! Options                                                                                               
  CHARACTER(4)  :: field                                                                                  
  INTEGER       :: length                                                                                 
  INTEGER       :: number                                                                                 
  CHARACTER(1)  :: trail                                                                                  
                                                                                                          
  INTEGER       :: iarg, narg, ier                                                                        
  CHARACTER(80) :: copt                                                                                   
                                                                                                          
  !-------------------------------------                                                                  
  ! Options:                                                                                              
  !                                                                                                       
  !  -f      fill screen with copies of 'WORM' at start.                                                  
  !  -l <n>  set worm length                                                                              
  !  -n <n>  set number of worms                                                                          
  !  -t      make worms leave droppings                                                                   
  !-------------------------------------                                                                  
                                                                                                          
  ! Get the number of arguments passed on the command line                                                
  narg = COMMAND_ARGUMENT_COUNT()                                                                         
                                                                                                          
  ! Default setting                                                                                       
  field  = " "        ! fill screen with copies of 'WORM' at start.                                       
  length = 16         ! set worm length                                                                   
  number = 3          ! set number of worms                                                               
  trail  = ' '        ! make worms leave droppings                                                        
                                                                                                          
  ! Parse arguments                                                                                       
  iarg = 1                                                                                                
  DO WHILE( iarg <= narg )                                                                                
     CALL GET_COMMAND_ARGUMENT(iarg, VALUE=copt)                                                          
                                                                                                          
     SELECT CASE( copt )                                                                                  
     CASE('-f', '-F'); field = "WORM"                                                                     
     CASE('-t', '-T'); trail = '.'                                                                        
                                                                                                          
     CASE('-l', '-L')                                                                                     
       iarg = iarg+1                                                                                      
       IF( iarg <= narg ) THEN                                                                            
         CALL GET_COMMAND_ARGUMENT(iarg, VALUE=copt)                                                      
         READ(copt,*,IOSTAT=ier) length                                                                   
         IF( ier /= 0 ) THEN                                                                              
           CALL usage()                                                                                   
           STOP 'Error-1'                                                                                 
         END IF                                                                                           
         IF( length<2 .OR. length>max_length ) THEN                                                       
           WRITE(*,'(A,I0)') "Error: Invalid length of worms - ", length                                  
           CALL usage()                                                                                   
           STOP 'Error-2'                                                                                 
         END IF                                                                                           
       ELSE                                                                                               
         CALL usage()                                                                                     
         STOP 'Error-3'                                                                                   
       END IF                                                                                             
                                                                                                          
     CASE('-n', '-N')                                                                                     
       iarg = iarg+1                                                                                      
       IF( iarg <= narg ) THEN                                                                            
         CALL GET_COMMAND_ARGUMENT(iarg, VALUE=copt)                                                      
         READ(copt,*,IOSTAT=ier) number                                                                   
         IF( ier /= 0 ) THEN                                                                              
           CALL usage()                                                                                   
           STOP 'Error-4'                                                                                 
         END IF                                                                                           
         IF( number<1 .OR. number>max_number ) THEN                                                       
           WRITE(*,'(A,I0)') "Error: Invalid number of worms - ", number                                  
           CALL usage()                                                                                   
           STOP 'Error-5'                                                                                 
         END IF                                                                                           
       ELSE                                                                                               
         CALL usage()                                                                                     
         STOP 'Error-6'                                                                                   
       END IF                                                                                             
                                                                                                          
     CASE DEFAULT                                                                                         
        CALL usage()                                                                                      
        STOP 'Error-7'                                                                                    
     END SELECT                                                                                           
     iarg = iarg+1                                                                                        
  END DO                                                                                                  
                                                                                                          
  !-------------------------------------                                                                  
                                                                                                          
CONTAINS                                                                                                  
                                                                                                          
  SUBROUTINE usage()                                                                                      
    IMPLICIT NONE                                                                                         
                                                                                                          
    CHARACTER(1024) :: string                                                                             
                                                                                                          
    !---------------                                                                                      
                                                                                                          
    CALL GET_COMMAND(string)                                                                              
    WRITE(*,*)                                                                                            
    WRITE(*,'(A)') ' Your commandline: '//TRIM(string)                                                    
    WRITE(*,*)                                                                                            
                                                                                                          
    WRITE(*,'(A)') ' ---------------------------------------------------------------'                     
    WRITE(*,'(A)') '                                                                '                     
    WRITE(*,'(A)') ' Usage:   test [-f] [-l <n>] [-n <n>] [-t]                      '                     
    WRITE(*,'(A)') '                                                                '                     
    WRITE(*,'(A)') '                                                                '                     
    WRITE(*,'(A)') ' Options:                                                       '                     
    WRITE(*,'(A)') '            -f       fill screen with copies of "WORM" at start.'                     
    WRITE(*,'(A)') '            -l <n>   set worm length, in the range [2,1024].    '                     
    WRITE(*,'(A)') '            -n <n>   set number of worms, in the range [1,40].  '                     
    WRITE(*,'(A)') '            -t       make worms leave droppings.                '                     
    WRITE(*,'(A)') '                                                                '                     
    WRITE(*,'(A)') ' Example: test -f -l 20 -n 5 -t                                 '                     
    WRITE(*,'(A)') ' ---------------------------------------------------------------'                     
    WRITE(*,'(A)')                                                                                        
  END SUBROUTINE usage                                                                                    
                                                                                                          
END PROGRAM test                                                                                          
請參考:

8

帖子

3

主题

0

精华

入门

F 币
44 元
贡献
26 点
 楼主| 发表于 2020-7-11 12:02:05 | 显示全部楼层
chiangtp 发表于 2020-7-10 23:20
[mw_shl_code=fortran,true]PROGRAM test                                                               ...

谢谢你,但是我这里出现问题      
  CALL  get_command_argument(2,VALUE=day2)
  CALL  get_command_argument(3,VALUE=step)
  CALL  get_command_argument(1,VALUE=day1)
   
    DO nday=day1,day2,step
当我这样写的时候编译会出现错误The data types of the argument(s) are invalid.   [GET_COMMAND_ARGUMENT],它好像没有把get_command_argument默认为一个函数,这是怎么回事呢

832

帖子

0

主题

0

精华

宗师

F 币
1316 元
贡献
735 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2020-7-11 12:58:35 | 显示全部楼层
所有的命令行参数,都必须是 character 字符串类型。
如果你需要其他类型,只能通过再次转换获得。

8

帖子

3

主题

0

精华

入门

F 币
44 元
贡献
26 点
 楼主| 发表于 2020-7-11 13:05:07 | 显示全部楼层
哦哦,太感谢了!!!

8

帖子

3

主题

0

精华

入门

F 币
44 元
贡献
26 点
 楼主| 发表于 2020-7-11 13:06:03 | 显示全部楼层
vvt 发表于 2020-7-11 12:58
所有的命令行参数,都必须是 character 字符串类型。
如果你需要其他类型,只能通过再次转换获得。 ...

太感谢了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-8-7 00:39

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表