Brak tekstu programu w oknie edytora tekstu

0

Witam
Free Pascal Win10. Przykłady zamieszczone z programem są prawidłowe.
Ok 20 lat temu napisałem kilka programów w Borland Pascalu 5.0 i nie jest widoczny ich tekst w oknie edytora.
Jest natomiast komunikat:

file\C:FREE PASCAL\3.0.4\bin\i386-win32\silnk\balis.pas had too long lines first such 1

a po zaakceptowaniu następny komunikat:

file\C:FREE PASCAL\3.0.4\bin\i386-win32\silnk\balis.pas had too long lines first such -1

I to wszystko. Zmiany opcji edytora i ekranu nic nie dają

0

W którym konkretnie momencie wyskakują te błędy? Możesz podesłać przykładowy projekt do przetestowania?

2

zainstaluj lazarusa zamiast używać konsolowego edytora fpc. W nim tez bez problemu można kompilować aplikacje konsolowe.

0
furious programming napisał(a):

W którym konkretnie momencie wyskakują te błędy? Możesz podesłać przykładowy projekt do przetestowania?

W momencie zatwierdzenia pliku do otwarcia.
Nie mogę podać tekstu ponieważ nie mam wydrukowanej kopii.

0

Kurcze, sądziłem że używasz Lazarusa… :/

W takim razie zainstaluj go i nie męcz się z tym konsolowym dinozaurem.

0

Witam
Zainstalowałem Lazarusa i dalej nie ma tekstu. Doszedłem do wniosku,że nie będzie bo struktura programu jest zupełnie inna niż w Turbo Pascalu.
Udało mi się znaleźć jedną procedurę w turbo Pascalu ale w formacie PDF. Nie bardzo wiem jak przerobić ją na Obiekt Pascal jakim jest Lazarus.
Z tego co pamiętam to procedura działała znakomicie w Turbo Pascalu. Niżej załączam tekst:

Procedure Scraton(f, x, y, xe, eps, hmin);

value xe, eps, hmin;
real x, y, xe, eps, hmin;
label etb;
real function f;

Begin
real E, k1, k2, k3, k4, k5 as real;
boolean fi;

    ( x - bieżąca wartść współrzędnej (odciętej) )
    ( y - bieżąca i obliczona wartość funkcji (rzędnej) )
    ( xe - kolejna wartość odciętej )
    ( eps - mninimalna dokładność obliczeń )
    ( hmin - minimalna wartość kroku h )
    ( h - bieżąca wartość kroku obliczna w procedurze Scraton )
    ( fi - przed pierwszym wywołaniem procedury Scraton nadać wartość false - )
    ( - póżniej jej wartość jest ustawiana automatycznie )
    ( etb - zewnętrzna etykieta pod ktorą program kontynuuje dalsze działanie jeśli zostały )
    ( przkroczone wartości hmin i eps )
If fi then
a: Begin
     E = abs((xe - x) / h)
     If E <= 1.5 then fi = E > 1
     else goto b
End If  'fi
    
     If fi Then h = 0.5 * (xe - x) else h = xe - x
    
b:  k1 = h * f(x, y);
     k2 = h * f(x + 0.222222222222 * h, y + 0.2222222222222 * k1);
     k3 = h * f(x + 0.333333333333 * h, y + 0.8333333333333 * k1 + 0.25 * k2);
     k4 = h * f(x + 0.75 * h, y + 0.5390625 * k1 - 1.8984375 * k2 + 2.109375 * k3);
     k5 = h * f(x + 0.9 * h, y - 0.3105 * k1 + 1.8225 * k2 - 1.1016 * k3 + 0.4896 * k4);
     E = (0.34 * k1 - 0.972 * k2 + 1.632 * k4 - k5) * (0.129357298475 * k1 - 0.551470588235 * k2
           + 0.46568627451 * k3 - 0.0435729847494 * k4) / (k4 - k1);
     k2 = abs(E);
     If k2 > eps then goto c
    
     y = y - E + 0.104938271605 * k1 + 0.476470588235 * k3 + 0.237037037037 * k4
          + 0.181554103123 * k5
     If fi then
        x = x + h
c:     h = h * (eps / k2) ^ 0.2
        If abs(h) > hmin then goto a else etb;
     End; 'fi
    
     x = xe;
     fi = True;
