gpt4 book ai didi

arrays - Fortran 中分配的字符串数组的段错误

转载 作者:行者123 更新时间:2023-12-01 12:05:25 24 4
gpt4 key购买 nike

我试图遍历传递给 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 on 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 变量”(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

那么,这个“定义”是否首先涉及i的分配?

事实并非如此。这与作为内部赋值一部分的显式分配过程形成对比(例如使用有效的 nargs=command_argument_count())。 i 未分配(Fortran 2018,5.4.10)不允许这种“定义”:

An unallocated allocatable variable shall not be referenced or defined.

i 的定义与使 i 成为具有初始参数的内部赋值目标的过程不同。

通常,具有可分配的标量,如 inargs 可能很有用,但在这个问题的情况下,情况并非如此:删除 allocatable 它们的属性不会改变逻辑。或者,可以在输入 do 构造之前显式分配 i(无需为其赋值)。

关于arrays - Fortran 中分配的字符串数组的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58068159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com