Laborator 13 - Parametrii liniei de comandă. Preprocesorul.

Obiectivele laboratorului

În acest laborator vom studia:

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!

Suport teoretic:

Exerciții

  1. 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
    
  2. 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 la stderr mesajul Gigele, 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 mesajul Gigele, 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
    
  3. Realizați un macro SWAP(x, y).

    Hint: Puteți folosi sizeof 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
    }
    
  4. 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