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.

…………………………………..