Notiuni generale despre unit-uri
Primele versiuni ale compilatorului Turbo Pascal nu permiteau scrierea programelor mai mari de 64KO, deoarece procesoarele 8086 limiteaza dimensiunea unui segment la aceasta valoare. Incepand cu versiunea 4.0 a fost introdusa notiunea de unit. Prin unit se intelege o colectie de constante, declaratii de tip si de variabile, proceduri si functii, care p 222f54c oate fi compilata separat si care poate fi utilizata de un program principal sau de un alt unit, prin specificarea numelui unit-ului intr-o clauza uses. Lungimea unui unit ramane tot limitata la 64 KO, dar un program (unit) poate sa utilizeze un numar arbitrar de unit-uri. Numarul unit-urilor utilizate este limitat doar de dimensiunea memoriei interne. La o capacitate de 640 KO, se poate scrie de exemplu un program principal si inca 9 unit-uri utilizate de programul principal, fiecare avand dimensiunea de pana la 64 KO.
Prin utilizarea tehnicii unit-urilor, viteza de compilare si de editare de legaturi va creste substantial deoarece, de regula, unit-urile utilizate sunt stocate in forma compilata.
Unit-urile pot fi clasificate in cele standard si cele utilizator. In Turbo Pascal exista 8 unit-uri standard, fiecare cu un profil si cu structura bine delimitate: System, Dos, Overlay, Crt, Graph, Printer, GraphB, si Turbo3.
LIMBAJUL TURBO PASCAL
Unit-ul System contine toate procedurile st functiile standard din Turbo Pascal. Orice subprogram Turbo Pascal care nu face parte din limbajul standard Pascal (in acceptiunea lui N. Wirth) si care nu este intr-un alt unit, se gaseste memorat in acest unit. Unit-ul System se incorporeaza automat in toate programele, fara a fi necesara nici o clauza uses.
Unit-ul Dos contine proceduri si functii echivalente cu apelurile Dos cele mai uzuale (citire de date si de timp, dimensiune disc, sistemul de intreruperi, e.t,c.). Aceste subprograme devin accesibile unui program sau unit prin specificarea clauzei uses Dos.
Unit-ul Overlay permite folosirea tehnicii de descoperire la programe foarte mari. Accesibilitatea subprogramelor se realizeaza prin clauza uses overlay.
Aceste trei unit-uri se gasesc in fisierul TURBO.TPL.
Unit-ul Crt permite utilizarea functiilor si procedurilor axate spre utilizarea ecranului alfanumeric. Accesibilitatea lor se realizeaza prin clauza uses crt.
Unit-ul Graph contine procedurile si functiile grafice care sunt depuse in fisierul GRAPH.TPU . Aceste subprograme au nevoie de informatiile din fisierele *.BGI si *.CHR. Serviciile unit-ului Graph pot fi accesate prin clauza usesgrapli.
Unit-ul Printer permite redire-ctarea scrierilor in fisierul text cu nume lst direct la imprimanta, de exemplu :
program scriu;
uses printer;
begin
writeln (lst, 'Salutari pentru TP');
end.
Unit-urile
GraphB si Turbo 3 permit folosirea subprogramelor grafice din versiunea 3.0. Aceste
unit-uri folosesc si unit-ul Crt. Programele Turbo Pascal permit nu numai
folosirea unit-urilor standard - ci si scrierea
unit-urilor utilizator. Un program sau unit care foloseste alte unit-uri trebuie
sa contina imediat dupa numele programului (sau al unit-ului) clauza uses de forma:
uses numeunit1, numeunit2, , numeunitn;
unde numeunit desemneaza numele unit-ului utilizat.
Forma generala a unui unit este asemanatoare cu a unui program, dar apar si anumite deosebiri, semnificative.
unit nume:
interface
uses lista unit-urilor utilizate de unit-ul actual;
optional const definitia constantelor comune:
type defitia tipurilor comune;
var definitia variabilelor comune;
antete de procedure si function
implementation
label declararea etichetelor locale unit-ului actual const declararea constantelor locale unit-ului actual type definirea tipurilor locale unit-ului
var definirea variabilelor locale unit-ului
declaratii de procedure si function locale unit-ului
corpul subprogramelor de procedure si function ale caror antete sunt date in sectiunea de interferenta, fara a fi necesara specificarea listelor de parametri formali
begin instructiune;
instructiune;
end.
In esenta, un unit se compune din trei sectiuni:
Sectiunea de interfata incepe cu cuvantul interface. Aici sunt declarate acele constante, tipuri, variabile si subprograme, care sunt publice, adica sunt vazute de un program care foloseste unit-ul actual. In aceasta sectiune apar doar antetele procedurilor si functiilor declarate publice. Corpurile corespunzatoare subprogramelor publice sunt date in sectiunea de implementare. Daca unit-ul actual utilizeaza alte unit-uri, numele acestora suni specificate in clauza uses, pusa imediat dupa cuvantul interface.
Sectiunea de implementare incepe prin cuvantul implementation. Aceasta sectiune poale
sa continue ia randul ei declaratii proprii, care nu sunt vazute, din
programul ce utilizeaza unit-ui actual Dupa declaratiile proprii urmeaza corpul procedurilor si functiilor ale
caror antete au fost definite in sectiunea de interfata: fiecare subprogram specificai in interfata trebuie sa aiba
un corp. Dupa cuvantul cheie procedure sau
function se scrie doar numele subprogramului. Nu este necesara
repetarea descrierii listei de parametri si a valoni returnate. (Daca se,
doreste totusi specificarea listei de parametri, aceasta specificare
trebuie
sa fie copia fidela a listei parametrilor descrise in sectiunea d f
interfata).
Sectiunea de initializare
incepe prin cuvantul cheie begin si contine un numar de instructiuni. Aceste
instructiuni permit efectuarea initializarii variabilelor definite in sectiunea de interfata. Cand se executa un program care utilizeaza acest unit, inainte de a intra in corpul programului
s principal se trece la executia
instructiunilor din aceasta
sectiune, doar dupa aceea trecandu-se
ca la executarea primei instructiuni
din programul prmcipal. Daca un program utilizeaza mai multe unit-uri, prima data sunt apelate
instructiunile din sectiunile de initializare corespunzatoare unit-urilor. Ordinea sectiunilor de initializare este stabilita de ordinea data in
clauza uses.
Dupa apelarea sectiunilor de initializare se trece la prima instructiune a programului principal. Daca un unit nu trebuie sa faca nici o initializare, poate sa lipseasca si cuvantul begin destinat sectiunii de initializare.
Exemplu :
Unit-ul cu nume SUBALT.PAS contine o procedura 'schimb', care realizeaza schimbarea a doua valori intregi si o functie 'max', ce reutrneaza maximul a doua numere intregi. Fixam destinatia compilarii pe
disc. In urma compilarii se creaza fisierul SUBALT.TPU. Subliniem faptul
ca numele unit-ului din programul sursa Turbo PascaL trebuie sa coincida cu numele fisierului sursa ce se compileaza (la noi SUBALT)
interface
procedure schimb (var i, j : integer);
function max(I, j : integer) : integer;
implementation
procedure schimb;
var temp : integer;
begin
temp := i;
i := j;
j := temp;
end;
function max;
begin
if I > j then max := I;
else max := j;
end;
end.
Programul principal SEF.PAS utilizeaza
subprogramele definite in
unit-ul compilat separar SUBALT. Se fixeaza fisierul primar in SEF.PAS, dupa care se compileaza
utilizind comanda Make (sau Build).
programsef;
uses subalt;
var a, b, c : integer;
begin
writeln ('introduce 2 nr. intregi');
readln (a , b);
schimb (a , b);
writeln('a=',b,'b=',b);
writeln('Maximul este-',c);
end.
La
apelarea unui unit se pot folosi toate constantele, tipurile, variabilele si subprogramele definite in sectiunea de interfata a
unit-ului. Aceste elemente insa - la nevoie - pot fi redefnite. Prin
calificare, insa pot fi utilizate simultan atat elementele din unit cat si
elemente redefinite.
Exemplu :
In unit-ul cu numele test se defineste o procedura cu numele p. In programul principal aceasta procedura este redefinita. Primul apel de procedura din corpul programului principal se refera la procedura redefinita. Cel de-al doilea apel se refera la procedura originara. Aceasta referire se realizeaza printr-o calificare : in fata numelui procedurii trebuie scris numele unit-ului utilizat, urmat de un punct.
unit test;
interface
const n=10;
var x : integer;
procedure p (u : integer ; var v : integer);
implementation
begin
program princ;
uses test;
var y : integer;
procedure p (u : integer; var v: integer);
begin
v : = u - n;
end.
begin
writeln ('x=', x);
p (x,y);
test p(x,y);
writeln ('y=', y);
end.
Pe ecran sunt afisate urmatoarele:
x= 100 y=90 y=100
Prima valoare a lui y s-a obtinut prin procedura p din programul principal, cea de-a doua valoare a lui y s-a obtinut prin procedura p a unit-ului test.
Fie p un program, u1 si u2 doua unit-uri de forma :
Program p; uses u2[ begin end. |
Unit u1; interface implementation end. |
Unit u1; interface uses u1; implementation end. |
Aici unit-ul u2 utilizeaza unit-ui u1 iar programul p utilizeaza unit-ul u1.
Daca in programul p
apare doar uses u2, programul p
poate sa refere doar identificatorii din sectiunea de interfata a unit-ului u2. In cazul in care in programul p apare clauza uses u1, u2 : programul p poate sa refere atat identificatorii din
sectiunea de interfata a unut-ului u2,
cat si pe cei din sectiunea de interfata a
unit-ului u1.
|