使用邻接列表构建图时Fortran中的分段错误

时间:2017-06-06 20:39:34

标签: fortran fortran90

我正在使用邻接列表方法创建图形。每个节点表示为指向与其连接的其他节点的节点。以下是我的代码

 program main
 use graphs
 implicit none
 type(node),pointer :: start
 type(node), dimension(:), pointer :: grp
 integer :: n, ios=0, a,b, i

 open(1, file='test6.txt', status='OLD', action='READ')
 read(1,*,iostat=ios) n
 allocate(start)
 allocate(grp(n))
 do, i=1,n
   grp(i)%val=i
 enddo

 do while(ios==0)
  read(1,*, iostat=ios)a,b
  if(ios.NE.0)then
     exit
  endif
  start => grp(a)
  call add(start, b)
  start => grp(b)
  call add(start, a)
 end do
end program main

模块图如下

module graphs
 type node
  integer :: val
  type(node), pointer :: next
 end type node

contains

subroutine add(strt, nxn)
 implicit none
 type(node), pointer :: strt, new_node, lst
 integer :: nxn
 allocate(new_node)
 allocate(lst) 
 lst => strt
 new_node%val = nxn
 new_node%next => NULL()
 do while(associated(lst%next))
   lst => lst%next
 enddo
 lst%next => new_node
end subroutine add
end module graphs

档案test6.txt如下

43
1 2
1 10
2 3
2 11
3 4
4 5
5 6
6 7
7 8
8 9
3 12
4 13
5 14
6 15
7 16
8 17
9 18
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
10 19
11 19
12 20

我收到以下错误

Program received signal SIGSEGV: Segmentation fault - invalid memory
reference

Backtrace for this error:
#0  0x7f786df6bef7 in ???
#1  0x7f786df6b12d in ???
#2  0x7f786dbbc4af in ???
#3  0x401db0 in __graphs_MOD_add
at /home/nav/MS project/new/grph.f90:18
#4  0x400f48 in ???
#5  0x400f85 in ???
#6  0x7f786dba782f in ???
#7  0x400a18 in ???
#8  0xffffffffffffffff in ???
Segmentation fault (core dumped)

上述程序对于小图表运行流畅,但不适用于大图表。我无法得到我做错了什么?我正在使用gfortran编译器。

1 个答案:

答案 0 :(得分:1)

您的代码中没有任何地方将起始%next指针设置为null。所以,当你来到

do while(associated(lst%next))

lst%next指向的地址未定义。您不能询问它是否已关联,因为结果associated()将返回也未定义。另请参阅此经典资源以获取更多解释http://www.cs.rpi.edu/~szymansk/OOF90/bugs.html#5

最好的解决方法是指针组件的默认初始化

 type node
  integer :: val
  type(node), pointer :: next =>  null()
 end type node

养成始终将指针组件设置为null的习惯。