![]() |
1
6
这可能是由于堆栈不足而导致的运行时问题,而不是gfortran的错误。 Gfortran使用堆栈存储自动数组和其他初始化数据。当一个这样的数组很小时,代码不会产生问题,但当数组的大小增加时会出现segfaults时,一个可能的原因是堆栈用完了。 这个问题在最近版本的gfortran中似乎是一样的。我用gfortran 4.8.4、4.9.3、5.5.0、6.4.0、7.3.0和8.2.0编译并运行了您的程序。在所有情况下,我都获得了默认堆栈大小的分段错误,但堆栈大小稍微增加时没有错误。
你的问题可以通过跑步来解决
在执行二进制文件之前。我不知道这样做会有什么特别的惩罚,但是更了解内存管理细节的程序员,比如编译器开发人员,可能会有不同的想法。
以上代码符合标准。正如注释中所解释的,缺少子例程的显式接口不是好的实践,但对于这些简单的子例程来说,这并不违反规则。
最后,请注意,如果您使用OpenMP,上面的ulimit命令只影响主线程-您需要通过环境变量设置其他每个线程的堆栈大小
|
![]() |
2
0
这些不一定是有用的解决方案,但以下是seg故障消失的一些条件。有几个人提到了缺少显式接口(虽然技术上不正确,但这是一个坏习惯),这似乎是其中的一个关键,因为代码的这两个更改中的任何一个都消除了seg错误,尽管这并不是那么简单,我将解释:
让我简单地谈谈2。简单地以OP中的示例为例,然后通过将子例程放在模块中给它一个显式接口 没有
|
![]() |
R. N · gfortran指针过程类型问题 6 年前 |
|
user9376192 · gfortran中的排列阵列 7 年前 |
![]() |
JohnE · 指针作为派生类型的组件 7 年前 |
![]() |
mod0 · 如何调试Fortran代码中的意外跳转 7 年前 |
|
user4372504 · 每次迭代的变量值 7 年前 |
![]() |
BabaYaga · 在Fortran中用覆盖和追加写入现有文件 7 年前 |
|
user758077 · 简单Fortran 77程序的编译错误 7 年前 |