End 'Procedure SCRATON;
0

@Zbigniew Jachimowicz: muszę Cię zmartwić, ale załączony kod nie jest napisany w Pascalu. ;)

Nie za bardzo wiem co to za język – trochę podobny do C, trochę do Visual Basica, może trochę do Lua, ale w całości do żadnego mi nie pasuje. Przy czym na pewno nie jest to Pascal – ani pradawny, ani współczesny, ani żaden inny.

0
furious programming napisał(a):

@Zbigniew Jachimowicz: muszę Cię zmartwić, ale załączony kod nie jest napisany w Pascalu. ;)

Nie za bardzo wiem co to za język – trochę podobny do C, trochę do Visual Basica, może trochę do Lua, ale w całości do żadnego mi nie pasuje. Przy czym na pewno nie jest to Pascal – ani pradawny, ani współczesny, ani żaden inny.

Było to w Algolu. Polecenia Algolu były podkreślone w Pascalu nie. Reszta różniła się niewiele. Inne były tylko polecenia wejścia-wyjścia ponieważ wtedy źródłem była klawiatura lub taśma perforowana a wyjściem maszyna do pisania. Były to czasy komputerów takich jak ODRA 1204, !325. Jako ciekawostkę podam, że jeszcze pod koniec lat 80-ych pracowałem przy obsłudze Odry 1325 ale już zmodernizowanej i programy pisało się na monitorze ale niestety wyjściem była maszyna do pisania lub drukarka.
Ale ten tekst programu przerobiony na Pascal działał znakomicie.

0

No dobrze, ale po co nam kod napisany w Algolu? Gdzie jest sprawiający problemy kod napisany w Pascalu? Drugi dzień mija i nadal nie wiadomo czego od nas oczekujesz. Napisałeś tylko tyle, że:

Zbigniew Jachimowicz napisał(a):

Nie mogę podać tekstu ponieważ nie mam wydrukowanej kopii.

co nie tłumaczy absolutnie nic.

0

Chyba niezbyt dokładnie przeczytałeś moje posty. Znalazłem tekst wprawdzie przerobiony z Algolu ale działający w Pascalu. Chodzi teraz o to jak przerobić ten tekst na Lazarus'a.
I tylko tyle. Zastanawiasz się do czego tekst jest podobny, ale czy to jest najważniejsze ?

1
Zbigniew Jachimowicz napisał(a):

Znalazłem tekst wprawdzie przerobiony z Algolu ale działający w Pascalu.

To zdanie sugeruje, że masz już przeportowany kod dla Pascala.

Chodzi teraz o to jak przerobić ten tekst na Lazarus'a.

A to, że nie masz.

Zastanawiasz się do czego tekst jest podobny, ale czy to jest najważniejsze ?

Nie tekst, a kod – nazywaj rzeczy po imieniu, a nikt nie będzie miał problemów ze zrozumieniem o co chodzi. Kod napisany w dowolnym dialekcie Pascala (z wyłączeniem Oxygene i innych ”dziwadeł”) da się skompilować za pomocą FPC na różne platformy.


Tak więc albo konkretnie napisz czego potrzebujesz, albo ja odpadam. Z chęcią pomogę z przeportowaniem tego kodu, ale muszę wiedzieć czy tego właśnie chcesz. Choć mała pomoc by się przydała, bo Algola nie znam, więc kilka pytań bym miał na pewno.

0

Jeśli znajdziesz na to czas to proszę Ciebie o napisanie kodu. Wcześniej napisałem,że Lazarus'a dopiero zainstalowałem a do jego w miarę dokładnego poznania jest jeszcze daleka droga. Pomoże mi to również do dopisania innych elementów całego programu bo procedura Scraton jest w tym najważniejsza ale bez reszty nic nie będzie działać.
Jeszcze jedno. W procedurze Scraton f(x,y)=y'. Jest to pochodna rozwikłanego równania różniczkowego. Jako przykład proponuję użyć funkcji f(x,y)= (1-y)/0.4. Rozwiązaniem tego równania jest funkcja y=1-Exp(-x/0.4)

1

Pierwsza sprawa to typy danych parametrów procedury i kilka linijek niżej ich:

Procedure Scraton(f, x, y, xe, eps, hmin);

value xe, eps, hmin;
real x, y, xe, eps, hmin;
label etb;
real function f;

