Связанный список Pascal в связанный список не работает

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

   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]:=@kjovlere;
        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.  

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


person Fatjon Rrapaj    schedule 12.02.2017    source источник


Ответы (1)


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

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

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

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

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

new(a[i]);

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

new(a[i]^.rreshti);

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

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

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

Решение: удалите эту строку a[i]:=@kjovlere;.

Решение:

begin
    for i:=1 to 7 do begin
        (* a[i]:=@kjovlere; 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.  
person J. Piquard    schedule 12.02.2017
comment
Дж. Пикард большое спасибо за все объяснения, которые вы сделали .. :) - person Fatjon Rrapaj; 12.02.2017