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在上面评论中给出的表格。对每种情况分别进行分配。