Fortran 中分配的字符串数组的段错误
Segfault with allocated string array in Fortran
我试图遍历传递给 Fortran 程序的所有参数,参数的数量各不相同。因此,我使字符串数组可分配。
但是,一旦我开始所述循环,如果给出任何参数,我就会遇到段错误。
有一个可分配的字符串数组有什么问题吗?
代码:
program read_args
implicit none
character(len=999), allocatable :: args(:)
integer, allocatable :: i, nargs
nargs=command_argument_count()
if ( nargs == 0 ) then
print*, 'err: no arguments or options'
stop
end if
allocate(args(1:nargs))
print*, nargs, size(args(:))
do i=1,nargs
call getarg(i,args(i))
args(i)=trim(adjustl(args(i)))
end do
end program
打印了参数的数量和数组大小,一旦我尝试读取参数,我得到了一个段错误。
编译器,gfortran - gcc , v8.3.0
在 debian 10
(为了避免 XY 问题:想法是检查参数列表中的选项标志以及获取应处理的所有文件名)
结果:
$ ./a.out
err: no arguments or options
$ ./a.out arg1 arg2
2 2
<Segfault>
如评论所述,此程序中的问题是在 do 构造中使用了未分配的变量 i
,而不是在构造中使用字符数组。
我们可以确切地知道为什么 i
的这种使用是有问题的。
在
do i=1,nargs
我们知道 i
是 "do variable"(Fortran 2018,11.1.7.2)。在这样的 do 构造中,我们知道 (Fortran 2018, 11.1.7.4.1) 作为循环处理的一部分:
The DO variable becomes defined with the value of the initial parameter
那么,这个 "definition" 是否首先涉及 i
的分配?
没有。这与作为内部分配一部分的显式分配过程形成对比(例如有效的 nargs=command_argument_count()
)。 "becomes defined" 不允许 i
未分配(Fortran 2018,5.4.10):
An unallocated allocatable variable shall not be referenced or defined.
i
的定义与 i
具有初始参数的内部赋值目标不同。
一般来说,具有可分配的标量,例如 i
和 nargs
可能很有用,但在这个问题的情况下,情况并非如此:删除 allocatable
属性从他们那里不会改变逻辑。或者,可以在输入 do 结构之前显式分配 i
(无需为其赋值)。
我试图遍历传递给 Fortran 程序的所有参数,参数的数量各不相同。因此,我使字符串数组可分配。
但是,一旦我开始所述循环,如果给出任何参数,我就会遇到段错误。
有一个可分配的字符串数组有什么问题吗?
代码:
program read_args
implicit none
character(len=999), allocatable :: args(:)
integer, allocatable :: i, nargs
nargs=command_argument_count()
if ( nargs == 0 ) then
print*, 'err: no arguments or options'
stop
end if
allocate(args(1:nargs))
print*, nargs, size(args(:))
do i=1,nargs
call getarg(i,args(i))
args(i)=trim(adjustl(args(i)))
end do
end program
打印了参数的数量和数组大小,一旦我尝试读取参数,我得到了一个段错误。
编译器,gfortran - gcc , v8.3.0
在 debian 10
(为了避免 XY 问题:想法是检查参数列表中的选项标志以及获取应处理的所有文件名)
结果:
$ ./a.out
err: no arguments or options
$ ./a.out arg1 arg2
2 2
<Segfault>
如评论所述,此程序中的问题是在 do 构造中使用了未分配的变量 i
,而不是在构造中使用字符数组。
我们可以确切地知道为什么 i
的这种使用是有问题的。
在
do i=1,nargs
我们知道 i
是 "do variable"(Fortran 2018,11.1.7.2)。在这样的 do 构造中,我们知道 (Fortran 2018, 11.1.7.4.1) 作为循环处理的一部分:
The DO variable becomes defined with the value of the initial parameter
那么,这个 "definition" 是否首先涉及 i
的分配?
没有。这与作为内部分配一部分的显式分配过程形成对比(例如有效的 nargs=command_argument_count()
)。 "becomes defined" 不允许 i
未分配(Fortran 2018,5.4.10):
An unallocated allocatable variable shall not be referenced or defined.
i
的定义与 i
具有初始参数的内部赋值目标不同。
一般来说,具有可分配的标量,例如 i
和 nargs
可能很有用,但在这个问题的情况下,情况并非如此:删除 allocatable
属性从他们那里不会改变逻辑。或者,可以在输入 do 结构之前显式分配 i
(无需为其赋值)。