Knowing how to handle string variables allows us to process arguments to a program from the command line. You've used programs that take arguments on the command line:
mypc: ape asg01.f90 mypc: f90 asg01.f90
How do programs like ape and f90 get arguments like asg01.f90 from the command line?
In C, command-line arguments are received in the argument variable
argv
in the main program.
cla.c.dbk
In a Fortran program, this is done using the intrinsic subroutine getarg().
Suppose we want to write a program that computes baseexponent, but instead of asking the user to input the base and exponent, it takes them on the command line.
mypc: f90 power.f90 -o power mypc: power 2 10 2 ** 10 = 1024
The getarg() subroutine grabs a command line argument and stores it in a string variable. The first argument after the program name is argument 1, and so on. Argument 0 is the name of the program as it was invoked from the Unix command-line.
character(MAX_INTEGER_DIGITS) :: program_name, & base_string, exponent_string call getarg(0, program_name) call getarg(1, base_string) call getarg(2, exponent_string)
If the argument number given is greater than the actual number of arguments, getarg() simply returns a blank string. We can use this to check whether the correct number of arguments were given. Note that argument 1 will never be missing if argument 2 is present, so we need only check the last argument to ensure that all are there.
if ( exponent_string == '' ) then print *, trim(program_name), ': Usage: power base exponent' stop endif
To convert the strings to integers or reals, we use a read statement, with the string variable as the unit:
integer :: base, exponent read (base_string, *) base read (exponent_string, *) exponent
!----------------------------------------------------------------------- ! Program description: ! Compute a power of command line arguments base and exponent ! ! Arguments: ! First: An integer base ! Second: An integer exponent !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! Modification history: ! Date Name Modification ! 2011-03-25 Jason Bacon Begin !----------------------------------------------------------------------- module constants ! Global Constants integer, parameter :: MAX_INTEGER_DIGITS = 10 end module constants ! Main program body program power use constants ! Constants defined above ! Disable implicit declarations (i-n rule) implicit none ! Variable defintions integer :: base, exponent character(MAX_INTEGER_DIGITS) :: base_string, exponent_string ! First command line argument is the base, second is the exponent call getarg(1, base_string) call getarg(2, exponent_string) ! Make sure user provided both base and exponent if ( exponent_string == '' ) then stop 'Usage: power base exponent' endif ! Convert strings to integers read (base_string, *) base read (exponent_string, *) exponent ! Compute power print *, base, ' ** ', exponent, ' = ', base ** exponent end program
If we do not know how many command line arguments there are, we can use the fact that getarg() returns a blank string for any index higher than the number of arguments.