Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:teme:tema-1 [2020/02/23 21:32]
razvan.crainea
so:teme:tema-1 [2022/11/06 17:50] (current)
ionut.mihalache1506
Line 1: Line 1:
-<ifauth @admin,​gabriel.bercaru,​razvan.crainea,​mbarbulescu,​adrian.sendroiu,​george.muraru,​liza_elena.babu> +<hidden>
 ====== Tema 1 Multi-platform Development ====== ====== Tema 1 Multi-platform Development ======
  
 <note important>​ <note important>​
-  * Dată publicare: **25.02.2020** +  * Dată publicare: **10.03.2022** 
-  * <​html><​b><​span style="​color:​blue;">​Deadline</​span></​b></​html>:​ **10.03.2020, ora 23:55** +  * <​html><​b><​span style="​color:​blue;">​Deadline</​span></​b></​html>:​ **21.03.2022, ora 23:55** 
-  ​ +  * <​html><​b><​span style="​color:​red;">​Deadline hard</​span></​b></​html>:​ **24.03.2022, ora 23:55**
-* <​html><​b><​span style="​color:​red;">​Deadline hard</​span></​b></​html>:​ **17.03.2020, ora 23:55**+
 </​note>​ </​note>​
  
Line 33: Line 31:
 **Asigurați-vă că responsabilii de teme au drepturi de citire asupra repo-ului vostru**. **Asigurați-vă că responsabilii de teme au drepturi de citire asupra repo-ului vostru**.
  
