Argumenti komandne linije
Uvod
Pri otvaranju nove izvorne datoteke u popularnim integrisanim razvojnim okruženjima kao što su npr. Dev-C++ ili Code::Blocks, može se zapaziti sledeći programski kod (koji se tipično generiše automatski, ali, može se naravno upisati i 'ručno') ....
int main(int argc, char** argv)
{
return 0;
}
Prikazana struktura 'prazne' funkcije main
, ponešto je kompleksnija u odnosu na jednostavne primere kakvi se sreću u udžbenicima programiranja (u uvodnim poglavljima), i stoga se mnogi mlađi programeri često pitaju šta (tačno) predstavljaju parametri argc
i argv
?
Dva "misteriozna" parametra predstavljaju:
- broj argumenata koji su predati preko komandne linije operativnog sistema (argument count)
- niz stringova koji je predat (argument vector).
Može se reći da predavanje argumenata preko komandne linije nije tipična operacija za korisnike koji su navikli na GUI okruženje u operativnom sistemu Windows (za razliku od, recimo, Linux-a i srodnih operativnih sistema, kod kojih je rad "u konzoli" i dalje veoma zastupljen), ali, opcija za predavanje argumenata preko konzole, postoji na svim operativnim sistemima koje smo pomenuli - i veoma dobro dođe.
U svakom slučaju, osvrnućemo se na 'tehnikalije' ....
Prosleđivanje argumenata preko komandne linije
Da bismo razumeli kako funkcioniše predavanje, prijem i obrada argumenata, napisaćemo jednostavan program koji sabira dva uneta broja (a da bismo se što više usmerili na glavnu temu, neće biti provere ulaznih podataka).
Izvornoj datoteci daćemo naziv sabiranje.cpp
i unećemo u datoteku sledeći sadržaj:
#include<iostream>
#include<sstream>
using namespace std;
int main(int argc, char** argv)
{
int a, b;
if (argc == 3) {
stringstream(argv[1]) >> a;
stringstream(argv[2]) >> b;
cout << "Zbir unetih brojeva je: ";
cout << a + b << endl;
}
else {
cout << "Argumenti nisu predati pravilno."
cout << endl;
}
return 0;
}
Ovoga puta, potrebno je pokrenuti program preko komandne linije operativnog sistema, * zadavanjem sledeće komande:
sabiranje 10 12
.... pri čemu pokretanje programa proizvodi sledeći ispis:
Zbir unetih brojeva je: 22
Dakle, ako smo preko komandne linije uredno predali argumente i ako su argumenti uredno primljeni i obrađeni, na kraju dobijamo očekivani rezultat.
Detaljnija analiza
Razmotrićemo podrobnije neke od naredbi (objašnjenja su u komentarima):
// Pri pozivu "sabiranje 10 12",
// operativni sistem predaje
// programu tri argumenta:
// sam naziv izvršne datoteke,
// i dva broja (koji su zapisani
// kao nizovi znakova i razdvojeni
// razmacima), i upravo zato je
// potrebno proveriti da li
// promenljiva argc ima vrednost 3.
if (argc == 3)
// Argumentima se može pristupiti
// preko niza (koji se puni automatski).
// Elementi niza su:
argv[0] sa vrednošću "saberi"
argv[1] sa vrednošću "10"
argv[2] sa vrednošću "12"
// Pošto koristimo C++, jezik u kome je
// vođenje računa o tipovima podataka -
// obaveza programera (a ne "nešto što se
// dešava automatski"), neophodno je
// konvertovati poslednje dve niske u
// celobrojne vrednosti, za šta možemo
// koristiti klasu stringstream
// (u pitanju je svojevrstan "'cin' koji
// koristi već postojeće stringove"
// (umesto teksta koji je predat
// preko konzole)).
stringstream(argv[1]) >> a;
stringstream(argv[2]) >> b;
Predavanje argumenata je nedvosmisleno korisna opcija (koja, recimo, dobro dođe kada pišemo skripte u okviru operativnog sistema i želimo da se podaci prosleđuju programima kao argumenti, preko konzole), i svakako ćemo se predavanjem argumenata preko konzole (tj. terminala), dodatno baviti i u budućim člancima ....