Begin
real E, k1, k2, k3, k4, k5 as real;
boolean fi;

Domyślam się, że x, y, xe, eps i hmin to mają być parametry typu real, etb to etykieta, a f to funkcja przekazywana do procedury Scraton. Są też zmienne lokalne E, k1, k2, k3, k4, k5 typu real oraz jedna fi typu logicznego.

O ile z deklaracją paramtrów i zmiennych lokalnych nie widzę problemu, to jaka ma być początkowa wartość zmiennej fi? Prawda czy fałsz? Bo ta jest używana w warunku zaraz pod jej deklaracją (pomijając tekst w nawiasach, który pewnie jest komentarzem). Obstawiam, że False.

Nie wiem też czy zmiany przeprowadzane na parametrach wejściowych mają mieć globalny zasięg. To co prawda sugeruje sekcja pod etykietą c, ale tego nie jestem pewien.


Wstępna wersja wygląda tak:

uses
  Math;

var
  h: real;

type
  TRealFunction = function(x, y: real): real;

procedure Scraton(f: TRealFunction; x, y, xe, eps, hmin: real);
var
  E, k1, k2, k3, k4, k5: real;
  fi: boolean = false;
label
  a, b, c;
begin
    if fi then
a:  begin
      E := abs((xe - x) / h);
      if E <= 1.5 then fi := E > 1 else goto b;
    end;

    if fi then h := 0.5 * (xe - x) else h := xe - x;

b:  k1 := h * f(x, y);
    k2 := h * f(x + 0.222222222222 * h, y + 0.2222222222222 * k1);
    k3 := h * f(x + 0.333333333333 * h, y + 0.8333333333333 * k1 + 0.25 * k2);
    k4 := h * f(x + 0.75 * h, y + 0.5390625 * k1 - 1.8984375 * k2 + 2.109375 * k3);
    k5 := h * f(x + 0.9 * h, y - 0.3105 * k1 + 1.8225 * k2 - 1.1016 * k3 + 0.4896 * k4);
    E  := (0.34 * k1 - 0.972 * k2 + 1.632 * k4 - k5) * (0.129357298475 * k1 - 0.551470588235 * k2
       + 0.46568627451 * k3 - 0.0435729847494 * k4) / (k4 - k1);
    k2 := abs(E);

    if k2 > eps then goto c;

    y := y - E + 0.104938271605 * k1 + 0.476470588235 * k3 + 0.237037037037 * k4 + 0.181554103123 * k5;

    if fi then
    begin
      x := x + h;
c:    h := h * (eps / k2) ** 0.2;

      if abs(h) > hmin then goto a else exit;
    end;

    x := xe;
    fi := true;
end;

Kod kompiluje się bez żadnych problemów czy ostrzeżeń. W sumie to niewiele rzeczy trzeba było poprawić, bo składniowo nawet pasował. Nie zmieniałem wielkości liter w identyfikatorach, żeby był podobny do oryginału. Musisz sobie sprawdzić poprawność jej działania. Jednak zastosowałem dwa uproszczenia – o tym niżej.

Nigdzie nie widzę deklaracji h – nie jest to ani zmienna lokalna, ani też parametr. Dlatego zadeklarowałem ją jako zmienną globalną. Jej wartość najpierw ustalana jest w drugim warunku, a następnie używana jest do obliczania wartości dla zmiennych k*, więc nie trzeba jej inicjalizować.

Druga sprawa – etykieta etb nie znajduje się wewnątrz procedury Scraton. Każda lokalnie zadeklarowana etykieta musi być lokalnie użyta, nie może się znajdować w innej procedurze. Dlatego zamieniłem odwołanie się do niej na instrukcję exit, aby w tym miejscu przerwać działanie procedury, bo obstawiam, że tak ma to działać.

No i w Pascalu operator ^ służy do wydłubywania danych spod wskaźnika, więc trzeba było go wymienić. Free Pascal do potęgowania przewiduje operator ** i z tego też skorzystałem. Mam nadzieję, że w tym miejscu faktycznie o potęgowanie chodziło.

0