-Ca să vă creați un repo de gitlab în instanța facultății:​ în repository-ul [[https://​github.com/​systems-cs-pub-ro/​so-assignments|so-assignments]] de pe Github se află un script Bash care vă ajută să vă creați un repository privat pe instanța de Gitlab a facultății,​ unde aveți la dispoziție 5 repository-uri private utile pentru teme. Urmăriți indicațiile din README și de pe [[:​so:​teme:​folosire-gitlab|wiki-ul SO]].+Ca să vă creați un repo de gitlab în instanța facultății:​ în repository-ul [[https://​github.com/​systems-cs-pub-ro/​so/​tree/​master/​assignments|repository-ul ​so, directorul ​assignments]] de pe Github se află un script Bash care vă ajută să vă creați un repository privat pe instanța de Gitlab a facultății,​ unde aveți la dispoziție 5 repository-uri private utile pentru teme. Urmăriți indicațiile din README și de pe [[:​so:​teme:​folosire-gitlab|wiki-ul SO]].
  
 Motivul pentru care încurajăm acest lucru este că responsabilii de teme se pot uita mai rapid pe [[https://​gitlab.cs.pub.ro|Gitlab]] la temele voastre pentru a vă ajuta în cazul în care întâmpinați probleme/​bug-uri. Este mai ușor să primiți suport în rezolvarea problemelor implementării voastre dacă le oferiți responsabililor de teme acces la codul sursă pe [[https://​gitlab.cs.pub.ro|Gitlab]]. Motivul pentru care încurajăm acest lucru este că responsabilii de teme se pot uita mai rapid pe [[https://​gitlab.cs.pub.ro|Gitlab]] la temele voastre pentru a vă ajuta în cazul în care întâmpinați probleme/​bug-uri. Este mai ușor să primiți suport în rezolvarea problemelor implementării voastre dacă le oferiți responsabililor de teme acces la codul sursă pe [[https://​gitlab.cs.pub.ro|Gitlab]].
  
 Crash-course practic de git puteți găsi aici: [[http://​gitimmersion.com/​lab_01.html#​main_content|git-immersion]] Crash-course practic de git puteți găsi aici: [[http://​gitimmersion.com/​lab_01.html#​main_content|git-immersion]]
 +
 </​note>​ </​note>​
  
Line 44: Line 43:
  
 <code bash> <code bash>
-student@so:​~$ git clone https://​github.com/​systems-cs-pub-ro/​so-assignments.git +student@so:​~$ git clone https://​github.com/​systems-cs-pub-ro/​so 
-student@so:​~$ cd so-assignments/​1-multi+student@so:​~$ cd assignments/​1-multi
 </​code>​ </​code>​
- 
  
 În repository-ul de pe Github se vor găsi și scheletele pentru temele viitoare, care vor fi actualizate și se vor putea descărca pe viitor folosind comanda: În repository-ul de pe Github se vor găsi și scheletele pentru temele viitoare, care vor fi actualizate și se vor putea descărca pe viitor folosind comanda:
Line 66: Line 64:
  
  
-Rezolvarea temei presupune implementarea unui subset al directivelor de preprocesare specifice limbajului C: ''#​define'',​ ''#​include'',​ ''#​if'',​ ''#​elseif'',​ ''#​else'',​ ''#​endif'',​ ''#​ifdef'',​ ''#​ifndef'', ​'''#​undef''​. Sintaxa și descrierea acestora ​este prezentată ​în tabelul de mai jos.+Rezolvarea temei presupune implementarea unui subset al directivelor de preprocesare specifice limbajului C: ''#​define'',​ ''#​include'',​ ''#​if'',​ ''#​elseif'' ​(sub forma ''#​elif''​), ''#​else'',​ ''#​endif'',​ ''#​ifdef'',​ ''#​ifndef'',​ ''#​undef''​. Sintaxa și descrierea acestora ​sunt prezentate ​în tabelul de mai jos.
  
 ^ Directiva ^ Descrierea directivei ^ ^ Directiva ^ Descrierea directivei ^
-| ''#​define <​SYMBOL>​ <​MAPPING>'' ​ | Stochează o asociere între ''<​SYMBOL>''​ și ''<​MAPPING>''​. Toate aparițiile lui ''<​SYMBOL>''​ în fișierul cu codul sursă vor fi înlocuite cu ''<​MAPPING>''​ (vezi exemplul de mai jos)  | +| ''#​define <​SYMBOL>​ <​MAPPING>'' ​ | Stochează o asociere între ''<​SYMBOL>''​ și ''<​MAPPING>''​. Toate aparițiile lui ''<​SYMBOL>''​ în fișierul cu codul sursă vor fi înlocuite cu ''<​MAPPING>''​ (vezi exemplul de mai jos) | 
-| ''#​if <​COND>''​ / ''#​elseif ​<​COND>''​ / ''#​else''​ / ''#​endif'' ​ | Se verifică secvențial dacă ''<​COND>''​ se evaluează la un literal întreg diferit de ''​0''​. În caz afirmativ, în fișierul rezultat se vor procesa și adauga doar liniile de cod specifice primului bloc a cărui condiție a fost validată | +| ''#​if <​COND>''​ / ''#​elif <​COND>''​ / ''#​else''​ / ''#​endif'' ​ | Se verifică secvențial dacă ''<​COND>''​ se evaluează la un literal întreg diferit de ''​0''​. În caz afirmativ, în fișierul rezultat se vor procesa și adauga doar liniile de cod specifice primului bloc a cărui condiție a fost validată
-| ''#​ifdef <​SYMBOL>''​ / ''#​ifndef <​SYMBOL>''​ / ''#​endif'' ​ | Se verifică dacă ''<​SYMBOL>''​ a fost sau nu definit anterior. | +| ''#​ifdef <​SYMBOL>''​ / ''#​ifndef <​SYMBOL>​''​ / ''#​else''​ / ''#​endif'' ​ | Se verifică dacă ''<​SYMBOL>''​ a fost sau nu definit anterior. | 
-| #include "​HEADER" ​ | Realizeaza preprocesarea fisierului indicat de "​HEADER"​ si adauga liniile de cod preprocesat in fisierul de iesire |+''​#include "​HEADER"​'' ​ | Realizeaza preprocesarea fisierului indicat de "​HEADER"​ si adauga liniile de cod preprocesat in fisierul de iesire|
  
 Executabilul rezultat se va numi ''​so-cpp''​ și va avea următoarea semnătură:​ Executabilul rezultat se va numi ''​so-cpp''​ și va avea următoarea semnătură:​
Line 80: Line 78:
 Semnificația argumentelor este următoarea:​ Semnificația argumentelor este următoarea:​
  
-  * ''​-D <​SYMBOL>​[=<​MAPPING>​]'':​ va defini simbolul cu numele ''<​SYMBOL>''​ și valoarea ''<​MAPPING>'';​ dacă ''<​MAPPING>''​ lipsește, ''<​SYMBOL>''​ va primi valoarea șirului vid (''""''​) +  * ''​-D <​SYMBOL>​[=<​MAPPING>​]''​ sau ''​-D<​SYMBOL>​[=<​MAPPING>​]'':​ va defini simbolul cu numele ''<​SYMBOL>''​ și valoarea ''<​MAPPING>'';​ dacă ''<​MAPPING>''​ lipsește, ''<​SYMBOL>''​ va primi valoarea șirului vid (''""''​). ''<​SYMBOL>''​ poate fi lipit de ''​-D''​ sau nu. 
-  * ''​-I <​DIR>'':​ va adăuga un director în care se vor căuta fișiere incluse de codul sursă folosind directive ''#​include''​ +  * ''​-I <​DIR>''​ sau ''​-I<​DIR>'':​ va adăuga un director în care se vor căuta fișiere incluse de codul sursă folosind directive ''#​include''​ 
-  * ''​-o <​OUTFILE>'':​ va scrie output-ul preprocesat în fișierul ''<​OUTFILE>''​+  * ''​-o <​OUTFILE>''​ sau ''​-o<​OUTFILE>'':​ va scrie output-ul preprocesat în fișierul ''<​OUTFILE>''​
   * ''<​INFILE>'':​ specifică un fișier din care se va citi codul sursă pentru; dacă parametrul lipsește, codul sursă va fi obținut de la consolă (''​stdin''​)   * ''<​INFILE>'':​ specifică un fișier din care se va citi codul sursă pentru; dacă parametrul lipsește, codul sursă va fi obținut de la consolă (''​stdin''​)
  
Line 113: Line 111:
 Se observă că în exemplul de mai sus, nu toate aparițiile șirului de caractere ''​VAR0''​ au fost înlocuite cu ''​1'':​ aparițiile într-un context de literal șir de caractere ale unui simbol introdus prin directiva ''#​define''​ nu trebuie înlocuite. Se observă că în exemplul de mai sus, nu toate aparițiile șirului de caractere ''​VAR0''​ au fost înlocuite cu ''​1'':​ aparițiile într-un context de literal șir de caractere ale unui simbol introdus prin directiva ''#​define''​ nu trebuie înlocuite.
  
-În vederea obținerea ​functionalității specifice unui preprocesor,​ recomandă implementarea unei structur ​de date de tip HashMap. Aceasta va fi folosită pentru a stoca asocieri de tipul ''<​SYMBOL,​ MAPPING>''​.+În vederea obținerii ​functionalității specifice unui preprocesor, ​se recomandă implementarea unei structuri ​de date de tip HashMap. Aceasta va fi folosită pentru a stoca asocieri de tipul ''<​SYMBOL,​ MAPPING>''​.
  
 În urma preprocesării fișierului de intrare, trebuie ca într-o structură de date de În urma preprocesării fișierului de intrare, trebuie ca într-o structură de date de
Line 127: Line 125:
     * ''#​define''​-uri de tip multilinie (respectând aceeași sintaxa ca în C)     * ''#​define''​-uri de tip multilinie (respectând aceeași sintaxa ca în C)
   * Nu trebuie implementat suport pentru ''#​define''​-uri parametrizate (de tip funcție)   * Nu trebuie implementat suport pentru ''#​define''​-uri parametrizate (de tip funcție)
-  * Pentru directivele de tip ''#​if <​COND>''​ / ''#​elseif ​<​COND>'',​ **nu** este necesar să existe suport pentru operații aritmetice, de tipul ''#​if 2 + 3''​. Însa, este necesar sa existe suport pentru utilizarea altor ''#​define''​-uri pe post de ''<​COND>''​.+  * Pentru directivele de tip ''#​if <​COND>''​ / ''#​elif <​COND>'',​ **nu** este necesar să existe suport pentru operații aritmetice, de tipul ''#​if 2 + 3''​. Însa, este necesar sa existe suport pentru utilizarea altor ''#​define''​-uri pe post de ''<​COND>''​.
   * Directiva ''#​include''​ va suporta doar includerea de fisiere header oferite in scheletul temei. Astfel, nu trebuie implementat suport pentru includerea fișierelor din sistem de tipul ''#​include <​stdio.h>''​ sau ''#​include <​stdlib.h>''​   * Directiva ''#​include''​ va suporta doar includerea de fisiere header oferite in scheletul temei. Astfel, nu trebuie implementat suport pentru includerea fișierelor din sistem de tipul ''#​include <​stdio.h>''​ sau ''#​include <​stdlib.h>''​
   * Fișierele header pot fi incluse recursiv (un fișier header poate include alt fișier header)   * Fișierele header pot fi incluse recursiv (un fișier header poate include alt fișier header)
   * Fișierele importate folosind directive ''#​include''​ trebuiesc căutate în directorul în care se află fișierul de input, sau în directorul curent, în cazul în care codul de input este specificat la consolă. Dacă nu este găsit în directorul fișierului,​ el este căutat în toate directoarele specificate folosind parametrul ''​-I'',​ în ordinea în care acestea au fost specificate în linia de comandă.   * Fișierele importate folosind directive ''#​include''​ trebuiesc căutate în directorul în care se află fișierul de input, sau în directorul curent, în cazul în care codul de input este specificat la consolă. Dacă nu este găsit în directorul fișierului,​ el este căutat în toate directoarele specificate folosind parametrul ''​-I'',​ în ordinea în care acestea au fost specificate în linia de comandă.
   * În cazul în care un fișier inclus nu este găsit în niciun director, programul va iesi cu eroare.   * În cazul în care un fișier inclus nu este găsit în niciun director, programul va iesi cu eroare.
-  * Pentru a împărți un șir în tokeni, vă recomandăm să folosiți următoarele delimitatoare:​ ''​ \t[]{}<>​=+-*/​%!&​|^.,:;​()\''​.+  * Pentru a împărți un șir în tokeni, vă recomandăm să folosiți următoarele delimitatoare:​ ''​\t []{}<>​=+-*/​%!&​|^.,:;​()\''​.
   * Executabilul generat va purta numele ''​**so-cpp**''​ pe Linux și ''​**so-cpp.exe**''​ pe Windows.   * Executabilul generat va purta numele ''​**so-cpp**''​ pe Linux și ''​**so-cpp.exe**''​ pe Windows.
   * Pentru Windows, compilarea se va realiza din PowerShell, iar rularea se va face folosind Cygwin.   * Pentru Windows, compilarea se va realiza din PowerShell, iar rularea se va face folosind Cygwin.
   * Makefile-ul pentru Windows trebuie să compileze sursele utilizând flag-ul **/MD**   * Makefile-ul pentru Windows trebuie să compileze sursele utilizând flag-ul **/MD**
   * Dimensiunea maximă a unei linii din fisierul de cod sursa este de **256** de caractere.   * Dimensiunea maximă a unei linii din fisierul de cod sursa este de **256** de caractere.
-  * Buffer-ul folosit pentru citirea ​comenzilor ​poate fi declarat cu dimensiune statică.+  * Buffer-ul folosit pentru citirea ​liniilor ​poate fi declarat cu dimensiune statică.
   * **Verificați valorile întoarse de funcțiile ''​malloc/​calloc/​realloc''​ (în funcție de implementarea aleasă)**. În cazul în care una dintre aceste funcții eșuează, trebuie întors codul de eroare ''​12''​ (este codul de eroare pentru ''​ENOMEM''​). Acest cod de eroare trebuie propagat și returnat până la ieșirea din program. Valoarea erorii este pozitivă.   * **Verificați valorile întoarse de funcțiile ''​malloc/​calloc/​realloc''​ (în funcție de implementarea aleasă)**. În cazul în care una dintre aceste funcții eșuează, trebuie întors codul de eroare ''​12''​ (este codul de eroare pentru ''​ENOMEM''​). Acest cod de eroare trebuie propagat și returnat până la ieșirea din program. Valoarea erorii este pozitivă.
     * exemplu: din ''​main''​ se apelează ''​f1'',​ iar ''​f1''​ apelează ''​f2'':​ dacă eroarea apare în momentul apelului unui ''​malloc''​ în funcția ''​f2'',​ atunci codul de eroare (valorea ''​12''​) va fi întors în ''​f1'',​ din ''​f1''​ va trebui întors tot ''​12'',​ iar din main se va ieși cu același cod de eroare.     * exemplu: din ''​main''​ se apelează ''​f1'',​ iar ''​f1''​ apelează ''​f2'':​ dacă eroarea apare în momentul apelului unui ''​malloc''​ în funcția ''​f2'',​ atunci codul de eroare (valorea ''​12''​) va fi întors în ''​f1'',​ din ''​f1''​ va trebui întors tot ''​12'',​ iar din main se va ieși cu același cod de eroare.
-  * **Nu aveți voie să apelați un alt preprocesor (folosind ''​system'',​ ''​exec'',​ sau orice altă metodă) pentru a implementa functionalitatea cerută**+  * **Nu aveți voie să apelați un alt preprocesor (folosind ''​system'',​ ''​exec'',​ sau orice altă metodă)** pentru a implementa functionalitatea cerută.
  
 ===== Precizări VMChecker ===== ===== Precizări VMChecker =====
  
-Arhiva temei va fi încărcată de două ori pe [[https://​vmchecker.cs.pub.ro/​ui/#​SO|vmchecker]] (Linux și Windows). <​html><​span style="​color:​red;">​Arhiva trimisă trebuie să fie aceeași pe ambele platforme</​span></​html>​ (se vor compara cele două arhive trimise).+Arhiva temei va fi încărcată de două ori pe [[https://​vmchecker.cs.pub.ro/​ui/#​SO|vmchecker]] (Linux și Windows). <​html><​span style="​color:​red; font-weight:​900;">​Arhiva trimisă trebuie să fie aceeași pe ambele platforme</​span></​html>​ (se vor compara cele două arhive trimise, <​html><​span style="​font-weight:​900;">​în caz că va exista vreo diferență între cele două încărcări,​ tema va fi punctată cu 0</​span></​html>​).
  
 <note important>​**Insistăm**,​ dacă mesajul cu roșu nu a fost clar: arhiva care se trimite pe vmchecker trebuie să fie **identică** pe ambele platforme. Puteți folosi ''​md5sum''​ sau ''​sha1sum''​ (sau comenzi similare) asupra arhivelor voastre dacă ați dezvoltat în locuri diferite. </​note>​ <note important>​**Insistăm**,​ dacă mesajul cu roșu nu a fost clar: arhiva care se trimite pe vmchecker trebuie să fie **identică** pe ambele platforme. Puteți folosi ''​md5sum''​ sau ''​sha1sum''​ (sau comenzi similare) asupra arhivelor voastre dacă ați dezvoltat în locuri diferite. </​note>​
Line 155: Line 153:
   * **Windows:​** Fișierul Makefile se va numi ''​Makefile''​.   * **Windows:​** Fișierul Makefile se va numi ''​Makefile''​.
   * Regula de ''​build''​ trebuie să fie cea principală (executată atunci când se dă ''​make''​ fără parametrii)   * Regula de ''​build''​ trebuie să fie cea principală (executată atunci când se dă ''​make''​ fără parametrii)
 +  * Pentru a documenta realizarea temei, vă recomandăm să folosiți template-ul de [[https://​github.com/​systems-cs-pub-ro/​so-assignments/​blob/​master/​README.example.md|aici]]
  
 Executabilul rezultat din operația de compilare și linking se va numi ''​so-cpp''​ pe Linux și ''​so-cpp.exe''​ pe Windows. Executabilul rezultat din operația de compilare și linking se va numi ''​so-cpp''​ pe Linux și ''​so-cpp.exe''​ pe Windows.
Line 213: Line 212:
  
 ===== Resurse necesare realizării temei ===== ===== Resurse necesare realizării temei =====
 +<​hidden>​
 Pentru a clona repo-ul și a accesa resursele temei 1: Pentru a clona repo-ul și a accesa resursele temei 1:
  
Line 221: Line 220:
 student@so-vm:​~/​so-assignments$ cd 1-multi student@so-vm:​~/​so-assignments$ cd 1-multi
 </​code>​ </​code>​
 +</​hidden>​
  
  
Line 252: Line 252:
 ===== Suport, întrebări și clarificări ===== ===== Suport, întrebări și clarificări =====
  
-Pentru întrebări sau nelămuriri legate de temă folosiți [[:​so:​info:​lista-discutii|lista de discuții]] ​sau [[:​so:​info:​documentatie#​social_media|canalul de IRC]].+Pentru întrebări sau nelămuriri legate de temă folosiți ​[[https://​curs.upb.ro/​2021/​mod/​forum/​view.php?​id=183917|forumul temei]]. Recomandăm să căutați eventuale întrebări și în arhiva ​[[:​so:​info:​lista-discutii|listei ​de discuții]], poate veți găsi ceea ce căutați până veți primi un răspuns din partea noastră.
  
 <note important>​ <note important>​
-Orice intrebare pe mailing list e recomandat să aibă subiectul de forma ''​[Tema1][Platforma] Titlul problemei''​Exemple ​de așa da:  +Orice intrebare ​postată ​pe forumul temei e recomandat să conțină o descriere cât mai clară a eventualei problemeÎntrebări ​de forma: "Nu merge X. De ce?" ​ră o descriere mai amănunțită vor primi un răspuns ​mai greu sau vor primi un răspuns sub formă ​de întrebare pentru ​cere lămuriri. 
- +Înainte să postați o întrebare pe forum citiți și celelalte întrebări(dacă există) pentru ​vedea dacă întrebarea voastră a fost deja adresată sub o altă formă(în cazul în care răspunsul din partea echipei vine mai greu este mai rapid să căutați voi deja printre întrebările existente).
-   * [Tema1][Linux] Memory leaks detected, desi am facut free +
-   * [Tema1][Windows] No makefile found +
-   * [Tema1][General] Neclaritate enuntimplementare directiva ​"#define" +
- +
-Exemple de așa nu:  +
- +
-   * Problema la tema 1 +
-   * eroare tema 1 +
-   * eroare la citire +
- +
-Evident, și în cel de-al doilea caz veți primi spunsuri, dar e posibil să le primițmai greu. În conținutul emailului, în caz de probleme mai specifice dați cât mai multe detalii despre ce ați încercat, mesaje de eroare, faceți attach la log-uri de execuție, output-uri de comenzi respectiv ce comenzi ​ați rulat etc+
  
-Revedeți șsecțiunea de [[:​so:​info:​lista-discutii|guidelines pentru lista de discuții SO]]+**ATENȚIE** să nu postați imagini cu părțdin soluția voastră pe forumul pus la dispoziție sau orice alt canal public ​de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.
  
 </​note>​ </​note>​
 +</​hidden>​
  
-</​ifauth>​ 
so/teme/tema-1.1582486335.txt.gz · Last modified: 2020/02/23 21:32 by razvan.crainea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0