Pliki typowane - nie działa poprawnie odczytywanie

0

Mam problem z tym, że jak próbuję odczytać wartości z wcześniej zapisanego pliku typowanego, to wyskakują wartości, które nie powinny się tam znajdować. Nie wiem co w tym kodzie może być nie tak? Proszę o pomoc.

 HistoriaTablica = array[1..DLUGOSC_HISTORII] of integer;

  TZapisRozgrywki = Packed Record
    wierszSkad : HistoriaTablica;
    kolumnaSkad : HistoriaTablica;
    wierszDokad : HistoriaTablica;
    kolumnaDokad : HistoriaTablica;
    tura : Kolor;
    tryb : TrybRozgrywki;
    dlugoscHistorii : integer;
    numerWskaznikaPoHistorii : integer;
  end;

  TPlikRozgrywki = File Of TZapisRozgrywki; 


function przetworzRozgrywkeDoZapisu(const r : TRozgrywka) : TZapisRozgrywki;
 var zapis : TZapisRozgrywki; pom : Lista; liczbaPosuniec : integer;
begin
    zapis.tura := r.tura.kolor;
    zapis.tryb := r.tryb;
    pom := r.historia;
    liczbaPosuniec := 0;
    if (pom <> nil) then
    while (pom^.poprz <> nil) do
      begin
      inc(liczbaPosuniec);
      if (pom = r.wskaznikPoHistorii) then
      zapis.numerWskaznikaPoHistorii := liczbaPosuniec;
      zapis.wierszSkad[liczbaPosuniec] := pom.skad.wiersz;
      zapis.kolumnaSkad[liczbaPosuniec] := pom.skad.kolumna;
      zapis.wierszDokad[liczbaPosuniec] := pom.dokad.wiersz;
      zapis.kolumnaDokad[liczbaPosuniec] := pom.dokad.kolumna;
      pom := pom^.poprz;
      end;
    zapis.dlugoscHistorii := liczbaPosuniec;
end;


procedure zapisGry(nazwa : String; const r : TRozgrywka);
 var plik : TPlikRozgrywki; zapis : TZapisRozgrywki;
begin
  AssignFile(plik, nazwa);
  if (not FileExists(nazwa)) then Rewrite(plik)
  else Reset(plik);
  zapis := przetworzRozgrywkeDoZapisu(r);
  Write(plik, zapis);
  CloseFile(plik);
end;

function wczytanieGry(nazwa : String) : TRozgrywka;
 var plik : TPlikRozgrywki; zapis : TZapisRozgrywki; i : integer;
begin
  AssignFile(plik, SCIEZKA + nazwa);
  Reset(plik);
  Read(plik, zapis);
  i := zapis.dlugoscHistorii;
  ShowMessage(IntToStr(i));  //w tym miejscu sprawdzam wartość i jest ona niepoprawna, 
  CloseFile(plik);                   //  bo wartości obiektów, z których było    
end;                                  //to spisywane były z zakresu 1..7, a ta jest dużo dużo większa

0

Podałeś za mało kodu - nie wiadomo czy jest typ Lista i jak jest zaimplementowana, więc dopóki nie wkleisz całości potrzebnego do analizy kodu - niewiele będzie można pomóc;

  ShowMessage(IntToStr(i)); //w tym miejscu sprawdzam wartość i jest ona niepoprawna, 
  CloseFile(plik);          // bo wartości obiektów, z których było    
end;                        //to spisywane były z zakresu 1..7, a ta jest dużo dużo większa

Zamiast kombinować z podglądaniem wartości zmiennych - użyj debugera i prześledź kod tak, jak należy; Dużo więcej się dowiesz, a szukanie błędu w ten sposób będzie o wiele łatwiejsze i przede wszystkim wygodniejsze.

0

zastanów się co zwraca funkcja przetworzRozgrywkeDoZapisu

0
 
  Lista = ^element;
    element = record
    skad : TRuch;
    dokad : TRuch;
    poprz : Lista;
    nast : Lista;
    end;

TPion = class
    wiersz : shortint;
    kolumna : shortint;
    kolor : Kolor;
    maPilke : boolean;
    constructor init(wiersz, kolumna : shortint; kolor : Kolor; maPilke : boolean);
    end;

  TRuch = class
    wiersz : shortint;
    kolumna : shortint;
    pion : TPion;
    czyPodanie : boolean;
    constructor init(wiersz, kolumna : shortint; pion : TPion; czyPodanie : boolean);
    end;




0

Zrobiłam to już za pomocą plików tekstowych i dałam sobie spokój z plikami typowanymi.

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