Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran可选参数_Fortran - Fatal编程技术网

Fortran可选参数

Fortran可选参数,fortran,Fortran,我正在写一个写字符串的例程。我需要吗 检查存在哪些参数,或者我可以避免吗 Subroutine writes & ( & q1, q2, q3, q4 & ) Character (len=*), Intent(in) :: q1 Character (len=*), Intent(in), Optional :: q2, q3, q4 Character (len=65) :: s, fmt fmt = "(x,4(

我正在写一个写字符串的例程。我需要吗 检查存在哪些参数,或者我可以避免吗

Subroutine writes  & 
(                  &
 q1, q2, q3, q4    & 
)

Character (len=*), Intent(in) :: q1
Character (len=*), Intent(in), Optional :: q2, q3, q4

Character (len=65) :: s, fmt

fmt = "(x,4(a,x))"
Write (s,fmt) Trim (q1), Trim (q2), Trim (q3), Trim (q4)
Write (*,*) Trim (s)

End Subroutine writes

Fortran 2008 12.5.2.12中明确给出了有关使用可选伪参数的规则。如果问题中给出的对
writes
的调用中存在所有参数,那么代码是有效的,输出将与预期的一样。但是,不能保证这一点,任何不存在的参数都会使代码无效

特别是,传递
q2
,例如,它不存在于
TRIM
(它不接受可选参数)将是错误的

解决此问题的方法有多种,但都涉及检查状态。您可以按照中的参数进行操作,但下面是前面注释中给出的备选方案

可以创建一个替代
TRIM
的选项,该选项采用可选参数,如果参数不存在,则返回零长度字符变量,如果参数存在,则返回预期的TRIM变量:

  subroutine writes(q1, q2, q3, q4)
    character(*), intent(in) :: q1, q2, q3, q4
    optional q2, q3, q4
    character(len=65) s

    write(s, '(4(a,:,x))') TRIM(q1), MY_TRIM(q2), MY_TRIM(q3), MY_TRIM(q4)
    print*, TRIM(s)

  contains
    function my_trim(str)
      character(*), intent(in), optional :: str
      character(:), allocatable :: my_trim

      if (PRESENT(str)) then
        my_trim = TRIM(str)
      else
        my_trim = ''
      end if

    end function

  end subroutine
注意,这将为结果使用一个延迟长度字符变量以及自动分配(如果使用ifort,请记住正确编译所需的编译器标志)


最后,如果要确保在两个不存在的变量(
'/'/'/'/'/'
)之间不打印空格,则需要额外的工作。但是,注释表明这是不必要的。

有关使用可选伪参数的规则显然在Fortran 2008 12.5.2.12中给出。如果问题中给出的对
writes
的调用中存在所有参数,那么代码是有效的,输出将与预期的一样。但是,不能保证这一点,任何不存在的参数都会使代码无效

特别是,传递
q2
,例如,它不存在于
TRIM
(它不接受可选参数)将是错误的

解决此问题的方法有多种,但都涉及检查状态。您可以按照中的参数进行操作,但下面是前面注释中给出的备选方案

可以创建一个替代
TRIM
的选项,该选项采用可选参数,如果参数不存在,则返回零长度字符变量,如果参数存在,则返回预期的TRIM变量:

  subroutine writes(q1, q2, q3, q4)
    character(*), intent(in) :: q1, q2, q3, q4
    optional q2, q3, q4
    character(len=65) s

    write(s, '(4(a,:,x))') TRIM(q1), MY_TRIM(q2), MY_TRIM(q3), MY_TRIM(q4)
    print*, TRIM(s)

  contains
    function my_trim(str)
      character(*), intent(in), optional :: str
      character(:), allocatable :: my_trim

      if (PRESENT(str)) then
        my_trim = TRIM(str)
      else
        my_trim = ''
      end if

    end function

  end subroutine
注意,这将为结果使用一个延迟长度字符变量以及自动分配(如果使用ifort,请记住正确编译所需的编译器标志)


最后,如果要确保在两个不存在的变量(
'/'/'/'/'/'
)之间不打印空格,则需要额外的工作。然而,评论表明这是不必要的。

为了指导回答,您认为为什么可以避免在某个时候检查是否在场?虽然
trim
不接受可选参数,但可以像在中一样进行包装。不确定包装是否有用。因为如果我定义一个新函数,返回字符串的大小必须是固定的。
character(len=:),allocatable::result
?同样,在这个实现中,如果被称为
writes('a',q4='b')
,那么输出将是
ab
(额外的空格)。这就是我们想要的吗?不,
allocate(character(whatever)::result)
为了引导答案,为什么您认为可以避免在某个时候检查是否存在?虽然
trim
不接受可选参数,但可以像在中一样进行包装。不确定包装是否有用。因为如果我定义一个新函数,返回字符串的大小必须是固定的。
character(len=:),allocatable::result
?同样,在这个实现中,如果被称为
writes('a',q4='b')
,那么输出将是
ab
(额外的空格)。这就是我想要的吗?不,
allocate(字符(无论什么)::result)
我不需要在函数中调用
my_trim
。我想我必须这样做。你不需要这样做,但如果你想(为了清楚起见,避免自动分配等),那么你必须使用弗拉基米尔F在上面评论中给出的表格。为每种情况分别分配。然后,我不需要在函数中调用
my_trim
上的
allocate
。我想我必须这样做。你不需要这样做,但如果你想(为了清楚起见,避免自动分配等),那么你必须使用弗拉基米尔F在上面评论中给出的表格。对每种情况分别进行分配。