【发布时间】: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