Function 如何在Fortran中读取函数/子程序中输入参数的不确定值?

Function 如何在Fortran中读取函数/子程序中输入参数的不确定值?,function,input,fortran,subroutine,Function,Input,Fortran,Subroutine,下面的fortran代码将根据用户的输入计算圆或矩形的面积。如果只有一个输入浮点,则它将计算圆的面积;如果有两个,则它将返回矩形的面积。目前,我首先通过用户键入1或2来实现这一点。但是,我想知道,在fortran中是否有直接读取输入参数的方法。请提供你的智慧。我很感激 module MA implicit none interface area module procedure area_circ ! calculate the area of circles module pr

下面的fortran代码将根据用户的输入计算圆或矩形的面积。如果只有一个输入浮点,则它将计算圆的面积;如果有两个,则它将返回矩形的面积。目前,我首先通过用户键入1或2来实现这一点。但是,我想知道,在fortran中是否有直接读取输入参数的方法。请提供你的智慧。我很感激

module MA
  implicit none

interface area
  module procedure area_circ  ! calculate the area of circles
  module procedure area_rec   ! rectangles
end interface

contains
  real function area_circ(a)
  implicit none
  real, intent(in) :: a
  real, parameter :: pi=3.14159
  area_circ = pi*a**2
  write(*,"('Area of circle = ',F6.2)") area_circ
  return
end function area_circ

real function area_rec(a,b)
  implicit none
  real, intent(in) :: a,b
  area_rec=a*b
  write(*,"('Area of rectangle = ',F6.2)") area_rec
  return
end function area_rec

end module MA

program hw1101
  use MA
  implicit none
  real :: a,b,S
  integer :: i

  write(*,*) 'Please type # of parameters: '
  read(*,*) i
  if(i==1) then
    write(*,*) "Please type one parameter: "
    read(*,*) a
    S=area(a)
  else if (i==2) then
    write(*,*) "Please type two paramters: "
    read(*,*) a,b
    S=area(a,b)
  else
    write(*,*) "Other functions under construction..."
  end if

  stop
end program hw1101

最新的Fortran编译器提供了许多用于处理命令行参数的内部例程。您可以使用函数
COMMAND\u ARGUMENT\u COUNT
获取执行程序时提供的数字,然后逐个读取。也许是这样的:

  CHARACTER(len=16) :: arg
  REAL, DIMENSION(4) :: arguments
  ...
  DO ix = 1, COMMAND_ARGUMENT_COUNT()
     CALL GET_COMMAND_ARGUMENT(ix,arg)
     READ(arg,*) arguments(ix)
  END DO
注意,子例程
GET\u COMMAND\u参数
通过第二个参数(我称之为
arg
)返回一个字符变量。它还有其他可选参数,因此您可能需要检查一些文档

当前确定调用哪个
area
函数的方法没有问题,但是如果您愿意,您还可以编写一个area函数,该函数采用可选参数。下面是一个例子:

  REAL FUNCTION area(a,b)
    REAL, INTENT(in) :: a
    REAL, INTENT(in), OPTIONAL :: b
    IF (.NOT.PRESENT(b)) THEN
       area = 3.14159*a*a
    ELSE
       area = a*b
    END IF
  END FUNCTION area

这应该给你一个大概的想法。属性
OPTIONAL
和内在逻辑函数
PRESENT
是具有可选参数的例程所需要的。我认为您已经采用的方法实际上更好。

最新的Fortran编译器提供了许多用于处理命令行参数的内部例程。您可以使用函数
COMMAND\u ARGUMENT\u COUNT
获取执行程序时提供的数字,然后逐个读取。也许是这样的:

  CHARACTER(len=16) :: arg
  REAL, DIMENSION(4) :: arguments
  ...
  DO ix = 1, COMMAND_ARGUMENT_COUNT()
     CALL GET_COMMAND_ARGUMENT(ix,arg)
     READ(arg,*) arguments(ix)
  END DO
注意,子例程
GET\u COMMAND\u参数
通过第二个参数(我称之为
arg
)返回一个字符变量。它还有其他可选参数,因此您可能需要检查一些文档

当前确定调用哪个
area
函数的方法没有问题,但是如果您愿意,您还可以编写一个area函数,该函数采用可选参数。下面是一个例子:

  REAL FUNCTION area(a,b)
    REAL, INTENT(in) :: a
    REAL, INTENT(in), OPTIONAL :: b
    IF (.NOT.PRESENT(b)) THEN
       area = 3.14159*a*a
    ELSE
       area = a*b
    END IF
  END FUNCTION area

这应该给你一个大概的想法。属性
OPTIONAL
和内在逻辑函数
PRESENT
是具有可选参数的例程所需要的。我认为您已经采用的方法实际上更好。

最新的Fortran编译器提供了许多用于处理命令行参数的内部例程。您可以使用函数
COMMAND\u ARGUMENT\u COUNT
获取执行程序时提供的数字,然后逐个读取。也许是这样的:

  CHARACTER(len=16) :: arg
  REAL, DIMENSION(4) :: arguments
  ...
  DO ix = 1, COMMAND_ARGUMENT_COUNT()
     CALL GET_COMMAND_ARGUMENT(ix,arg)
     READ(arg,*) arguments(ix)
  END DO
注意,子例程
GET\u COMMAND\u参数
通过第二个参数(我称之为
arg
)返回一个字符变量。它还有其他可选参数,因此您可能需要检查一些文档

当前确定调用哪个
area
函数的方法没有问题,但是如果您愿意,您还可以编写一个area函数,该函数采用可选参数。下面是一个例子:

  REAL FUNCTION area(a,b)
    REAL, INTENT(in) :: a
    REAL, INTENT(in), OPTIONAL :: b
    IF (.NOT.PRESENT(b)) THEN
       area = 3.14159*a*a
    ELSE
       area = a*b
    END IF
  END FUNCTION area

这应该给你一个大概的想法。属性
OPTIONAL
和内在逻辑函数
PRESENT
是具有可选参数的例程所需要的。我认为您已经采用的方法实际上更好。

最新的Fortran编译器提供了许多用于处理命令行参数的内部例程。您可以使用函数
COMMAND\u ARGUMENT\u COUNT
获取执行程序时提供的数字,然后逐个读取。也许是这样的:

  CHARACTER(len=16) :: arg
  REAL, DIMENSION(4) :: arguments
  ...
  DO ix = 1, COMMAND_ARGUMENT_COUNT()
     CALL GET_COMMAND_ARGUMENT(ix,arg)
     READ(arg,*) arguments(ix)
  END DO
注意,子例程
GET\u COMMAND\u参数
通过第二个参数(我称之为
arg
)返回一个字符变量。它还有其他可选参数,因此您可能需要检查一些文档

当前确定调用哪个
area
函数的方法没有问题,但是如果您愿意,您还可以编写一个area函数,该函数采用可选参数。下面是一个例子:

  REAL FUNCTION area(a,b)
    REAL, INTENT(in) :: a
    REAL, INTENT(in), OPTIONAL :: b
    IF (.NOT.PRESENT(b)) THEN
       area = 3.14159*a*a
    ELSE
       area = a*b
    END IF
  END FUNCTION area
这应该给你一个大概的想法。属性
OPTIONAL
和内在逻辑函数
PRESENT
是具有可选参数的例程所需要的。我认为你已经采取的方法实际上更好