Lista jednokierunkowa i błąd AccessViolation przy dodawaniu nowego węzła

0

Robię program na podstawie http://4programmers.net/Delphi/Lista_jednokierunkowa. Podczas uruchamiania wyskakuje błąd Access Violation, a w logach wyskakuje brak dostępu do zmiennych. Co jest tego przyczyną? Niżej kod, połączony z błędem.

constructor Moja.Create;
begin
  inherited Create();
  FFirst := nil;
  FLast := nil;
  FCount := 0;
end;

{=================}


procedure Moja.Add(xxx : dane);
var
  NewOne : wsk;
begin
  NewOne := CreateElement(xxx);

  if FFirst = nil then   {<--- przy tej linijcie wyskakuje bląd}
  begin
    FFirst := NewOne;
    FLast := FFirst;
  end
  else
  begin
    FLast^.Next := NewOne;
    FLast := NewOne;
  end;

  Inc(FCount);
end;

{==================}

function Moja.CreateElement(AData:Dane) : wsk;
begin
  New(Result);
  Result^.Next := nil;
  Result^.Data := AData;
end;

 

user image

1
var m:Moja;
var d:Dane; // może też wymagają create - nie opisałeś.

m:=Moja.Create();
m.Add(d);
1

@Items_ - we wskazanej linijce raczej nie może polecieć wyjątek, bo to tylko i wyłącznie porównanie adresu obiektu z wartością Nil; Więc bez względu na wartość pola FFirst, wyjątek nie ma prawa być rzucony - to wygląda jak błąd debugera;

Pokaż lepiej deklarację tego Moja, bo nie może tak być, żeby w poziomu metody nie było dostępu do pola tej samej klasy, jeśli i metoda i to pole zadeklarowane są w klasie tego samego typu;

var d:Dane; // może też wymagają create - nie opisałeś.

Nawet jeśli obiekt nie zostanie utworzony to w parametrze przekaże **Nil**a, który będzie się dało przechowywać w nowym węźle listy; Problem w tym, że jeszcze przy dodawaniu leci wyjątek, czyli zanim w ogóle coś się z tymi danymi zacznie robić (czyli zanim się je pobierze i użyje).

1
furious programming napisał(a):

... Więc bez względu na wartość pola FFirst, wyjątek nie ma prawa być rzucony ...
Może być jeżeli Self=nil

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