crt powoduje błąd we wskaźnikach

0

Piszę program na zaliczenie. Ma to być parser XML, muszę użyć struktur dynamicznych.
Poniżej jest funkcja, która ma umożliwić edycję drzewa. Argumentem jest wskaźnik na węzeł, któremu można zmienić nazwę lub go usunąć.
Probelm polega na tym, że po wywołaniu ReadKey element wskazuje na inny adres i dostaję
Project xmlParser raised exception class 'External: SIGSEGV'. At address 40DE9D

z debugera:
przed ReadKey:
record TWEZEL {ID = $21be40 'book', WARTOSC = $0, BRACIA = $2141a0, WEZEL = true, CECHY = $2140e0, DZIECI = $214120}

po ReadKey:
record TWEZEL {ID = $65696d5a205d315b <Address 0x65696d5a205d315b out of bounds>, WARTOSC = $d65777a616e206e <Address 0xd65777a616e206e out of bounds>, BRACIA = $757355205d325b0a, WEZEL = true (110), CECHY = $616e2061776f4e0b, DZIECI = $3a61777a}

to samo się dzieje z ClrScr i jeżeli użyję writeln ze zmienną - np. writeln('a') działa, a writeln(element^.id) już nie. Zmiana koloru tła i tekstu też nie powoduje błędu.
Używam Lazarus i FPC.
Nie wiem już w czym może tkwić problem, a modułu crt raczej nie wyrzucę...

type
  PDrzewo= ^Drzewo;
  Drzewo = ^Twezel;

  Twezel = record
           id: string;
           wartosc: String;
           bracia:Drzewo;
           case wezel:bool of
           true: (cechy:Drzewo;
                  dzieci:Drzewo;);
  end;



    function edycja(var element:Drzewo):bool;  // true jesli zmieniła się liczba węzłów
    var opcje:String; klawisz:int;
    begin
      result:=false;
      opcje:='[1] Zmien nazwe'+#13#10+'[2] Usun'+#13#10;

      //ClrScr;

      while true do
      begin
        clrscr;
        //////////////////
        Kolory(LightBlue,White);
        //writeln(' ',element^^.id,' ');
        //writeln(opcje);
        Kolory(White,Black);

        writeln('a');

        repeat
          klawisz:=byte(ReadKey);
          if klawisz=0 then ReadKey;
          if not (klawisz=27) then klawisz:=klawisz-48 else klawisz:=0;

        until (1<=klawisz)and(klawisz<=9) or (klawisz=0);
        /////////////////


        case klawisz of
          1: zmien_nazwe(element); // Zmien nazwe
          2: begin
               drzewo_usun(element);
               Result:=True;
             end;
          0: Exit;
        end;
      end;
    end;
0

Problem jest nie w readkey problem jest wcześniej. Jedyne co widzę w tym kodzie że masz pochrzanioną strukturę danych:

type
  PDrzewo= ^Drzewo; // po kiego ci to, do procedur przekazuj var element:Drzewo tak jak zrobiłeś w edytuj() i tyle
  Drzewo = ^Twezel;
 
  Twezel = record
           id: string;
           wartosc: String;
           bracia:Drzewo; // czy dobrze rozumiem że każde z dzieci (niżej) będzie miało dokładną kopię drzewa dzieci tego rekordu w drzewie bracia? może zamiast tego dodaj rodzic:Drzewo;
           //case wezel:bool of  // skoro masz tylko jedną opcje to nić tym nie zyskujesz
           //true: (
           cechy,dzieci:Drzewo;
           //);
  end;

Poza tym lepiej zrób z tego klasę.

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