Zmienna h jest lokalna, etb globalna etykieta do której skacze program jeśli h>hmin lub E>eps. Za etykietą etb można poinformować użytkownika o błędzie i podjąć dalsze działania.
fi - globalna a przed pierwszym wywołaniem procedury Scraton fi := false dalej załatwia wszystko Scraton.
Może w tym tekście było trochę zamieszania bo z tego co pamiętam(20 lat temu) próbowałem zastosować ją w Excelu.
Dzisiaj trochę późno więc sprawdzę jutro i dam znać jak wyszło. Na dzisiaj dobranoc. Pozdrawiam Zbych

0
Zbigniew Jachimowicz napisał(a):

Zmienna h jest lokalna […]

W oryginalnym kodzie nie widziałem (i nadal nie widzę) jej deklaracji, więc zadeklarowałem ją jako globalną. Można ją zadeklarować jako lokalną, ale pasuje jej nadać jakąś początkową wartość, aby uniknąć ostrzeżeń podczas kompilacji.

[…] etb globalna etykieta do której skacze program jeśli h>hmin lub E>eps.

Czegoś takiego nie da się w Pascalu zrobić – nie da się wyskoczyć do etykiety znajdującej się poza procedurą, taki kod nawet się nie skompiluje.

Za etykietą etb można poinformować użytkownika o błędzie i podjąć dalsze działania.

Można, ale takich rzeczy nie robi się wewnątrz procedur przeprowadzających obliczenia. Nie wiem też czy to w ogóle powinna być procedura – wynik jej obliczeń póki co nigdzie nie jest zwracany.

fi - globalna a przed pierwszym wywołaniem procedury Scraton fi := false dalej załatwia wszystko Scraton.

Sam akurat zadeklarowałem fi jako lokalną, bo na to wskazywał mi oryginalny kod. Można ją przenieść poza ciało procedury Scraton.

Ogólnie to jest problem z przeportowaniem tego kodu, bo niektórych rzeczy Pascal po prostu nie wspiera. Sam też nie za bardzo rozumiem jak to ma działać, bo Algola na oczy nie widziałem (no, do dziś).

0

Witam
Po skompilowaniu pojawił się komunikat:

Kompilowany projekt, Obiekt docelowy: Scraton.exe: Kod wyjścia 1,Błędy: 1,
Scraton.pas(51,0) Fatal: Syntax error, "BEGIN" expected but "end of file" found

Sprawdziłem. Nie brakuje Begin'a więc nie wiem co jest grane.

1

Zacznijmy od podstaw. Wspominałeś, że pracowałeś na odrach, a do tego zadajesz podstawowe pytania dotyczące pascala. Można z tego wywnioskować, że od bardzo długiego czasu nie miałeś styczności z programowaniem. Więc na samym początku proponuję przeczytać podstawowy kurs pascala i napisanie programu od początku, a kod który masz potraktować jako wskazówki a nie bazę.

0

Na odrach pracowałem jako konserwator a programowaniem w Pascalu zajmowałem się ok 20 lat temu. Jaką stronę lub książkę poleciłbyś ?

Kolego "babubabu". Nie masz nic do powiedzenia a wtrącasz się do korespondencji. Nie rób tego nigdy więcej bo stracisz zaufanie FORUM (nie tylko początkujących).

1

Kolego Zbigniewie do powiedzenia mam bardzo dużo, zaczynając od tego, że 20 lat w informatyce to ogromna przepaść i prawdopodobnie większość informacji z tamtych czasów możesz sobie w buty wsadzić, a kończąc na tym, że jak zaczynasz dyskusję na forum publicznym to musisz liczyć się z tym, że ktoś może włączyć się do dyskusji. Ale co ja tam mogę wiedzieć jestem tylko jakimś losowym gościem z internetu i jak śmiem proponować cokolwiek Zbigniewowi który by wysłać plik do internetu chce go drukować.

0

Kolego babubabu.
Stwierdzasz jesteś początkujący - JESTEM.
Długo nie miałeś nie maiłeś do czynienia z programowaniem - NIE MIAŁEM
Zadajesz pytania - ZADAJĘ bo chcę się czegoś nauczyć w wieku 66 lat. Na zadane pytanie nie odpowiedziałeś tylko coś tam piszesz.
Satyryk Halama określiłby Twoją korespondencję jako cytuję"pierdzieleniem głupot" to w latach 70-tych tak się nazywało a wczasach internetu cytuję "pisaniem bloga".
Tak więc kolego babubabu nie pisz bloga

0

