Laborator 13 - Parametrii liniei de comandă. Preprocesorul.
Obiectivele laboratorului
În acest laborator vom studia:
- cum putem primi/procesa parametrii în linie de comandă într-un program C;
- preprocesor - macro-uri: definire, folosire, practici de urmat;
- preprocesor - compilare conditionată, organizarea unui proiect în fișiere headere și sursă, includere multiplă.
De fiecare dată când uitați sa eliberați memoria sau să închideți un fișier, un ponei moare. Aveți grijă de ei!
Materiale utile
Exerciții
-
Să se realizeze un program care să afișeze numărul și parametrii liniei de comandă primiți.
Hint
: Exemplul1# presupunem existența executabilului gigel $ ./gigel e pe val! _2020 argc = 5 argv[0] = ./gigel argv[1] = e argv[2] = pe argv[3] = val! argv[4] = _2020
-
Scrieți un program C care primește argumente în linia de comandă. Acesta trebuie să respecte următoarele reguli:
- Numele executabilului va fi
gigel
. - Primește cel puțin
2 argumente
în linia de comandă. În caz contrar, se va afișa lastderr
mesajulGigele, cel putin doua!
, iar programul se va termina cu codul de ieșire 2. - Dacă lista de argumente conține stringuri care nu reprezinta numere întregi fără semn, se va afișa la
stderr
mesajulGigele, da-mi numere naturale!
. În acest caz, programul va ieși cu valoarea -1. - Dacă nu s-a întâlnit o eroare menționată anterior:
- Lista de argumente reprezintă un șir de numere naturale (unsigned int). Se cere sortarea listei folosind functia qsort .
- Se afișează lista pe ecran.
- Programul va ieși cu codul 0
darius@pc:$ gcc gigel.c -o gigel $ ./gigel Gigele, cel putin doua! darius@pc:$ echo $? 2 $ ./gigel e Gigele, cel putin doua! darius@pc:$ echo $? 2 $ ./gigel e pe Gigele, da-mi numere naturale! darius@pc:$ echo $? 255 $ ./gigel 1 2 1 2 darius@pc:$ echo $? 0 darius@pc:$ ./gigel 20 10 234 10 20 234 darius@pc:$ echo $? 0 darius@pc:$ ./gigel -1 -2 Gigele, da-mi numere naturale! darius@pc:$ echo $? 255
- Numele executabilului va fi
-
Realizați un macro
SWAP(x, y)
.Hint
: Puteți folosisizeof
pentru a determina câtă memorie este necesara pentru variabila de interschimbare. De asemenea, puteți consulta și Exemplul 5.void test_int() { // interschimbare variabile de tip int int xi = 2, yi = 3; printf("%d %d\n", xi, yi); SWAP(xi, yi); printf("%d %d\n", xi, yi); } void test_char() { // interschimbare variabile de tip char char xc = 'A', yc = 'B'; printf("%c %c\n", xc, yc); SWAP(xc, yc); printf("%c %c\n", xc, yc); } void test_ptr() { // interschimbare variabile de tip char* char* xs = "GIGEL", *ys = "NOT GIGEL"; printf("%s %s\n", xs, ys); SWAP(xs, ys); printf("%s %s\n", xs, ys); } void test_struct() { // interschimbare variabile de tip struct student_t xstud, ystud; // citire xstud, ystud // afisare xstud, ystud SWAP(xstud, ystud); // afisare xstud, ystud }
-
Modificați programul de la
exercițiul 2
astfel încât dacă la compilare este definit un anumit simbol, lista va fi sortată crescător sau descrescător.Folosiți o directivă
#error
pentru a preveni compilarea programului dacă niciunul dintre simboluri nu este definit.Hint
: Pentru acest exercițiu, s-ar putea să vă fie utile directivele#ifdef
sau#ifndef
.# daca nu se defineste un simbol, programul nu va compila darius@pc:$ gcc gigel.c -o gigel gigel.c: In function 'cmp': gigel.c:21:3: error: #error "Please define SORT_ASC or SORT_DESC" 21 | #error "Please define SORT_ASC or SORT_DESC" | ^~~~~ # daca se defineste SORT_ASC, programul va compila darius@pc:/darius/git/pc/lab/lab13$ gcc gigel.c -o gigel -DSORT_ASC # lista afisata este sortata crescator darius@pc:/darius/git/pc/lab/lab13$ ./gigel 30 20 10 20 30 10 20 20 30 30 # daca se defineste SORT_DESC, programul va compila darius@pc:/darius/git/pc/lab/lab13$ gcc gigel.c -o gigel -DSORT_DESC # lista afisata este sortata descrescator darius@pc:/darius/git/pc/lab/lab13$ ./gigel 30 20 10 20 30 30 30 20 20 10