Brak tekstu programu w oknie edytora tekstu

0

Dobrze by było jak byś napisał co ten program ma robić bo na razie to wróżymy z fusów.

0

Nie czytasz wszystkiego. Procedura Scraton całkuje równanie różniczkowe y'=f(x,y).

0

Zmieniłeś tą procedurę tak jak napisałem?

1

Zmieniłem ale x zmienia wartość od 0.0 do 4.0 ale reszta pozostaje bez zmian.

Może dodam cały kod programu

uses
  Math,Crt;

var
  fi: boolean = False;
  i,j,k: Byte;
  xe: real ;
const
    N1 = 20;
    eps = 1E-9;
    hmin = 1E-5;

type
  TRealFunction = function(x, y: real): real;
  Wektor = Array[0..N1] of real;

var
 x: Real;
 y: Real = 0.0;
 h: real;
 Xo,Yo: Real;
(* Xo: Wektor;
 Yo: Wektor;  *)

(*W tym miejscu wpisz kod funkcji f*)

function f(x,y: real): real;
const
  Uo = 1.0;
  T = 0.4;

begin

  f := (Uo - y) / T;
end;
(*W tym miejscu zakończ kod funkcji f*)

procedure Scraton(f: TRealFunction; x, y, xe, eps, hmin: real);
var
  E, k1, k2, k3, k4, k5: real;

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 + 2.0 * h / 9.0, y + 2.0 * k1 / 9.0);
    k3 := h * f(x + h / 3.0, y + k1 / 12.0 + k2 / 4.0);
    k4 := h * f(x + 3.0 * h / 4.0, y + 0.5390625 * k1 - 1.8984375 * k2 + 2.109375 * k3);
    k5 := h * f(x + 9 * h / 10, 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;
    j:=j+1; 
    if fi then
    begin
      x := x + h;
      k:=k+1;
c:    h := h * (eps / k2) ** 0.2;
      if abs(h) > hmin then goto a else Writeln('NIE MOŻNA OSIĄGNĄĆ DOKŁADNOŚCI eps=',eps);
    end;
(*    x := x + xe;
    Xo[i]:=x;
    Yo[i]:=y; *)
    Xo:=x;
    Yo:=y;
    x:=xe;
    fi := true;

end;
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

Proponuje dokładnie opisać swój problem mianowicie odpowiedz na te pytania:

  1. Co twój program ma obliczać? (cały program nie tylko jedna funkcja)
  2. Jakie są dane wejściowe?
  3. Jakie powinny być wyniki dla przykładowych danych wejściowych?
  4. Jakie wyniki dostajesz?

I na dodatek proponuje przepisać procedurę Scraton tak by nie było w niej goto bo aż oczy pieką od próby analizy :S

0
  1. Program ma rozwiązać na początek przykładowe równanie różniczkowe y'=f(x,y)= (Uo-y)/T
    a jego dokładnym rozwiązaniem jest funkcja y=Uo*(1-Exp(-x/T)).
  2. x=0.0, y=0.0.
  3. y=Uo*(1-Exp(-x/T)
  4. Jeśli odpalisz pełny kod programu który wysłałem w załączniku to sam zobaczysz.

Procedura "Scraton" opracowana jako modyfikacja procedury Runge-Kutty została opublikowana przez Pana Scratona ok 50 lat temu i wykorzystywana przeze mnie ok 20 lat temu sprawdziła się doskonale tyle,że w Turbo Pascalu.

Jeszcze jedno: Są doskonalsze procedury np. metoda Geer'a opracowana znacznie późnij ale jest bardzo trudna w implementacji.
Jest wykorzystywana w programach Altium Designer czy Mathlab. Moje poszukiwania w sieci dostarczyły jedynie ogólnikowej informacji jak to zrobić. Mam literaturę na jej temat ale jak to wykorzystać niestety nie wiem.

0

furious programming dostałem informację, że napisałeś ale tekstu nie mam

1
Zbigniew Jachimowicz napisał(a):

Wg mnie nie ma wymiany danych pomiędzy programem głównym a procedurą Scraton.

W jakim sensie? Wymiana danych następuje w momencie wywołania procedury Scraton, która dane wejściowe otrzymuje w parametrach. Jednak jest to wymiana jednostronna, albowiem parametry przekazywane są przez wartość. To powoduje, że zmiany wartości argumentów wewnątrz procedury Scraton mają zasięg lokalny, więc nowe ich wartości nie będą dostępne poza tą procedurą.

Aby zmiany były widoczne również w głównym bloku kodu programu, trzeba skorzystać z innego sposobu. Pierwszą opcją jest przekazanie parametrów przez referencję, co robi się za pomocą var:

procedure Scraton(f: TRealFunction; var x, y, xe, eps, hmin: real);

Teraz jeśli procedura ta zmieni wartości parametrów x, y, xe, eps lub hmin, to będą one dostępne również poza nią.

Innym sposobem jest użycie wskaźników na zmienne liczbowe, ale dokładnie tak samo zadziała w tym przypadku var, więc nie ma co sobie kodu komplikować dodatkowymi operatorami. Ewentualnie można nie przekazywać tych danych w parametrach, a po prostu skorzystać ze zmiennych globalnych, co nie jest zalecaną techniką, jednak również pozwoli zwiększyć zasięg zmian.

Do wyboru do koloru.

0

Wprowadziłem Twoje wskazówki brawo.
Jeszcze nigdy tak nie analizowałem błędów ale teraz zaniepokoił mnie błąd między rozwiązaniem dokładnym a obliczonym.
Szczególnie w pierwszych krokach działania procedury szczególnie,że jest to bardzo proste równanie różniczkowe. Już dla x=0.1 błąd wynosi -100% i później gwałtownie maleje.
Wyczyściłem program ze zbędnych zmiennych i jeśli zechcesz popatrzeć na efekt końcowy to podeślę plik Scraton.pas

1
Zbigniew Jachimowicz napisał(a):

Jeszcze nigdy tak nie analizowałem błędów ale teraz zaniepokoił mnie błąd między rozwiązaniem dokładnym a obliczonym.

Teraz czas na debugowanie kodu – trzeba sprawdzić, czy przepływ sterowania jest prawidłowy. W tym celu można postawić break point na pierwszej linijce kodu procedury (klawisz F5) i instrukcja po instrukcji sprawdzać czy wywołują się prawidłowo (klawiszem F7). Aby mieć podgląd na bieżące wartości argumentów i lokalnych zmiennych, można sobie je dodać do okna watches, ale można też najeżdżać kursorem na zmienne – w hincie będą pokazane dane.

Jeśli procedura przeprowadza zbyt wiele iteracji to można skorzystać z warunkowych break pointów lub ustawić je na konkretnych instrukcjach – to jeśli chcemy sprawdzić, czy się one w ogóle wykonują. Możliwości jest naprawdę dużo.

0

Witam
Znalazłem przyczynę dużych błędów. " if k2 > eps then goto c "
Czy Lazarus zawiera standardowe procedury sporządzania wykresów?

0
Zbigniew Jachimowicz napisał(a):

Czy Lazarus zawiera standardowe procedury sporządzania wykresów?

Do wykresów są kontrolki – np. wbudowany TChart plus różne dodatki z Chart w nazwie. Jednak żeby móc sobie sporządzić wykres, trzeba stworzyć projekt aplikacji okienkowej, przenieść obecny kod i do niej go dostosować, a na koniec ustawić i oprogramować samą kontrolkę wyświetlającą wykres(y).

W razie czego w Google można znaleźć też inne kontrolki dla Lazarusa oraz materiały edukacyjne.

0

Witam.
Odjechaliśmy w trakcie dyskusji od pierwotnego zagadnienia: "Brak tekstu programu w oknie edytora tekstu"
Znalazłem pena z kopią programów z uszkodzonego 20 lat temu kompa. Nie pomogły zaklęcia. Wykorzystałem inny komputer i odtworzyłem w notatniku teksty napisanych programów. Przepisałem słowo w słowo tekst (kod) programu i zadziałało. Wymagało jedynie drobnych poprawek. Np. Zamiana Integer na Smallint lub wrzucenia do komentarza niektórych instrukcji.
Przypuszczam, że przyczyną tego stanu rzeczy są opcje. Przeglądając je nie znalazłem nic takiego co mogłoby wyświetlić tekst.
Załączam tekst innego programu programu bo być może komuś uda się spowodować wyświetlenie tekstu. Wierzcie mi ale przepisanie tekstu programu z 4 stron A4 zajęło mi ok. 4 godziny a mam tych programów ok 30.

0

Dołączam załącznik

0
{$R-,S+,I+,D+,T-,F-,V+,B-,N-,L+ }
{$M 16384,0,655360 }
Program Balista_Vz_Z;
Uses
  Crt, Printer;
Const
  N1=30;
  g=9.81;
  hmin: Real=1E-6;
Type
  Wek= Array[1..2] of Real;
  Wektor= Array[0..N1] of Real;
  Lan= String[2];
Const
  cc=975.0; bc=425.0; Nc=12;
  Ac: Wektor=(1.5812270282,-4.0828271228E-2,-0.42377226486,0.32064120122,-0.10407220836,-5.3139212401E-2,
              0.11069872072,-8.4940177742E-2,3.1175851585E-2,4.2369063412E-3,-2.3658980916E-2,1.7045088556E-2,
                            -1.1066221367E-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  cr=1E4; br=1E4; Nr=3;
  Ar: Wektor=(7.9315381325E-2,-4.1231588213E-2,4.2295336896E-3,-2.1141074925E-4,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
Label A;
Var
  x0,x1,x2,xt,xta,xte,eps,h:Real;
  F1,F2,Ft,P,Px,Q,Qa,Qk,Qp,S,Tm,Tmax,Cx,Cx0: Real;
  cp,bp: Real;
  fi: Boolean;
  j,m,m0,Np: Byte;
  F0,Y: Wek;
  Ap: Wektor;
  k: Integer;
  Nazwa: String[20];
  Plik: File of Real;
Function Py(N:Byte; X:Real; A:Wektor):Real;
  Var
    i: Byte;
    R,S,T,U :Real;
  Begin
    Case N of
      0 : Py:=A[0];
      1 : Py:=A[1]*X+A[0];
     Else Begin
            R:=1.0; S:=X; U:=A[1]*X+A[0]; i:=2;
            Repeat
              T:=2.0*X*S-R; U:=A[i]*T+U;
              R:=S; S:=T; i:=i+1
            Until i>N;
            Py:=U;
          End
    End
  End;
  Procedure Czytaj(Var N:Byte; Var A:Wektor; Napis:Lan; Var d,b:Real; a1,b1:Lan);
    Var
      i,j: Byte;
    Begin
      ClrScr; Write('Podaj liczbe wspolczynnikow  ',Napis,' = '); Readln(N);
      Writeln('   i           A[i]'); j:=3;
      For i:=0 To N Do Begin
        GotoXY(1,j); Write(i:4,'      '); Readln(A[i]); j:=j+1;
        If j=20 Then Begin j:=19; GotoXY(1,3); DelLine End End;
      GotoXY(1,j+1); Write('Podaj wartosc ',a1,' = '); Readln(d);
      Write('Podaj wartosc ',b1,' = '); Readln(b)
    End;
Procedure Fun(xt:Real;Y: Wek; Var F: Wek);
  Var
    V,SinTeta,Ro,R: Real;
  Begin
    V:=Abs(Y[1]);
    If V=Y[1] Then SinTeta:=1.0 Else SinTeta:=-1.0;
    Ro:=Py(Nr,(2.0*Y[2]-cr)/br,Ar);
    If V<285.0 Then Cx:=Cx0 Else Cx:=Cx0*Py(Nc,(2.0*V-cc)/bc,Ac);
    If xt<Tmax Then Begin
      P:=Py(Np,(2.0*xt-cp)/bp,Ap);
      Q:=Qa*xt+Qp End
    Else Begin  P:=0.0; Q:=Qk End;
    Px:=S*Cx*Ro*V*V; R:=g*(P-Px)/Q;
    If xt<0.3 Then SinTeta:=1.0;
    F[1]:=h*(R*SinTeta-g);
    F[2]:=h*Y[1]
  End;
Procedure ScratonUR(N:Byte; Var xt:Real; xte:Real; Var Y:Wek);
  Label
    A,B,C;
  Var
    i: Byte;
    E,K1,K2,K3,K4,K5,W: Wek;
    E1,K2M: Real;
  Begin
    If fi Then Begin
    A:  E1:=Abs((xte-xt)/h);
        If E1<=1.5 Then fi:=E1>1.0 Else Goto C End;
    If fi Then h:=0.5*(xte-xt) Else h:=xte-xt;
 C: Fun(xt,Y,K1);
    For i:=1 To N Do W[i]:=Y[i]+2.222222222222222E-1*K1[i];
    Fun(xt+h*2.222222222222222E-1,W,K2);
    For i:=1 To N Do W[i]:=Y[i]+8.333333333333333E-2*K1[i]+0.25*K2[i];
    Fun(xt+h*3.333333333333333E-1,W,K3);
    For i:=1 To N Do W[i]:=Y[i]+0.5390625*K1[i]-1.8984375*K2[i]+2.109375*K3[i];
    Fun(xt+0.75*h,W,K4);
    For i:=1 To N Do W[i]:=Y[i]-0.3105*K1[i]+1.8225*K2[i]-1.1016*K3[i]+0.4896*K4[i];
    Fun(xt+0.9*h,W,K5); K2M:=0.0;
    For i:=1 To N Do Begin
      E[i]:=(0.34*K1[i]-0.972*K2[i]+1.632*K4[i]-K5[i])*(1.29357298475E-1*K1[i]-5.51470588235E-1*K2[i]
      +0.46568627451*K3[i]-4.35729847494E-2*K4[i])/(K4[i]-K1[i]);
      E1:=Abs(E[i]); If E1>K2M Then K2M:=E1 End;
    If K2M>eps Then Goto B;
    For i:=1 To N Do
      Y[i]:=Y[i]-E[i]+1.04938271605E-1*K1[i]+4.76470588235E-1*K3[i]+2.37037037037037E-1*K4[i]+1.81554103123E-1*K5[i];
    If fi Then Begin
      xt:=xt+h;
   B: h:=h*Exp(0.2*Ln(eps/K2M));
      If Abs(h)>hmin Then Goto A;
      ClrScr; GotoXY(10,10); Write('Nie mozna uzyskac dokladnosci eps= ',eps);
      Repeat Until KeyPressed; hmin:=hmin/10.0; Goto A
    End;
    xt:=xte; fi:=True
  End; {ScratonUR}
Begin
{  Czytaj(Nc,Ac,'Cx',cc,bc,'Ac','Bc');
  Czytaj(Nr,Ar,'Ro',cr,br,'Ar','Br');
  Czytaj(Np,Ap,'P',cp,bp,'Ap','Bp');} ClrScr;
  Write('dysk A - nazwa zbioru z danymi (np,Siln.001)  '); Read(Nazwa);
  Nazwa:='A:Dane\'+Nazwa; Assign(Plik,Nazwa); Reset(Plik); Read(Plik,x0);
  Np:=Round(x0); For j:=0 To Np Do Read(Plik,Ap[j]); Read(Plik,cp,bp); Close(Plik);
A:Write('Podaj Qp = '); Readln(Qp);  Write('Podaj Qk = '); Readln(Qk);
  Write('Podaj Tmax = '); Readln(Tmax);  Write('Podaj D = '); Readln(S); Qa:=(Qk-Qp)/Tmax;
  Write('Podaj Cx0 = '); Readln(Cx0);  Write('Podaj eps = '); Readln(eps);
  Writeln('Wlacz DRUKARKE -nacisnij dowolny klawisz',#10); Repeat Until KeyPressed;
  x1:=0.0; x2:=0.1; xt:=x1;
  F1:=Py(Np,(2.0*x1-cp)/bp,Ap)/(Qa*x1+Qp)-1.0;
  F2:=Py(Np,(2.0*x2-cp)/bp,Ap)/(Qa*x2+Qp)-1.0;
  Repeat
    x0:=xt; xt:=x1+(x1-x2)*F1/(F2-F1);
    Ft:=Py(Np,(2.0*xt-cp)/bp,Ap)/(Qa*xt+Qp)-1.0;
    If F2*Ft>0.0 Then Begin x2:=xt; F2:=Ft End
    Else Begin x1:=xt; F1:=Ft End;
  Until (Abs(x0-xt)<1E-9) or (Abs(Ft)<1E-11);
  Writeln(lst,'Qp= ',Qp:7:4,'   Qk= ',Qk:7:4,'   D= ',S:7:4);
  Writeln(lst,'Tmax= ',Tmax:8:4,'   Teta0= 90.0','   Cx0=',Cx0:6:3);
  Writeln(lst,'hmin= ',hmin:9,'   eps= ',eps:9); Q:=Qa*xt+Qp;
  Writeln(lst,'go=',Ft,'  to=',xt); P:=Py(Np,(2.0*xt-cp)/bp,Ap);
  fi:=False; Y[1]:=0.0; Y[2]:=0.0; Px:=0.0; S:=Pi*Sqr(S)/8.0;
  j:=0; k:=0; Tm:=Int(Tmax+1.0);
  m0:=1+Round(1000.0*xt);
  While m0>=100 Do Begin
    m0:=m0-100; k:=k+100 End; Writeln(lst,'m0= ',m0,'  k= ',k,'  Tm= ',Tm:7:3,#10);
  Writeln(lst,'    t        Vz           Z           Px       P       Cx        Q');
  Writeln(lst,xt:7:3,Y[1]:11:3,Y[2]:12:3,Px:11:4,P:11:3,Cx0:9:3,Q:9:3);
  Repeat
    For m:=m0 To 100 Do
      ScratonUR(2,xt,(m+k)/1000.0,Y);
    Fun(xt,Y,F0);
    Writeln(lst,xt:7:3,Y[1]:11:3,Y[2]:12:3,Px:11:4,P:11:3,Cx:9:3,Q:9:3);
    k:=k+100; j:=j+1; m0:=1;
    If j=10 Then Begin j:=0; Writeln(lst) End;
  Until Abs(xt-Tm)<=1E-8;
  xt:=Tm; j:=0; k:=0;
  Repeat
    For m:=1 To 50 Do
      ScratonUR(2,xt,Tm+(m+k)/100.0,Y);
    Fun(xt,Y,F0);
    Writeln(lst,xt:7:3,Y[1]:11:3,Y[2]:12:3,Px:11:4,P:11:3,Cx:9:3,Q:9:3);
    k:=k+50; j:=j+1;
    If j=10 Then Begin j:=0; Writeln(lst) End;
  Until (Y[2]<=0.0) or (xt>99.0);
  For j:=1 To 80 Do Write(lst,'*'); Writeln(lst,#10,#10); Goto A
End.
0

Witam.
Pięknie ale nie odpowiadasz jak otworzyć ten i inne piki w Lazarusie.
Nie wyobrażam sobie, by prosić Ciebie o otwarcie pozostałych 29 plików Tym bardziej,że muszę je odczytywać na innym kompie, drukować a później przepisywać.

1

Sprawdziłem załączony program pod Lazarusem – dla niego pliki .pas nie są domyślnymi głównymi plikami projektu, więc po dwukliku na ten plik otwiera się środowisko, ale z pustym projektem aplikacji okienkowej w tle i naszym modułem w dodatkowej zakładce. Zwykłego modułu nie da się uruchomić, więc po kompilacji i uruchomieniu, odpala się nam ta pusta aplikacja okienkowa. Środowiskodziała prawidłowo i robi to co ma robić w tym przypadku, ale nie o to nam chodzi.

Aby móc uruchomić ten stary program konsolowy, należy otworzyć Lazarusa, wybrać z menu File opcję New … i w drzewku po lewej stronie okna dialogowego wybrać gałąź Project i pozycję Program. Środowisko utworzy pusty projekt z jednym, głównym plikiem .lpr – należy go zapisać na dysku. Po wszystkim wystarczy skopiować kod z tego starego pliku BALIS.PAS do tego pliku .lpr i gotowe – można go zapisać, skompilować i uruchomić. Przy zapisie projektu, środowisko utworzy także kilka dodatkowych plików, w tym plik .lpi z podstawowymi informacjami, którego lepiej nie kasować.


W razie czego do załączników dodaję przykład tego co opisałem paragraf wyżej. Wystarczy archiwum rozpakować i dwukrotnie kliknąć na jeden z dwóch plików (obojętne czy .lpr czy .lpi). Wtedy też środowisko się otworzy i załaduje nasz projekt, nie tworząc już dodatkowo pustego, tak jak wcześniej.

0

Dzięki . Wszystko działa jak talala. Jeśli trochę zagłębiłeś się w kod programu to jest tam wcześniej rozważana procedura Scraton , tyle, że przystosowana do rozwiązywania układów równań różniczkowych. Jest tam również próba wczytania danych z dysku A.
Nie ma takiego więc będą dalsze przeróbki i przekształcenia aby dostosować program do współczesnych wymagań. To malutki problem - poradzę sobie.

0

Ja z wykształcenia, zamiłowania i hobby jestem elektronikiem i znam się trochę na tym. Jakby co to chętnie służę pomocą

0

Witam
W programie mam deklaracje:

 Const
    N1: Byte = 40; //N1 = Max stopien wielomianu Czebyszewa
    L1: Byte = 50; //L1 = Max liczba punktow na osi X
  Type
    Wektor = Array[0..N1] of Extended; 

i komunikat:

Project1.pas(11,25) Error: Can't evaluate constant expression

Jeśli zadeklaruję:

Wektor = Array of Extended;

Błąd znika ale nie wiem jakie wymiary będą miały później zadeklarowane macierze.

I związana z tym deklaracja:

A :Array[0..N1,0..N1] of Extended;

i komunikat:

Project1.pas(21,19) Error: Can't evaluate constant expression

Jak teraz zadeklarować macierz dwuwymiarową

0

Patryk Problem dotyczy ciągle tego samego programu tyle, że bardziej rozbudowanego

A jeśli poczytasz wcześniejsze posty to są tam podobne deklaracje i działają prawidłowo.
Nie rozumiem dlaczego teraz nie działa

2

Poniższy zapis:

const
  N1: Byte = 40;

to nie jest deklaracja stałej, a deklaracja zmiennej, która to nie może być wykorzystana do indeksacji typu tablicowego – stąd błąd kompilacji. Te wartości można zadeklarować ze wskazaniem typu wartości:

const
  N1 = Byte(40);
  L1 = Byte(50);

lub korzystając z inferencji:

const
  N1 = 40;
  L1 = 50;

W obu przypadkach stałe N1 i L1 będą jednobajtowe.


Przy czym @Patryk27 ma rację – jeden wątek to jeden problem. Tutaj nie ma ograniczeń co do liczby możliwych do założenia wątków, więc nie ma przeszkód w ich tworzeniu. W przeciwnym razie będziemy mieć jeden zbiorczy wątek, z różnymi problemami i nie będzie wiadomo czego właściwie dotyczy.

0

Brawo kolejna wartościowa podpowiedź. Dzięki

0

Nie wiem kto wpadł na pomysł deklarowania zmiennych za pomocą const i tej specyficznej konstrukcji, ale to jedno z dziwactw Pascala. W zależności od ustawień przełącznika {$WRITEABLECONST} (lub krócej {$J}), można w ten sposób zadeklarować normalną zmienną lub zmienną tylko do odczytu.

Przykład:

{$WRITEABLECONST OFF}

const
  Identifier: UInt8 = 100;
begin
  Identifier := 200;
  Write(Identifier);
end.

Próba kompilacji tego kodu spowoduje błąd Can't assign values to const variable.

{$WRITEABLECONST ON}

const
  Identifier: UInt8 = 100;
begin
  Identifier := 200;
  Write(Identifier);
end.

A ten skompiluje się i zadziała według oczekiwań – na wyjściu zostanie wyświetlona liczba 200.

Tak więc trzeba pamiętać, że deklaracja typowej stałej zawiera jej identyfikator, następnie operator = oraz wartość (ze wskazaniem typu danych lub bez). Natomiast jeśli po identyfikatorze znajduje się operator :, to w takim przypadku deklarujemy zmienną, którą normalnie można wykorzystywać w kodzie programu, ale nie do indeksowania czegokolwiek.

We Free Pascalu domyślnie tryb modyfikacji ”stało-zmiennych” jest włączony.

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