Zapis i odczyt typu rekordowego

0

Deklaracje:

Type
  PElement = ^Element;
    Element = record
      name : string[79];
      folder : boolean;
      sub : PElement;
      parentHead : PElement;
      parent : PElement;
      next : PElement;
    end;

    TFile = record
      name : string[79];
      folder : boolean;
      parent : string[79];
      kids : boolean;
    end;          

Procedury:

procedure ZapiszDoPliku(head : PElement);
var
  p, e : PElement;
  tmp : TFile;
  f : file of TFile;
begin
  assign(f, 'plik.dtb');
  rewrite(f);
  if head = nil then writeln('Brak elementow do zapisu')
  else
  begin
   p := head;
   while p <> nil do
   begin
    tmp.name := p^.name;
    tmp.folder := p^.folder;
    tmp.kids := false;
    if p^.folder then
    begin
      e := p^.sub;
      if e^.next = nil then tmp.kids := false
      else
      begin
       tmp.kids := true;
       ZapiszDoPliku(e);
      end;
    end;
    tmp.parent := '';
    write(f, tmp);
    p := p^.next;
   end;
  end;
  close(f);
end;                   


procedure WczytajZPliku(head : PElement);
var
  p, e, el : PElement;
  tmp : TFile;
  f : file of TFile;
begin
  assign(f, 'plik.dtb');
  reset(f);
  p := head;
  while not eof(f) do
  begin
   read(f, tmp);
   NowyElement(p, tmp.name, tmp.folder);
   if tmp.kids then
   begin
     el := PrzeszukajListe(p, tmp.name);
     WczytajZPliku(el^.sub);
   end;
  end;
  close(f);
end;            


//i jeszcze funkcja PrzeszukajListe
function PrzeszukajListe(head : PElement; nazwa : string): PElement;
var p : PElement;
begin
  p := head;
  while (p <> nil) and (p^.name <> nazwa) do p := p^.next;
  PrzeszukajListe := p;
end;           

Mam zastosowane listy list (listy podwieszone?). Teraz potrzebuję zapis do pliku i odczyt z pliku, ale wywala blad RunError(5) in file POINTER at line -1
Ostatnie, co mi zostało do zrobienia w projekcie, który jest oczywiście do jutra...
Czy ktokolwiek mógłby jakiekolwiek rady dać?

0

Zapomniałem dodać, że błąd wyskakuje tylko w momencie gdy chce użyć rekurencji do zapisania list podwieszonych. Jeśli 'zakomentuję' sobie ten fragment kodu i zapisuje wtedy zwykłą listę jednokierunkową problem nie występuje.

A plik jest ten sam, nie zmieniany, nie otwierany. Dlaczego więc nie mam wtedy do niego dostępu? Program sam sobie blokuje dostęp?

0

Chodzi o to że próbujesz otwierać już otwarty plik wyrzucić otwarcie pliku i zamknięcie poza te funkcje.

0

Teraz mi wyskakuje Runtime error 103 ( Plik nie jest otwarty )
A jak próbuje przekazać plik jako parametr wyskakuje błąd przy kompilacji:

 Error: Parameters or result types cannot contain local type definitions. Use a separate type definition in a type block.
0

Chyba znalazłem odpowiedź tu http://www.freepascal.org/docs-html/user/userse62.html

In Pascal, types are not considered to be identical simply because they are semantically equivalent. Two variables or parameters are only considered to be of the same type if they refer to the same type definition. As a result, it is not allowed to define new types inside parameter lists, because then it is impossible to refer to the same type definition in the procedure headers of the interface and implementation of a unit (both procedure headers would define a separate type). Keep in mind that expressions such as “file of byte” or “string[50]” also define a new type.

Czyli w nagłówku procedury nie mogę napisać "file of TFile" bo to nowy typ niby... Teraz pytanie jak zdefiniować osobno "file of TFile"? Oczywiście jeśli dobrze rozumiem powyższy tekst.

0

W sekcji type

TMyFile = file of TFile;

a w procedurze procedure foo(var f: TMyFile);

  no i zmienna f ma być oczywiście typu TMyfile
0

O ile dobrze zrozumiałem "problem" to mniej więcej tak jak poniżej.

type
  TPokombinujZanimZapytaszNaForum = File of TFile;
//...
procedure Foo(Bar: TPokombinujZanimZapytaszNaForum);
begin
//...
end;
0

Dziękuję wam bardzo za pomoc, już wszystko działa.

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