2017-06-06 8 views
0

Ich erstelle ein Diagramm mit der Adjazenzlistenmethode. Jeder Knoten wird als ein Knoten dargestellt, der auf andere Knoten zeigt, die damit verbunden sind. Im Folgenden ist mein CodeSegmentierungsfehler in Fortran beim Erstellen eines Graphen mit Adjazenzlisten

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 

Das Modul Graph ist als

folgt
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 

Datei test6.txt ist wie folgt

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 

Ich erhalte die folgenden Fehler

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) 

Das Abov Das Programm läuft problemlos für kleine Graphen, aber nicht für große Graphen. Ich kann nicht verstehen, was ich falsch mache. Ich benutze den Gfortran-Compiler.

+0

was ist das für 'allokieren (l (n))'? "l" scheint nirgendwo deklariert oder benutzt zu werden. – agentp

+0

Könnten Sie uns helfen, indem Sie zeigen, welche Zeile 'project/new/grph.f90: 18' ist? – Brick

+0

@agentp Ich habe dieses Array zuvor verwendet. Ich vergesse das zu löschen. – Neobux

Antwort

1

Nirgendwo in Ihrem Code setzen Sie den Anfang %next Zeiger auf Null. Also, wenn Sie kommen, um

do while(associated(lst%next)) 

die Adresse, wo lst%next Punkte ist nicht definiert. Sie können nicht fragen, ob es verknüpft ist, weil das Ergebnis associated() zurückgibt, ist auch nicht definiert. Siehe auch diese klassische Ressource für etwas mehr Erklärung http://www.cs.rpi.edu/~szymansk/OOF90/bugs.html#5

Das beste Mittel ist, um die Standard-Initialisierung der Zeiger Komponenten

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

es sich zur Gewohnheit, immer Zeiger Komponenten auf null gesetzt.

Verwandte Themen