Dobrze by było jak byś napisał co ten program ma robić bo na razie to wróżymy z fusów.
Nie czytasz wszystkiego. Procedura Scraton całkuje równanie różniczkowe y'=f(x,y).
Zmieniłeś tą procedurę tak jak napisałem?
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.
Proponuje dokładnie opisać swój problem mianowicie odpowiedz na te pytania:
- Co twój program ma obliczać? (cały program nie tylko jedna funkcja)
- Jakie są dane wejściowe?
- Jakie powinny być wyniki dla przykładowych danych wejściowych?
- 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
- 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)). - x=0.0, y=0.0.
- y=Uo*(1-Exp(-x/T)
- 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.
furious programming dostałem informację, że napisałeś ale tekstu nie mam
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.
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
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.
Witam
Znalazłem przyczynę dużych błędów. " if k2 > eps then goto c "
Czy Lazarus zawiera standardowe procedury sporządzania wykresów?
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.
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.
Dołączam załącznik
{$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.
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ć.
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.
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.
Ja z wykształcenia, zamiłowania i hobby jestem elektronikiem i znam się trochę na tym. Jakby co to chętnie służę pomocą
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ą
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
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.
Brawo kolejna wartościowa podpowiedź. Dzięki
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.