未通过时使用带有value属性的可选参数

时间:2019-01-15 11:58:53

标签: fortran parameter-passing gfortran

我想使用带有属性“值”的函数参数。这是一个可选参数,我想在未传递它时使用它。我希望有一个与可选参数关联的局部变量,因为可选参数是通过值而不是通过引用传递的。但是当我尝试这样做时,会发生奇怪的事情。

在下面的示例中,应该打印字符串“ Hello”,但是字符参数“ Str”的内容似乎为空。

module test_value_mod

    implicit none

    contains

    subroutine printStr(Str, AddTip)
        ! Declaration of parameters
        character(len=*), intent(in)    :: Str
        logical, optional, value        :: AddTip

        if (.not. present(AddTip)) AddTip = .False.

        write (*,*) 'Str: ', Str
        if (AddTip) write (*,*) 'Tip is printed.'
    end subroutine printStr

end module test_value_mod

program test_value_prog
    use test_value_mod

    implicit none

    call printStr('Hello')

end program test_value_prog

但是,当我将字符长度作为另一个参数传递时,没有问题:

module test_value_mod

    implicit none

    contains

    subroutine printStr(Str, LenStr, AddTip)
        ! Declaration of parameters
        integer, intent(in)             :: LenStr
        character(len=LenStr), intent(in)    :: Str

        logical, optional, value        :: AddTip

        if (.not. present(AddTip)) AddTip = .False.

        write (*,*) 'Str: ', Str
        if (AddTip) write (*,*) 'Tip is printed.'
    end subroutine printStr

end module test_value_mod

program test_value_prog
    use test_value_mod

    implicit none

    call printStr('Hello', len_trim('Hello'))

end program test_value_prog

我使用gfortran 7.3.0。但是,如果我使用ifort 17.0.4进行编译,则上面给出的两个示例会出现以下错误:

forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image              PC                Routine            Line        Source             
test_value_passin  0000000000402C64  Unknown               Unknown  Unknown
libpthread-2.17.s  00007EFDA90825E0  Unknown               Unknown  Unknown
test_value_passin  000000000040288D  test_value_mod_mp          15  test_value_passing.f08
test_value_passin  0000000000402A08  MAIN__                     29  test_value_passing.f08
test_value_passin  00000000004027CE  Unknown               Unknown  Unknown
libc-2.17.so       00007EFDA8CD1C05  __libc_start_main     Unknown  Unknown
test_value_passin  00000000004026E9  Unknown               Unknown  Unknown

“ test_value_mod_mp”中的第15行是:     如果(.not。present(AddTip))AddTip = .False。

因此,我认为在未实际提供时使用按值附加的可选参数是无效的。但是,但是,gcc允许这样做,只有在您提供另一个假定长度类型字符的输入参数时,该命令才会失败。

有人可以澄清吗?

0 个答案:

没有答案