我想使用带有属性“值”的函数参数。这是一个可选参数,我想在未传递它时使用它。我希望有一个与可选参数关联的局部变量,因为可选参数是通过值而不是通过引用传递的。但是当我尝试这样做时,会发生奇怪的事情。
在下面的示例中,应该打印字符串“ 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允许这样做,只有在您提供另一个假定长度类型字符的输入参数时,该命令才会失败。
有人可以澄清吗?