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;