【问题标题】:Segmentation fault happens when accessing array in a fortran program在 fortran 程序中访问数组时发生分段错误
【发布时间】:2013-08-20 03:39:53
【问题描述】:

我有一个 fortran 程序。子程序如下。程序在执行第1434行并打印以下内容后出现分段错误:

i:          115           256             2
Segmentation fault (core dumped)

参数为n1=258、n2=258、n3=258。 NR=46480。为什么会出现分段错误?

75       double precision u(nr),v(nv),r(nr),a(0:3),c(0:3)
76       common /noautom/ u,v,r
......
196       call zero3(u,n1,n2,n3)
......
1418       subroutine zero3(z,n1,n2,n3)
1419 
1420 c---------------------------------------------------------------------
1421 c---------------------------------------------------------------------
1422 
1423       implicit none
1424 
1425 
1426       integer n1, n2, n3
1427       double precision z(n1,n2,n3)
1428       integer i1, i2, i3
1429 
1430 !$omp parallel do default(shared) private(i1,i2,i3)
1431       do  i3=1,n3
1432          do  i2=1,n2
1433             do  i1=1,n1
1434                print*,"i: ",i1, " ", i2 , " " ,i3
1435                z(i1,i2,i3)=0.0D0
1436             enddo
1437          enddo
1438       enddo
1439 
1440       return
1441       end

【问题讨论】:

  • 这可能意味着您作为z 传递的数组没有您说的那么大。由于我们在调用代码中看不到数组的定义,所以我们只能猜测。
  • 定义为双精度 u(nr),v(nv),r(nr),a(0:3),c(0:3) common /noautom/ u,v,r . nr 是 46480
  • 请 (a) 将信息编辑到问题中,并 (b) 显示函数调用。然而,没有一个阵列足够大——258*258*258 = 17173512——所以核心转储几乎是不可避免的。
  • 也许 OT:直接写 z=0.0D0 会更快。
  • @Stefan:不仅更快(可能),而且在数组边界之外分配值也更加困难。

标签: arrays linux segmentation-fault fortran


【解决方案1】:

您的变量定义为数组 u 中的 46480 double 留出了存储空间(还为 vr 留出了尽可能多的空间。

您对 zero3() 的函数调用声称在您传递的数组中有足够的存储空间来存储 258*258*258 = 17173512 个双精度数。

当它试图访问一个超出实际数组边界足够远的元素时,程序会崩溃——您正在尝试访问未分配给程序的内存。

要么您需要将nr 更改为较小的数字(35*35*35 = 42875,因此zero3(u, 35, 35, 35) 应该是安全的(不崩溃),或者您需要为u 分配更多空间:

double u(258,258,258)

或类似的东西(我上次写 Fortran 已经有一段时间了;当时的标准是 Fortran 77)。

【讨论】:

  • 我也面临同样的问题,但在我的情况下,即使我在所有 INCLUDE 语句和变量声明结束后添加 WRITE(*,*) 'Hello World' 语句,它也会给我分段错误错误消息。你能帮我理解是什么导致了这个问题吗?
  • 如果你的问题“完全”一样,你已经分配了 100 KiB 空间(比如说)并试图将多个 MiB 的数据存储到 100 KiB 中,而崩溃是计算机的说法你试图把几加仑水挤进一品脱罐里,这对你很不满意。解决方法与这个问题相同:要么将您尝试放入罐中的数据减少到不到一品脱,要么增加罐的大小,使其至少有几加仑大。或者,换一种说法,选择合适的尺寸。如果这还不够,请提出一个新问题,确保其中包含足够的信息。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
相关资源
最近更新 更多