Arrays Fortran中带分配字符串数组的SEGFULT

Arrays Fortran中带分配字符串数组的SEGFULT,arrays,string,fortran,segmentation-fault,allocation,Arrays,String,Fortran,Segmentation Fault,Allocation,我试图循环传递给Fortran程序的所有参数,参数的数量会有所不同。因此,我使字符串数组可分配 然而,一旦我开始说循环,我得到一个segfault,如果任何参数给出 拥有一个可分配的字符串数组有什么问题吗 代码: 参数的数量和数组大小被打印出来,一旦我试图读入参数,就会得到一个segfault 编译器,gfortran-gcc,v8.3.0ondebian 10 (为了避免XY问题:其想法是检查参数列表中的选项标志,以及获取所有应处理的文件名) 结果: $ ./a.out err: no arg

我试图循环传递给Fortran程序的所有参数,参数的数量会有所不同。因此,我使字符串数组可分配

然而,一旦我开始说循环,我得到一个segfault,如果任何参数给出

拥有一个可分配的字符串数组有什么问题吗

代码:

参数的数量和数组大小被打印出来,一旦我试图读入参数,就会得到一个segfault

编译器,
gfortran-gcc,v8.3.0
on
debian 10

(为了避免XY问题:其想法是检查参数列表中的选项标志,以及获取所有应处理的文件名)

结果:

$ ./a.out
err: no arguments or options

$ ./a.out arg1 arg2
2  2
<Segfault>
$/a.out
错误:没有参数或选项
美元/年输出arg1 arg2
2  2

正如注释所述,此程序中的问题是在do构造中使用未分配变量
i
,而不是在构造中使用字符数组

我们可以确切地解释为什么使用
i
会有问题

我们知道,
i
是“do变量”(Fortran 2018,11.1.7.2)。在这种do构造中,我们知道(Fortran 2018,11.1.7.4.1),作为循环处理的一部分:

DO变量由初始参数的值定义

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

事实并非如此。这与作为内在赋值一部分的显式分配过程形成了对比,比如说(使用有效的
nargs=command\u参数\u count()
)。如果未分配
i
,则不允许此“定义”(Fortran 2018,5.4.10):

不得引用或定义未分配的可分配变量

i
的定义与将
i
作为具有初始参数的内在赋值目标的过程不同


一般来说,具有可分配标量(如
i
nargs
)是有用的,但在这个问题中,似乎不是这样:从它们中删除
allocatable
属性不会改变逻辑。或者,可以在输入do构造之前显式分配
i
(无需给它一个值)。

这确实修复了它。我从来没有想过,当没有明确定义(即
整数,可分配::I(:)
)时,这个选项甚至被激活。在更大的程序中,我在这一行混合了可分配(向量、数组)和标量值。你能进一步解释一下吗?另外,我很乐意接受这个答案,这样主题就可以结束了——不受任何解释的影响。
I
在这个程序中从未分配过。您可能知道,对可分配变量的内在赋值会导致将其分配给表达式的形状/长度,但作为DO控制变量的使用不是内在赋值,因此不适用。@SteveLionel我不知道,甚至不知道秩为0的变量可能需要分配。谢谢你的解释!对于未来的读者:自动分配是Fortran 2003标准。更多细节。
$ ./a.out
err: no arguments or options

$ ./a.out arg1 arg2
2  2
<Segfault>
do i=1,nargs