2017-02-12 24 views
0

Это два связанных списка, которые я сделал для школьного проекта ... Я хочу, чтобы первый список вызывался со второго, я сделал это и на время компиляции - все в порядке. Когда я запускаю его, он говорит: Проект (myProject) поднял класс исключений «Внешний: SIGSEGV». По адресу 40D32D Вот мой код:Связанный список Pascal в связанном списке не работает

list2=^ptr; 
    ptr=record 
     vlera:integer; 
     pozicioni:integer; 
    end; 

type 
    list=^pointer; 
    pointer=record 
     rreshti:list2; 
    end; 
    var 
    a:array[1..7] of list; 
    i:integer; 
    kjovlere:list2; 

begin 
    for i:=1 to 7 do begin 
     a[i]:[email protected]; 
     write('Give the pozition for the row:',i,' : '); 
     read(a[i]^.rreshti^.pozicioni); 
     write ('give the value for this poziton :'); 
     read(a[i]^.rreshti^.vlera); 
     writeln; 
    end; 
end. 

И ошибка на цикл, в read(a[i]^.rreshti^.pozicioni); я был бы очень благодарен, если кто-то объясняет мне, или дает мне любое предложение :)

ответ

4

Предоставленный исходный код показывает как минимум два недоразумения относительно управления указателями в Паскале.

Основная проблема - Для назначения данных, record типа должны быть выделены прежде.

Эта проблема относится к строкам read(a[i]^.rreshti^.pozicioni); и read(a[i]^.rreshti^.vlera);.

Оба a[i] и rreshti объявлены как тип указателя (list=^pointer; & list2=^ptr;), и должны быть распределены в структуру записи данных перед назначением.

Step1: выделить указатель a[i] в цикле.

new(a[i]); 

Шаг2: выделить a[i]^.rreshti указатель в цикле.

new(a[i]^.rreshti); 

Странная проблема - Присвоить указатель на record типа должны уважать тип назначения.

Эта проблема относится к строке a[i]:[email protected];.

a[i] является list, который является list=^pointer;, а не list2 (list2=^ptr;), как заявлено в kjovlere:list2;.

Решение: удалить эту строку a[i]:[email protected];.

Решение:

begin 
    for i:=1 to 7 do begin 
     (* a[i]:[email protected]; to be removed *) 
     new(a[i]); 
     new(a[i]^.rreshti); 
     write('Give the pozition for the row:',i,' : '); 
     read(a[i]^.rreshti^.pozicioni); 
     write ('give the value for this poziton :'); 
     read(a[i]^.rreshti^.vlera); 
     writeln; 
    end; 
end. 
+0

J. Piquard спасибо, за все объяснения вы сделали .. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^