Pierwszą radę już dostałeś i potraktowałeś to jako "pierdzielenie głupot"
Rada numer dwa: Forum nie jest od nauczenia kogokolwiek czegokolwiek tylko od pomocy w rozwiązaniu konkretnego problemu. A na wszystkie twoje pytania, jakie do tej pory zadałeś, odpowiedzi znajdują się w pierwszym lepszym kursie pascala.

0

Dziękuję za Twoje niezwykle cenne rady. Dla mnie kontakt z kolegami z forum jest bardziej cenny niż cytuję "pierwszy lepszy kurs pascala"

1
Zbigniew Jachimowicz napisał(a):

Po skompilowaniu pojawił się komunikat:

Kompilowany projekt, Obiekt docelowy: Scraton.exe: Kod wyjścia 1,Błędy: 1,
Scraton.pas(51,0) Fatal: Syntax error, "BEGIN" expected but "end of file" found

Sprawdziłem. Nie brakuje Begin'a więc nie wiem co jest grane.

Hmm… zapewne mowa tutaj o pliku z rozszerzeniem .lpr dla aplikacji konsolowej. Nie wystarczy w nim zapisać kodu danej procedury – na samym dole tego pliku musi być główny blok rozpoczynający się od begin i kończący na end. Zapewne tego bloku brakowało, stąd błąd kompilacji.

Zbigniew Jachimowicz napisał(a):

Na odrach pracowałem jako konserwator a programowaniem w Pascalu zajmowałem się ok 20 lat temu.

Będzie spory problem z dotychczas zdobytą wiedzą. Z jednej strony dlatego, że Algol posiada(ł) inną funkcjonalność niż Pascal, a z drugiej strony, współczeny Pascal bardzo różni się od tego sprzed 20 lat. Jednak kompilator używany przez Lazarusa wspiera starsze dialekty, w tym pradawny dialekt zwany Turbo Pascalem, więc może łatwiej będzie jego użyć.

Jaką stronę lub książkę poleciłbyś ?

Książek do Free Pascala jest trochę, ale jest też pełna dokumentacja online, z której w dowolnym momencie można skorzystać. Składnia i funkcjonalność języka (oraz innych wspieranych dialektów) opisane są szczegółowo pod trzecim linkiem w tabelce – Free Pascal Reference guide.

Niestety, ale bez nauczenia się programowania praktycznie od nowa, raczej trudno będzie cokolwiek zdziałać.

0

Witam.
Kod procedury przepisałem słowo w słowo, znak w znak tak jak napisałeś a mimo to jest błąd

Kompilowany projekt, Obiekt docelowy: Scraton.exe: Kod wyjścia 1,Błędy: 1,
Scraton.pas(48,0) Fatal: Syntax error, "BEGIN" expected but "end of file" found

0
Zbigniew Jachimowicz napisał(a):

Witam.
Kod procedury przepisałem słowo w słowo, znak w znak tak jak napisałeś a mimo to jest błąd

Kompilowany projekt, Obiekt docelowy: Scraton.exe: Kod wyjścia 1,Błędy: 1,
Scraton.pas(48,0) Fatal: Syntax error, "BEGIN" expected but "end of file" found

 

furious programming napisał(a):

Nie wystarczy w nim zapisać kodu danej procedury – na samym dole tego pliku musi być główny blok rozpoczynający się od begin i kończący na end. Zapewne tego bloku brakowało, stąd błąd kompilacji.

0

I tu masz rację na końcu wpisałem begin end i pojawiło się.

Kompilowany projekt, Obiekt docelowy: Scraton.exe: Zakończony powodzeniem, Podpowiedzi: 1
Scraton.pas(10,11) Hint: Local proc "Scraton" is not used

Teraz muszę dopisać kod funkcji f oraz całego programu.

1
Zbigniew Jachimowicz napisał(a):

I tu masz rację na końcu wpisałem begin end i pojawiło się.

Nie wystarczy tylko dopisać na końcu begin end, bo o ile kod będzie się kompilował, to nie będzie niczego wykonywał. Jeśli pisze się aplikację konsolową, to w głównym pliku (z rozszerzeniem .lpr) musi się znajdować główny blok, którego kod wykonywany jest po uruchomieniu programu. Tak więc w tym bloku powinien Pan zapisać zestaw instrukcji wykorzystujących procedurę Scraton.

Teraz muszę dopisać kod funkcji f oraz całego programu.

