Scalanie z sortowaniem dwóch list, złe użycie wskaźników (exitcode 216)

0

Witam
mam problem z funkcją, która miałaby scalić (jednocześnie sortując) dwie listy. Wywala mi exitcode=216, z tego co wyczytałem to oznacza, że źle używam wskaźników, jednak nie wiem jak to poprawić, prosiłbym o pomoc.

function Scal_po_px(l1, l2:lista):lista;
var
	atrapa, pom : lista;

begin
	new(atrapa);
	if l1^.px<=l2^.px then begin
		atrapa^.nast:=l1;
		l1:=l1^.nast;
	end
	else begin
		atrapa^.nast:=l2;
		l2:=l2^.nast;
	end;
	pom:=atrapa^.nast;
	while (l1^.nast<>nil) and (l2^.nast<>nil) do begin
		if l1^.px<=l2^.px then begin
			pom^.nast:=l1;
			l1:=l1^.nast;
		end
		else begin
			pom^.nast:=l2;
			l2:=l2^.nast;
		end;
		pom:=pom^.nast;
	end;
	if (l1^.nast=nil) and (l2^.nast=nil) then begin
		if l1^.px<=l2^.px then begin
			pom^.nast:=l1;
			l1:=nil;
			pom^.nast:=l2;
			l2:=nil
		end
		else begin
			pom^.nast:=l2;
			l2:=nil;
			pom^.nast:=l1;
			l1:=nil
		end;
		pom^.nast:=nil;
	end;
	if l1^.nast=nil then pom^.nast:=l2
	else pom^.nast:=l1;
	atrapa:=atrapa^.nast;
	Scal_po_px:=atrapa;
end;
0

Zwróć uwagę na ten kawałek kodu:

if (l1^.nast = nil) and (l2^.nast = nil) then
begin
  if l1^.px <= l2^.px then
  begin
    pom^.nast := l1;
    l1 := nil;
    pom^.nast := l2;
    l2 := nil
  end
  else
  begin
    pom^.nast := l2;
    l2 := nil;
    pom^.nast := l1;
    l1 := nil
  end;
  pom^.nast := nil;
end;

if l1^.nast = nil then
  pom^.nast := l2
else
  pom^.nast := l1;

atrapa := atrapa^.nast;
Scal_po_px := atrapa;

Jeżeli pierwszy warunek zostanie spełniony (oznaczony komentarzem {1}), to drugi (oznaczony {2}) będzie operował na **Nil**ach, stąd przy próbie odczytu pola if l1^.nast=nil dostaniesz błąd naruszenia pamięci;

Co mogę polecić - skasuj ten kod i napisz jeszcze raz, tym razem rozdzielając proces iterowania po elementach pierwszej listy od fizycznego wstawiania elementów do drugiej listy; Poza tym masz kupę nic o sobie nie mówiących zmiennych, więc nazwij je sensownie; Po trzecie - sformatuj porządnie kod, bloki Begin End umieść w osobnych liniach, a nie w tych samych co warunki; To samo tyczy się słów Else; Dzięki temu zyskasz na czytelności i łatwiej będzie się zorientować w kodzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1