lveZ 发表于 2020-7-10 22:26:21

如何编写需要输入参数的exe

各位大神,请问有谁知道怎么编写需要输入参数的exe呢,一般program都是不用输入参数的,但是要使调用EXE的时候输入一个参数该怎么办呢?

chiangtp 发表于 2020-7-10 23:20:06

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 .    '                     
    WRITE(*,'(A)') '            -n <n>   set number of worms, in the range .'                     
    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                                                                                          請參考:

lveZ 发表于 2020-7-11 12:02:05

chiangtp 发表于 2020-7-10 23:20
PROGRAM test                                                               ...

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

vvt 发表于 2020-7-11 12:58:35

所有的命令行参数,都必须是 character 字符串类型。
如果你需要其他类型,只能通过再次转换获得。

lveZ 发表于 2020-7-11 13:05:07

哦哦,太感谢了!!!

lveZ 发表于 2020-7-11 13:06:03

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

太感谢了

moonglaive 发表于 2021-2-7 14:54:38

这个帖子很不错,输入参数的代码并不多见,学习一下
页: [1]
查看完整版本: 如何编写需要输入参数的exe