W pierwszym parametrze procedury Scraton można przekazać funkcję o dowolnej nazwie – nazwa f używana jest wewnątrz Scraton. To co musi się zgadzać to liczba parametrów takiej funkcji (muszą być dwa), ich typy danych (oba muszą być real) oraz funkcja musi zwracać dane typu real.

W Pascalu przekazanie funkcji w parametrze odbywa się za pomocą operatora @. To oznacza, że parametr przekazujący funkcję to po prostu wskaźnik na nią, a operator @ umożliwia pobranie adresu (dowolnego elementu, np. zmiennej czy funkcji).


Prosty przykład:

type
  TCalcFunction = function(A, B: Real): Real;

  function Sum(A, B: Real): Real;
  begin
    Result := A + B;
  end;

  function Multiply(A, B: Real): Real;
  begin
    Result := A * B;
  end;

  procedure Calculate(AFunction: TCalcFunction; A, B: Real);
  begin
    WriteLn('Result: ', AFunction(A, B):2:2);
  end;

begin
  Calculate(@Sum, 5, 10);
  Calculate(@Multiply, 5, 10);

  ReadLn();
end.

Procedura Calculate w pierwszym parametrze przyjmuje funkcję wykonującą obliczenia, a w dwóch pozostałych przyjmuje dwie liczby, których ta funkcja użyje do obliczeń. Wyjście programu poniżej:

Result: 15.00
Result: 50.00
0

Witam furious programming

Była przerwa bo byłem w szpitalu.

Poczytałem zalecaną literaturę ale nie znalazłem odpowiedzi.
Wg mnie nie ma wymiany danych pomiędzy programem głównym a procedurą Scraton.
x = 0, 0.1, 0.2.....2.0. y = 0 przez cały czas. Xo i Yo - jakieś dziwne wartości z wnętrza procedury.
Załączam kod programu głównego.

begin

  Writeln('  x   ','       y  ','         h','         j','   k','       Xo','          Yo');

(*  Writeln(x:4:4,'     ', y:4:4,'     ',h:1:6,'    ',j:4,'   ',k);*)
  x:=0.0; j:=0; k:=0;
 (* for i:=0 To N1 Do*)
  repeat
     Begin

       xe:=x+0.1;
       Scraton(@f,x,y,xe,eps,hmin);

       Writeln(x:4:1,'     ', y:4:4,'    ',h:6,'    ',j:4,'   ',k,'      ',Xo:4: 4,'       ',Yo:4:4);
       x:=x+0.1;
     end;
  until x>2.1;
   (*  end; *)
  repeat until KeyPressed;

end.
0
begin
  Writeln(' x ',' y ',' h',' j',' k',' Xo',' Yo');
  Writeln(x:4:4,' ', y:4:4,' ',h:1:6,' ',j:4,' ',k);
  x:=0.0; j:=0; k:=0;
  for i:=0 To N1 Do
    repeat
      Begin <----- Zbędne
        xe:=x+0.1;
        Scraton(@f,x,y,xe,eps,hmin);
        Writeln(x:4:1,'     ', y:4:4,'    ',h:6,'    ',j:4,'   ',k,'      ',Xo:4: 4,'       ',Yo:4:4);
        x:=x+0.1;
      end; <----- również zbędnę
    until x>2.1;
end; // <------------ ???????????????????????????????????????????
  repeat until KeyPressed;
end.

Ten kod ci się w ogóle kompiluje i uruchamia? Widzę nadprogramowe end i zbędne nawiasy (których się pozbyłem przy próbie sformatowania).
Oraz możesz skasować begin i end które zaznaczyłem, są niepotrzebne.

Oraz podaj ciało funkcji F bo nie wiadomo co się w niej dzieje przez co nie wiadomo gdzie jest błąd.
Domyślam się, że x i y się nie zmienia bo ich wartości są kopiowane do procedury Scraton i operuje ona na kopiach zmień deklarację na procedure Scraton(f: TRealFunction; var x, y : real; xe, eps, hmin: real); i zobacz czy pomogło.

I jeszcze taki protip: Czasy w których nazwy zmiennych powinny być jak najkrótsze minęły, więc proponuję nazwać zmienne zgodnie z ich przeznaczeniem. Łatwiej będzie się analizować kod.

0

Może to będzie bardziej czytelne

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