Proceduri si functii
O aplicatie Visual FoxPro poate fi proiectata modular, iar modulele pot fi programe cu extensia .prg (subprograme), proceduri si functii. programele cu extensia prg pot fi situate toate in acelasi director sau in directoare diferite, la fel ca si tabelele de date. Daca se gasesc in diferite se poate utiliza setarea:
SET PATH TO <lista_directoare>
Apelul programelor (subprogramelor) cu extensia .prg se face cu comanda :
DO <nume_fisier_program>
iar numele fisierului poate sa nu contina extensia. In situatia cand s-a generat un fisier program cu generatorul de ecrane, cu generatorul de meniuri sau utilitarul RQBY, extensia fisierului program trebuie sa figureze obligatoriu.
Procedurile si functiile se pot gasi in programul apelant, la sfarsit sau intr-un fisier separat numit fisier de proceduri. Executarea unui subprogram a unei proceduri sau a unei functii se incheie la intalnirea uneia din comenzile: RETURN, CANCEL, QUIT sau la intalnirea sfarsitului de fisier. Comanda RETURN are sintaxa urmatoare:
RETURN [<expr> I TO MASTER I TO <nume_program>]
Definitie: Vom numi modul un subprogram, o procedura sau o functie.
Un modul poate la randul lui sa apeleze unul sau mai multe module, apelul facandu-se cu comanda DO pentru subprograme si cu numele functiei pentru functii. Se pot utiliza si comenzi DO imbricate (subprogramul apelat sa apeleze la randul sau alt subprogram) acceptandu-se maxim 32 nivele de imbricare (la varianta DOS).
Daca instructiunea RETURN figureaza fara clauze, dupa executarea modulului apelat se revine in programul apelant la instructiunea urmatoare apelului. Daca exista clauza <expr>, aceasta reprezinta valoarea pe care o transmite modulul programului apelant. Clauza TO MASTER face ca programul principal sa preia controlul dupa incheierea executarii modulului apelat, iar TO <nume_program> preda controlul subprogramului cu numele specificat.
Comanda CANCEL intrerupe executarea programului si preda controlul ferestrei de comenzii QUIT, forteaza incheierea executarii unui program si face iesirea din mediul FOX .
Un subprogram mai poate fi si suspendat temporar, suspendarea se face folosind comanda:
SUSPEND
iar reluarea executarii se face cu comanda:
RESUME
Pentru aflarea numelui unui program active se utilizeaza functia PROGRAM ().
Exemplu:
Do_0.prg
set talk off
clear
? 'Apeleaza do_1.prg'
do do_1
return
do_1.prg
? 'Programul do_1.prg'
? 'Apeleaza do_2.prg'
do do_2
? 'Programul continua'
return
do_2.prg
? 'Programul do_2.prg'
? 'Programul este suspendat'
suspend
? 'Programul este reluat'
return
In urma rularii programului do_0.prg, subprogramul do_2.prg este suspendat, controlul asupra programelor este transmis la fereastra de comanda si cu comanda RESUME se reia executarea subprogramului do_2.prg - si implicit - do_1.prg, do_0.prg.
I n afara subprogramelor definite de utilizator care au extensia .prg in Visual FoxPRo se utilizeaza proceduri si functii sau pe scurt UDF ("User Defined Function"- functii definite de utilizator). Ele se pot situa:
la sfarsitul fisierului sursa ce contine programul care le apeleaza si in acest caz pot fi folosite numai in acest program;
in fisiere speciale de proceduri si functii.
Declararea si apelarea functiilor si procedurilor
Declararea functiilor
FUNCTI <nume_functie>
PARAMETERS <lista_parametri>
<instructiuni>
.................
RETURN <valoare>
Exemplu:
set talk off
clear
input 'N=' to n
if prim(n)
? N, ' este prim'
else
? N, ' nu este prim'
endif
return
Function prim
parameters n
sw=.T.
for d=2 to int(sqrt(n))
if n% d=0
sw=.F.
endif
endfor
return sw
Apelul functiilor
Apelul functiilor se face precizand numele functiei si lista de parametri, daca functia are parametri:
<nume_functie>( [<lista_parametri>])
Parametri utilizati la apel trebuie sa respecte numarul si ordinea parametrilor descrisi cu:
PARAMETERS.
Declararea procedurilor
PROCEDURE <nume_procedura>
PARAMETERS <lista_parametri>
<instructiuni>
.................
RETURN <valoare>
Exemplu:
set talk off
clear
&& Se calculeaza TVA intr-o tabela cu produse
&& cu structura COD, CANTITATE, PRET, VALOARE, TVA
accpt 'Numele tabelei:' to numetab
do proc_TVA with numetab
return
procedure proc_TVA
parameters s
use &s
replace all tva with valoare*0.19
use
return
Apelul procedurilor
Pentru a apela o procedura se utilizeaza comanda DO, urmata de numele procedurii si lista parametrilor:
DO <nume_procedura> [WITH <lista_parametri>].
La fel ca la functii parametrii utilizati la apel trebuie sa respecte numarul si ordinea parametrilor descrisi cu PARAMETERS.
Observatii: Mediul Fox accepta apelarea recursiva a subprogramelor; numarul de reapelari este insa mic.
Exemplu:
set talk off
clear
input 'n=' to n
? fact(n)
return
function fact
parameters n
if n=0
return 1
else
return n*fact(n-1)
endif
Fisiere pentru functii si proceduri
Este avantajos ca toate functiile si procedurile sa fie grupate intr-un fisier, deoarece se gasesc usor cand se fac modificari in ele si pot fi utilizate in mai multe aplicatii prin precizarea fisierului care le contine. Deschiderea inchiderea unui fisier de subprograme se face cu comanda:
SET PROCEDURE TO [<nume_fisier>]
Daca <nume_fisier> este prezent, se deschide fisierul cu numele specificat ce contine subprograme; altfel se inchide: Inchiderea se mai poate face si cu comanda:
CLOSE PROCEDURE
Fisierul de subprograme se pozitioneaza de obicei in directorul in care se afla programul principal al aplicatiei care utilizeaza fisierele respective.
Exemplu:
Proc_2.prg
set talk off
clear
set procedure to proc.prg
accept 'Introduceti tabela:' to s
input 'Nr. de inregistrare:' to n
? TVA(s,n)
do p_1 with s,n
close procedure
return
Proc.prg
function TVA
parameters s,n
use &s
locate for recno()=n
vtva=tva
use
return vtva
procedure p_1
parameters s,n
use &s
edit record n noedit
delete
pack
use
return
Parametrii si variabilele locale ale functiilor si procedurilor
Lucrul cu module de programe impune rezolvarea unor probleme referitoare la variabilele programului apelant si a modulului. Ne intereseaza domeniul de "vizibilitate" a variabilelor din programul apelant si modul si ce se intampla daca in program si modul exista variabile cu acelasi nume. Vom trata in continuare aceste aspecte.
Consideram un program principal care apeleaza mai multe module. Orice variabila folosita in programul principal este recunoscuta in module si poate fi modificata. In programul principal variabila va acea valoarea modificata in cadrul modulelor. Acelasi lucru se intampla si daca modulele se apeleaza imbricate fiind mai multe nivele de subprograme.
Exemplu:
set talk off
clear
val1=5
do p1
? val1
do p2
? val1
return
procedure p1
val1=val1+3
return
procedure p2
val1=val1+5
return
set talk off
clear
val1=5
do p1
? val1 -Se va afisa 13
return
procedure p1
val1=val1+3
do p2
return
procedure p2
val1=val1+5
return
Am vazut ca variabile din programul principal sunt recunoscute in toate modulele apelate din program. Situatia reciproca nu are loc: variabilele unui modul nu sunt recunoscute decat in modulele apelate de acesta.
Exemplu:
set talk off
clear
do p1
&& se afiseaza 8
? val1
&& eroare
return
procedure p1
val1=3
do p2
? val1
return
procedure p2
val1=val1+5
return
Modificarea domeniului de "vizibilitate" a variabilelor modulelor se face prin definirea lor ca variabile publice (globale) sau private (locale).
Variabilele publice se definesc cu comanda:
PUBLIC <lista_variabile>
Public [ARRAY] <masiv>(expN1>,<expN2>)
In urma comenzii se creeaza variabilele sau masivele specificate si se initializeaza cu .F. Eroarea din exemplul anterior poate fi inlaturata prin definirea lui val1 ca variabila de tip PUBLIC.
set talk off
clear
public val1
do p1
? val1
return
Variabilele private (locale) sunt recunoscute in programul curent si in modulele apelate de acesta. Se declara cu comanda:
PRIVATE <lista_variabile>
PRIVATE ALL [ LIKE <sablon>/ EXCEPT <sablon>]
Spre deosebire de comanda PUBLIC care creeaza variabilele globale, comanda PRIVATE le declara numai.
Exemplu:
set talk off
val1=5
val2=8
do p1
? val1, val2
&& se afiseaza 5 80 deoarece val1 este private
return
procedure p1
private val1
val1=50
val2=80
? ' Val1 Val2'
? val1, val2
return
In situatia cand se doreste utilizarea variabilelor cu acelasi nume in diverse sectiuni ale programului, variabilele pot fi declarate "regionale" : sunt cunoscute numai in sectiunea specificat[ de programator. In program se va marca inceputul sectiunii cu ajutorul directivei de compilare:
# REGIONAL <numar> iar variabilele vor fi precizate ca locale, folosind instructiunea:
REGIONAL <lista_variabile>
O variabila <lista_variabile> este utilizabila pana la intalnirea unei noi declaratii REGIONAL care sa o includa, sau pana la sfarsitul programului. Sectiunea de localizare a variabilelor se incheie la intalnirea unei noi directive # REGIONAL sau a sfarsitului de fisier. Aceleasi variabile pot fi declarate in zone diferite ale programului, fara a avea legatura intre ele.
Exemplu:
set talk off
clear
# region 1
regional a, b, c
a=5
b=7
c=8
# region 2
regional a, b
? a - Eroare ! Variabila a nu este gasita.
a=9
b=10
? a, b, c - Se afiseaza 9 10 8. Variabila c este recunoscuta deoarece nu a fost trecuta in lista variabilelor din zona 2.
return
Transmiterea parametrilor modulelor de program
In cazul proiectarii unei aplicatii mari se impune utilizarea modulelor de program, mai ales cand programarea nu se face de o singura persoana. Comunicarea modulelor cu un program apelant sau cu alte module se face prin intermediul parametrilor asociati modulelor.
Ca si in alte limbaje si in Visual FoxPro avem doua modalitati de transmitere a parametrilor:
prin valoare
prin referinta.
La transmiterea prin valoare, o modificare a parametrului in modul nu afecteaza valoarea avuta de acelasi parametru in programul apelant. Daca parametrul va fi transmis prin referinta, in urma executarii modulului, valoarea sa din programul apelant va ramane cea din modul. Mecanismul de transmitere al parametrilor este urmatorul:
variabilele care intra in modul pentru prelucrare sunt preluate de parametric la apelarea subprogramului, respectandu-se ordinea si tipul parametrilor descrisi in comanda PARAMETERS <lista_parametri>;
daca parametrii modulului au fost transmisi prin referinta, la incheierea executarii modulului continutul parametrilor este preluat de variabilele corespunzatoare ale programului apelant.
Lista parametrilor unui modul se declara (dupa cum am vazut) cu comanda:
PARAMETERS <lista_parametri>,
care este prima comanda a modulului. Pentru a afla numarul de parametri transmisi modulului curent, se poate folosi functia:
PARAMETERS ()
In urma precizarii modului de transmitere a parametrilor (prin valoare sau referinta) se foloseste comanda:
SET UDFPARMS TO VALUE / REFERENCE
SET UDFPARMS TO VALUE transmite parametrii prin valoare, iar SET UDFPARMS TO REFERENCE transmite parametrii prin referinta.
Exemplu:
set talk off
clear
set udfparms to value
a=1
=fun_1(a)
? a
&& 1
set udfparms to reference
a=5
=fun_1(a)
? a
&& se afiseaza 7
return
function fun?1
parameters s
a=a+2
return a
Observatie: Masivele se transmit ca parametri prin referinta.
Problema rezolvata: Sa se scrie o functie care sa interclaseze doua masive ordonate crescator.
Rezolvare:
set talk off
clear
dimension a(100), b(100), c(100)
input 'Nr. elemente a: ' to n
input 'Nr. elemente b: ' to m
? 'Intr. elem. lui a'
for i=1 to n
input 'a:' to a(i)
endfor
? 'Intr. elem. lui b'
for i=1 to m
input 'b:' to b(i)
endfor
set udfparm to reference
=intercl(a,b)
for i=1 to n+m
? c(i)
endfor
return
function intercl
parameters a, b
i=1
j=1
k=0
do while (i<=n) .and. (j<=m)
k=k+1
if a(i)<b(j)
c(k)=a(i)
i=i+1
else
c(k)=b(j)
j=j+1
endif
enddo
if i<n
for j=I to n
k=k+1
c(k)=a(j)
endfor
else
for i=j to m
k=k+1
c(k)=b(i)
endfor
endif
return c
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |