Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

DzikuXXX

Rozwiązany: [Pascal] baza danych

Polecane posty

No wiec mam zrobic program w pascalu ktory jest baza danych na dowolny teamat. Cos tam porobilem i teraz chce miec opcje laczenia 2 baz. I sie sypie... probowalem debugerem to wlacza sie na sekunde. Potem nagle zaczelo dzialac, ale nic sie nie dzieje. Jeden i drugi plik wyglada tak samo. Po kolei, wyszystko jest :/ Cos mi swieci przekazywanie tego rekordu z "var" do procedury, ale sie sypie.

procedure zespolenie;

var

n,linia2:integer;

k:tpostac;

baza_laczona:string;

begin

linia2:=0;

if nazwa='' then wyb_nazwa;

writeln('Jaka baze chcesz dolaczyc do ',nazwa,'?');

readln(baza_laczona);

assign(p,baza_laczona);

reset(p);

n:=filesize(p);

close(p);

while not n=linia2 do

begin

linia2:=linia2+1;

assign(p,baza_laczona);

reset(p);

seek(p,linia2);

read(p,c);

k.nick:=c.nick;

k.prof:=c.prof;

k.lvl:=c.lvl;

k.alz:=c.alz;

close(p);

assign(p,nazwa);

reset(p);

seek(p,filesize(p));

c.nick:=k.nick;

c.prof:=k.prof;

c.lvl:=k.lvl;

c.alz:=k.alz;

close(p);

end;

end;

+ budowa rekordu

tpostac=record

nick:string[15];

prof:string[20];

lvl:integer;

alz:longint;

end

Link do komentarza
Udostępnij na innych stronach

Gdzieś Ci się zapodziały formatowanie kodu i sensowne nazwy zmiennych. Dotarłem do 8 linijki i już się pogubiłem.

Moje uwagi w komentarzach. Nie używam Pascala od dawna, więc mogłem coś źle zrozumieć.

procedure zespolenie;
   var
   n,linia2:integer;
   k:tpostac;
   baza_laczona:string;

begin
   linia2:=0;

   if nazwa='' then              //Co to jest nazwa?
      wyb_nazwa;                //Wybieramy bazę danych

   writeln('Jaka baze chcesz dolaczyc do ',nazwa,'?');    //Wybieramy drugą bazę danych
   readln(baza_laczona);     //Czemu nie korzystasz z funkcji do wyboru nazwy tak jak w przypadku pierwszej bazy?
   assign(p,baza_laczona);  //Co to jest p? Jakaś walidacja czy udało się otworzyć plik?
   reset(p);                        //Ustawienie na początek pliku ?
   n:=filesize(p);
   close(p);

   while not n=linia2 do       //Czy filesize nie zwraca wyniku w bajtach? linia2 to numer linii, a nie przesunięcie w bajtach. Jeżeli filesize zwraca liczbę linii to jest chyba zły operator porównania. Wydaje mi się, że powinno być n > linia2


   begin
      linia2:=linia2+1;              //W pascalu jest chyba pętla for.

      assign(p,baza_laczona);   //Czemu otwierasz plik, który dopiero co zamknąłeś? Pascal chyba nie nakłada ograniczeń na ilość otwartych plików?
      reset(p);
      seek(p,linia2);
      read(p,c);                       //Co to jest c?

      k.nick:=c.nick;               //Skoro kopiujesz z c do k to co właśnie odczytałeś z pliku do c, to może lepiej odczytać bezpośrednio do k?
      k.prof:=c.prof;
      k.lvl:=c.lvl;
      k.alz:=c.alz;

      close(p);


      assign(p,nazwa);           //Walidacja czy udało się otworzyć plik?  Używasz jednej zmiennej dla dwóch plików? Prosisz się o kłopot, zwłaszcza, że p jest globalne.
      reset(p);                       //Ustawienie pliku na początek?
      seek(p,filesize(p));        //A teraz przesunięcie na koniec p

      c.nick:=k.nick;              //Dopiero co skopiowałeś z c do k,
      c.prof:=k.prof;
      c.lvl:=k.lvl;
      c.alz:=k.alz;

      close(p);                       //Otwierasz, skaczesz dwa razy i zamykasz. Odnoszę wrażenie, że zabrakło zapisu.
   end;
end;

Rady:

- FORMATUJ KOD !!!

- Nie korzystaj ze zmiennych globalnych. Unikasz w ten sposób dziwnych zależności w kodzie.

- Dziel problemy na mniejsze. Zrób sobie funkcje do pobierania nazw, otwierania plików itp. Zobaczysz o ile czytelniejszy będzie kod.

- Otwieraj plik raz i zamykaj dopiero kiedy będzie Ci już zbędny. Otwarcie pliku jest powolną operacją.

- Pisz samokomentujący się kod. Nadawaj funkcjom, zmiennym itd. opisowe nazwy. Jeżeli masz zmienną zawierającą rozmiar pliku dla pierwszej bazy danych, to nazwij ją srcDatabaseFileSize. N nic nikomu nie mówi.

