如何在Fortran中获取未知长度的命令行参数?

Ont*_*nio 6 arrays string fortran

我想从用于运行程序的命令行中读取一些文本字符串.我在程序GET_COMMAND_ARGUMENT中使用内部子程序基本上是这样的:

program test
character(len=100) :: argument
call GET_COMMAND_ARGUMENT(1,argument)
print*, argument
end program test
Run Code Online (Sandbox Code Playgroud)

这里的问题是我觉得在编译时设置字符串的最大长度有点危险.一些参数通常是带有路径的文件,因此它们可能很长.将静态长度设置为1000的解决方案听起来像一个丑陋的解决方法.

在Fortran中是不是有更优雅的方法来定义一个能够包含长度仅在运行时知道的字符串的字符串?

fra*_*lus 5

可以使用所谓的延迟长度字符变量.它们不是固定的固定长度,它们的使用可以在诸如关于数据输入的相关问题中找到.

但是,即使使用了延迟长度变量(因为这是语法)

character(len=:), allocatable :: argument
allocate(character(some_length) :: argument)  ! For integer some_length
call GET_COMMAND_ARGUMENT(1,argument)
print*, argument
end
Run Code Online (Sandbox Code Playgroud)

一个人仍然不得不担心some_length应该是什么.如果我们选择100,我们会回到原来的位置.

我们不得不担心这个,因为get_command_argument不采用这样的延迟长度参数并将其分配到所需的长度.那是

character(len=:), allocatable :: argument
call GET_COMMAND_ARGUMENT(1,argument)  ! Will argument be allocated in the subroutine?
print*, argument
end
Run Code Online (Sandbox Code Playgroud)

提供答案"不".

然后,为了处理这个问题,我们会查看其他(可选)参数get_command_argument.特别是,有一个叫length:

character(len=:), allocatable :: argument
integer arglen
call GET_COMMAND_ARGUMENT(1,length=arglen)
allocate(character(arglen) :: argument)
call GET_COMMAND_ARGUMENT(1,value=argument)
print*, argument
end
Run Code Online (Sandbox Code Playgroud)

当然,可以创建一个包装器子例程,它确实采用可分配的延迟长度字符变量并完成所有工作.

  • @Onturenio后一种语法适用于数组.考虑一个字符数组`allocate(character(char_len):: argument(array_len))`. (2认同)
  • @Onturenio 添加到 Vladimir F 的评论中,`allocate( type-spec :: ...)` 形式用于设置分配的类型和类型参数。字符变量的长度是一个类型参数。您可能还会看到此语法用于多态变量以设置动态类型或参数化派生类型。 (2认同)