PARAMETRII
LINIEI DE COMANDA
Exista posibilitatea ca in momentul executiei unui
program scris in limbajul C sau Pascal sa i se transmita acestuia argumente
(parametri) in cadrul liniei de comanda. Aceasta facilitate (respectiv a
accesarii acestor parametri) este oferita de fapt de catre sistemele de
operare, care sunt raspunzatoare de corecta transmitere a acestor
parametri. Ca dovada a acestei afirmatii, a se vedea facilitatile de referire
la parametrii din linia de comanda oferite in cadrul fisierelor de comenzi
(MS-DOS, Unix).
In cazul in care dorim ca programele executabile (care nu
sunt altceva decat comenzi ale SO sub care se lucreaza) dezvoltate de noi la un
moment dat sa poata beneficia de o astfel de facilitate, ne punem problema in
ce masura limbajele de programare in care lucram ne ofera
posibilitatea de a referi eventualii parametri din linia de comanda. Ideea pe
care vrem sa o subliniem aici este faptul ca nu este de ajuns
"efortul" unei singure parti (adica fie numai a SO, fie numai a
limbajului in care lucram) ci este nevoie de existenta de facilitati la nivelul
ambelor parti implicate in dezvoltarea si executia aplicatiilor.
Vom analiza aici, pe scurt, facilitatile oferite de limbajele de
programare Pascal si C(++) in acest
sens.
Sa facem de la inceput precizarea, ca standardul
limbajului Pascal (spre deosebire de standardul limbajului C) nu ofera
posibilitatea accesarii eventualilor parametri in linia de comanda.
Implementarea Turbo Pascal dispune in
cadrul unit-ului System de doua functii speciale destinate acestui scop: ParamCount
si ParamStr. Asadar, sa remarcam faptul ca nu limbajul Pascal standard
prevede o astfel de facilitate ci doar implementarea Borland a acestuia (si
bineinteles, si alte implementari ale Pascal-ului o fac - de exemplu, Pascal
Sun sub Unix, insa cu o altfel de sintaxa).
Functia ParamCount din Borland Pascal returneaza numarul
de parametri introdusi in linia de comanda la momentul lansarii programului.
Parametrii trebuie sa fie separati prin spatiu sau tab.
Sintaxa functiei este:
function ParamCount:word;
Functia ParamStr returneaza valoarea parametrului de rang specificat din cadrul liniei de comanda. Functia are sintaxa:
function
ParamStr (indice:word):string;
unde indice desemneaza rangul parametrului din
linia de comanda. Daca indice este mai mare decat valoarea returnata de
functia ParamCount atunci ParamStr returneaza sirul vid, iar daca indice
are valoarea zero atunci ParamStr returneaza chiar numele programului lansat in
executie impreuna cu calea de acces spre acesta.
Exemplul urmator afiseaza eventualii parametri aflati in linia de comanda:
program listpar;
var i:integer;
begin
if ParamCount = 0
then writeln('Nu sunt parametri...')
else
for i:=1 to ParamCount do writeln(i,' ',ParamStr(i));
end.
In acelasi scop, in limbajul C standard (deci nefiind un apanaj al mediului Turbo - asa cum este in Turbo Pascal) exista posibilitatea specificarii a doua argumente ale functiei main (sa remarcam deci
o alta diferenta intre cele 2 limbaje:
in Pascal este vorba de functii iar in C este vorba de argumente;
functionalitatea si tipul de informatie oferit este insa
aceeasi):
- argc - reprezentand numarul de argumente din linia de comanda care a lansat programul (echivalentul valorii returnate de functia ParamCount din Turbo
Pascal);
- argv - pointer la un tablou de
pointeri la siruri de caractere, siruri reprezentand chiar argumentele;
Prin conventie argv[0] este un pointer la numele
programului apelat, astfel ca argc este cel putin 1, iar *argv (tiparit cu
descriptorul "%s") este chiar numele programului lansat (echivalent
cu ParamStr(0) din Turbo Pascal). Daca argc=1 atunci nu avem parametri in linia
de comanda (echivalent cu situatia ParamCount=0 din Turbo Pascal). Exemplul dat
mai sus in Turbo Pascal se poate scrie in C astfel:
main(argc, argv) int argc;
char *argv[];
{ int i;
for (i=1; i < argc; i++)
printf("%s%c", argv[i], (i < argc-1) ? ' ':'\n');
}
argv fiind un pointer la un tablou de pointeri, exista si
variante echivalente de scriere a acestui program. Dam
in continuare inca
doua variante:
1). main(argc, argv) int
argc; char *argv[];
{
while (--argc > 0)
printf("%s%c", *++argv, (argc > 1) ? ' ':'\n');
}
2). main(argc, argv) int
argc; char *argv[];
{
while (--argc > 0)
printf( (argc>1)
? "%s":"%s\n" ,
*++argv);
}
2. Exemple adecvate si semnificative care sa ilustreze necesitatea unui asemenea mecanism la nivelul limbajelor de programare
…………………………………
3. O analiza critica si
comparativa a modului in care o astfel de functionalitate este implementata la
nivelul diferitelor limbaje de programare.
Python -
https://www.tutorialspoint.com/python/python_command_line_arguments.htm
Java -
http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/09/command-args.html
JS -
http://javascript.cs.lmu.edu/notes/commandlinejs/
4. Propuneri de
extindere/imbunatatire.
…………………………………..