当虚拟对象具有指定长度时传递字符串作为参数

2024-02-26

如果我有这个代码

module test
contains
   subroutine xx(name)
      character(len=20), intent(in), optional :: name

      if (present(name)) then
         print *, name
      else
         print *, "foo"
      endif
   end subroutine
end module
program x
   use test

   call xx()
   call xx("foo2")
end program

它不会编译,因为“foo2”的长度不是 20,编译器会抱怨

test.f90(17): error #7938: Character length argument mismatch.   ['foo2']
   call xx("foo2")
-----------^

我怎样才能让这个东西工作,而不修改子例程虚拟长度规范?是否必须声明具有相同长度的中间变量并在调用时传递该变量?


标准语言可能很难理解。我读到@kemiisto 引用的条款要​​求长度(dummy arg) <= length(实际参数)。这里的长度(dummy arg) = 20 and length (actual arg) = 4,所以长度(dummy arg) > length (actual arg),这是该条款不允许的。该子句讨论了如果需要的话,截断实际值以匹配虚拟值,而不是用空格填充。

如果您替换该代码将起作用character(len = 20) with character(len = *)因为您不想修改虚拟参数规范的长度,所以这有问题吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当虚拟对象具有指定长度时传递字符串作为参数 的相关文章

随机推荐