- Piszesz kod po polsku. Mogło być gorzej, polsko - angielski. Niemniej kod lepiej pisać po angielsku.

Link do komentarza
Udostępnij na innych stronach

procedure zespolenie;
   if nazwa='' then              //Co to jest nazwa?
      wyb_nazwa;                //Wybieramy bazę danych

nazwa bazy danych na ktorej obecnie pracujemy, jesli jej wczesniej nie wybralismy wybieramy

   writeln('Jaka baze chcesz dolaczyc do ',nazwa,'?');    //Wybieramy drugą bazę danych
   readln(baza_laczona);     //Czemu nie korzystasz z funkcji do wyboru nazwy tak jak w przypadku pierwszej bazy?

Bo ta procedura zmiena ta konkretna zmienna "nazwa".

   assign(p,baza_laczona);  //Co to jest p? Jakaś walidacja czy udało się otworzyć plik?
   reset(p);                        //Ustawienie na początek pliku ?

Przypisz plik "p" o nazwie i reset czyli otworzyc (i nie wyczyscic) i ustawic na poczatku.

   n:=filesize(p);
   close(p);

   while not n=linia2 do       //Czy filesize nie zwraca wyniku w bajtach? linia2 to numer linii, a nie przesunięcie w bajtach. Jeżeli filesize zwraca liczbę linii to jest chyba zły operator porównania. Wydaje mi się, że powinno być n > linia2

Zwraca liczbe linii, a skoro warunek spr jest na poczatu. Zreszta z tym narazie mniejsza bo nic do bazy nie dodaje. Dalej.

   begin
      linia2:=linia2+1;              //W pascalu jest chyba pętla for.

Tak w sumie forem moglem to zrobic :S

      assign(p,baza_laczona);   //Czemu otwierasz plik, który dopiero co zamknąłeś? Pascal chyba nie nakłada ograniczeń na ilość otwartych plików?

Tak nie ogranicza. Robie druga zmienna plikowa (tak probowalem na poczatku) ale nie mam pojecia jak zrobic cos takiego zeby po wczytaniu rekordu "c" z pliku "p" zrobic

          p.c.nick:=p2.c.nick

      reset(p);
      seek(p,linia2);
      read(p,c);                       //Co to jest c?

Rekord c.

      k.nick:=c.nick;               //Skoro kopiujesz z c do k to co właśnie odczytałeś z pliku do c, to może lepiej odczytać bezpośrednio do k?

Albo ja nie rozumiem albo ty :D

      k.prof:=c.prof;
      k.lvl:=c.lvl;
      k.alz:=c.alz;

      close(p);


      assign(p,nazwa);           //Walidacja czy udało się otworzyć plik?  Używasz jednej zmiennej dla dwóch plików? Prosisz się o kłopot, zwłaszcza, że p jest globalne.

Otwieram drugi plik, p jest globalne ale plik zamknalem chwile wczesniej.

      reset(p);                       //Ustawienie pliku na początek?
      seek(p,filesize(p));        //A teraz przesunięcie na koniec p

Gosc od PRa mowil ze tak musi byc :/

      c.nick:=k.nick;              //Dopiero co skopiowałeś z c do k,
      c.prof:=k.prof;
      c.lvl:=k.lvl;
      c.alz:=k.alz;

To c w innym pliku.

      close(p);                       //Otwierasz, skaczesz dwa razy i zamykasz. Odnoszę wrażenie, że zabrakło zapisu.
   end;
end;

Tak zabraklo ale dodanie write(p,c) nic nie dalo.

Rady:

- FORMATUJ KOD !!!

Formatowanie wcielo po wklejeniu do przegladarki.

Link do komentarza
Udostępnij na innych stronach

Zwraca liczbe linii, a skoro warunek spr jest na poczatu. Zreszta z tym narazie mniejsza bo nic do bazy nie dodaje. Dalej.
Ale odczytujesz z pliku i moim zdaniem wychodzisz poza obszar pliku. Źle to na początku zrozumiałem, ale błąd raczej masz. Robisz pętle <0; n) czyli dobrze, ale odczytujesz z pliku rekordy <1, n>. O ile w Pascalu plików się nie adresuje od 1, to na końcu będzie odczyt spoza eof.

Albo ja nie rozumiem albo ty
Zamiast
      read(p,c);                       //Co to jest c? 

      k.nick:=c.nick;               //Skoro kopiujesz z c do k to co właśnie odczytałeś z pliku do c, to może lepiej odczytać bezpośrednio do k?
      k.prof:=c.prof;
      k.lvl:=c.lvl;
      k.alz:=c.alz;

zrób

      read(p,k);

.

Tak nie ogranicza. Robie druga zmienna plikowa (tak probowalem na poczatku) ale nie mam pojecia jak zrobic cos takiego zeby po wczytaniu rekordu "c" z pliku "p" zrobic
Może tak
read(file1, rekord);
write(file2, rekord);

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...