Differences

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

Link to this comparison view

programare:teme_2017:tema2_2017_cbd [2017/11/19 23:55]
relu.dragan [Instrucţiuni de utilizare]
programare:teme_2017:tema2_2017_cbd [2017/12/12 15:21] (current)
relu.dragan [Actualizari]
Line 7: Line 7:
 **Autor inițial:** Stefan Bucur **Autor inițial:** Stefan Bucur
  
-**Deadline hard:​** ​11.12.2017 23:55+**Deadline hard:​** ​12.12.2017 23:55
  
 <note warning> <note warning>
Line 16: Line 16:
 Va recomandam sa cititi intregul enunt al temei inainte de a va apuca sa implementati. Desi este lung, contine foarte multe precizari **esentiale** in evitarea anumitor **bug-uri**. Inainte de a pune o intrebare pe forum, asigurati-va ca raspunsul acesteia nu este continut in enuntul temei. Va recomandam sa cititi intregul enunt al temei inainte de a va apuca sa implementati. Desi este lung, contine foarte multe precizari **esentiale** in evitarea anumitor **bug-uri**. Inainte de a pune o intrebare pe forum, asigurati-va ca raspunsul acesteia nu este continut in enuntul temei.
 </​note>​ </​note>​
 +
 +====== Actualizari ======
 +   * 20.11 11.09 - Modificare enunt, indice de start
 +   * 21.11 17.34 - Modificare enunt, structura unui bloc
 +   * 21.11 22.58 - Modificare teste, bug in ref-uri la comanda FILL
 +   * 29.11 00:45 - Modificare testul input/​advanced/​test6.in,​ indexul de la comanda FILL de la linia 9 a fost corectat
 +   * 12.12 15:21 - Prelungire deadline
 +
 +
 ====== Obiective ====== ====== Obiective ======
  
Line 56: Line 65:
 Figura de mai jos ilustrează structura detaliată a arenei, în decursul execuţiei programului:​ Figura de mai jos ilustrează structura detaliată a arenei, în decursul execuţiei programului:​
  
-{{ programare:tema4arenadetailed.png }} +{{:programare:teme_2017:​tema2:​arena_detailedd.png|}}
 ==== Structura unui bloc ==== ==== Structura unui bloc ====
  
Line 64: Line 72:
      * Primul întreg reprezintă indexul de start al blocului următor de memorie din arenă (aflat imediat "la dreapta"​ blocului curent, dacă privim arena ca pe o succesiune de octeţi de la stanga la dreapta). Se consideră că un bloc începe cu secţiunea de gestiune, şi toţi indicii la blocuri vor fi trataţi ca atare. Dacă blocul este ultimul în arenă (cel mai "din dreapta"​),​ atunci valoarea primului întreg din secţiune va fi ''​0''​.      * Primul întreg reprezintă indexul de start al blocului următor de memorie din arenă (aflat imediat "la dreapta"​ blocului curent, dacă privim arena ca pe o succesiune de octeţi de la stanga la dreapta). Se consideră că un bloc începe cu secţiunea de gestiune, şi toţi indicii la blocuri vor fi trataţi ca atare. Dacă blocul este ultimul în arenă (cel mai "din dreapta"​),​ atunci valoarea primului întreg din secţiune va fi ''​0''​.
      * Cel de-al doilea întreg din secţiune reprezintă indexul de start al blocului imediat anterior din arenă. Dacă blocul este primul în arenă, atunci valoarea acestui întreg va fi ''​0''​.      * Cel de-al doilea întreg din secţiune reprezintă indexul de start al blocului imediat anterior din arenă. Dacă blocul este primul în arenă, atunci valoarea acestui întreg va fi ''​0''​.
-     * Cel de-al treilea întreg din secţiune reprezintă lungimea ​totală a blocului, adică lungimea celor două secţiuni la un loc (nu doar a datelor alocate utilizatorului).+     * Cel de-al treilea întreg din secţiune reprezintă lungimea ​sectiunii de date (a datelor alocate utilizatorului).
   * A doua secţiune conţine ''​datele efective''​ ale utilizatorului. Secţiunea are lungimea în octeţi egală cu dimensiunea datelor cerută de utilizator la apelul funcţiei de alocare. Indicele returnat de alocator la o nouă alocare reprezintă începutul acestei secţiuni din noul bloc, şi '''​nu'''​ începutul primei secţiuni, întrucât partea de gestiune a memoriei trebuie să fie complet transparentă pentru utilizator.   * A doua secţiune conţine ''​datele efective''​ ale utilizatorului. Secţiunea are lungimea în octeţi egală cu dimensiunea datelor cerută de utilizator la apelul funcţiei de alocare. Indicele returnat de alocator la o nouă alocare reprezintă începutul acestei secţiuni din noul bloc, şi '''​nu'''​ începutul primei secţiuni, întrucât partea de gestiune a memoriei trebuie să fie complet transparentă pentru utilizator.
  
Line 77: Line 85:
 ==== Înlănţuirea blocurilor ==== ==== Înlănţuirea blocurilor ====
  
-După cum se poate observa din figura de mai sus, la începutul arenei sunt rezervaţi 4 octeţi care reprezintă ​''​indicele ​de start'' ​indicele primului bloc (cel mai "din stânga"​) din arenă. Dacă arena nu conţine niciun bloc (de exemplu, imediat după iniţializare),​ acest indice este ''​0''​.+''​Indicele ​de start'' ​reprezinta ​indicele primului bloc (cel mai "din stânga"​) din arenă. Acesta trebuie stocat de voi intr-o variabila separata. Dacă arena nu conţine niciun bloc (de exemplu, imediat după iniţializare),​ acest indice este ''​0''​.
  
 ''​Indicele de start''​ marchează începutul ''​lanţului de blocuri''​ din arenă: din acest indice putem ajunge la începutul primului bloc, apoi folosind secţiunea de gestiune a primului bloc putem găsi începutul celui de-al doilea bloc, şi asa mai departe, până când ajungem la blocul care are indexul blocului următor 0 (este ultimul bloc din arenă). În acest mod putem traversa toate blocurile din arenă, şi de asemenea să identificăm spaţiile libere din arenă, care reprezintă spaţiile dintre două blocuri succesive. ​ ''​Indicele de start''​ marchează începutul ''​lanţului de blocuri''​ din arenă: din acest indice putem ajunge la începutul primului bloc, apoi folosind secţiunea de gestiune a primului bloc putem găsi începutul celui de-al doilea bloc, şi asa mai departe, până când ajungem la blocul care are indexul blocului următor 0 (este ultimul bloc din arenă). În acest mod putem traversa toate blocurile din arenă, şi de asemenea să identificăm spaţiile libere din arenă, care reprezintă spaţiile dintre două blocuri succesive. ​
Line 89: Line 97:
 Este de remarcat faptul că lanţul poate fi parcurs în ambele sensuri: dintr-un bloc putem ajunge atât la vecinul din dreapta, cât şi la cel din stânga. Este de remarcat faptul că lanţul poate fi parcurs în ambele sensuri: dintr-un bloc putem ajunge atât la vecinul din dreapta, cât şi la cel din stânga.
  
-De asemenea, atunci când este alocat un bloc nou sau este eliberat ​unui vechi, '''​lanţul de blocuri trebuie modificat'''​. Astfel, la alocarea unui nou bloc de memorie, trebuie să ţineţi cont de următoarele:​+De asemenea, atunci când este alocat un bloc nou sau este eliberat ​unul vechi, '''​lanţul de blocuri trebuie modificat'''​. Astfel, la alocarea unui nou bloc de memorie, trebuie să ţineţi cont de următoarele:​
   * Spaţiul liber în care este alocat noul bloc este mărginit de cel mult două blocuri vecine. Secţiunile de gestiune ale acestor vecini trebuie modificate astfel:   * Spaţiul liber în care este alocat noul bloc este mărginit de cel mult două blocuri vecine. Secţiunile de gestiune ale acestor vecini trebuie modificate astfel:
      * Indexul blocului următor din structura de gestiune a blocului din stânga trebuie să indice către noul bloc. Dacă blocul din stânga nu există, atunci este modificat indicele de start.      * Indexul blocului următor din structura de gestiune a blocului din stânga trebuie să indice către noul bloc. Dacă blocul din stânga nu există, atunci este modificat indicele de start.
Line 118: Line 126:
         * La începutul liniei va fi afişat indicele curent, în format hexazecimal,​ cu 8 cifre hexa majuscule.         * La începutul liniei va fi afişat indicele curent, în format hexazecimal,​ cu 8 cifre hexa majuscule.
         * Apoi este afişat un TAB (''​\t''​) , urmat de 16 octeţi, afişati separaţi printr-un spaţiu şi în format hexazecimal,​ cu 2 cifre hexa majuscule fiecare. Între cel de-al 8-lea şi cel de-al 9-lea octet se va afişa un spaţiu suplimentar.         * Apoi este afişat un TAB (''​\t''​) , urmat de 16 octeţi, afişati separaţi printr-un spaţiu şi în format hexazecimal,​ cu 2 cifre hexa majuscule fiecare. Între cel de-al 8-lea şi cel de-al 9-lea octet se va afişa un spaţiu suplimentar.
-        * Nu este necesar sa realizati conversii de la zecimal la hexazecimal,​ puteti folosi ''​printf("​%02X""​)''​ si ''​printf("​%08X"​)''​ pentru afisare.+        ​* Daca dimensiunea arenei nu este multiplu de 16, atunci pe ultima linie se vor afisa ultimii ARENA_SIZE % 16 octeti. 
 +        ​* Nu este necesar sa realizati conversii de la zecimal la hexazecimal,​ puteti folosi ''​printf("​%02X"​)''​ si ''​printf("​%08X"​)''​ pentru afisare.
   - **''​ALLOC <​SIZE>''​**   - **''​ALLOC <​SIZE>''​**
      * Comanda va aloca ''​SIZE''​ octeţi de memorie din arenă, unde ''​SIZE''​ e o valoare strict pozitiva. Ea va trebui să găsească o zonă liberă suficient de mare (care să încapă ''​SIZE''​ octeţi + secţiunea de gestiune), şi să rezerve un bloc '''​la începutul'''​ zonei (nu în mijloc, nu la sfârşit). Va trebui folosită prima zonă liberă validă, într-o căutare de la stânga la dreapta.      * Comanda va aloca ''​SIZE''​ octeţi de memorie din arenă, unde ''​SIZE''​ e o valoare strict pozitiva. Ea va trebui să găsească o zonă liberă suficient de mare (care să încapă ''​SIZE''​ octeţi + secţiunea de gestiune), şi să rezerve un bloc '''​la începutul'''​ zonei (nu în mijloc, nu la sfârşit). Va trebui folosită prima zonă liberă validă, într-o căutare de la stânga la dreapta.
Line 241: Line 250:
      * ''​valgrind --version''​      * ''​valgrind --version''​
      * ''​sudo apt-get install valgrind''​      * ''​sudo apt-get install valgrind''​
 +  * Pentru a rula **valgrind** manual pe un test:
 +     * ''​valgrind --leak-check=full ./alocator < input/​random/​test5.in''​
   * Arhiva contine si un **schelet de cod** in directorul ''​skel/''​ care realizeaza doar parsarea comenzilor.   * Arhiva contine si un **schelet de cod** in directorul ''​skel/''​ care realizeaza doar parsarea comenzilor.
  
Line 272: Line 283:
      * teste **advanced**:​ 18 puncte fiecare test trecut + 2 puncte rezolvare erori valgrind      * teste **advanced**:​ 18 puncte fiecare test trecut + 2 puncte rezolvare erori valgrind
      * teste **random**: 10 puncte fiecare test trecut + 1 punct rezolvare erori valgrind      * teste **random**: 10 puncte fiecare test trecut + 1 punct rezolvare erori valgrind
-     * teste **bonus**: 10 puncte fiecare test trecut + 1 punct rezolvare erori valgrind +     * teste **bonus**: 10 puncte fiecare test trecut + 1 punct rezolvare erori valgrind  ​
-  * cele 100 puncte pentru README și aspectul codului sursă s-au împărțit astfel:+
      * existența unui README relevant: 20 puncte      * existența unui README relevant: 20 puncte
      * claritatea codului sursă: 80 puncte      * claritatea codului sursă: 80 puncte
 +  * cele 80 puncte pentru claritatea codului sursă s-au împărțit astfel:
 +     * am scăzut 30 puncte dacă codul nu este modularizat
 +     * am scăzut 10 puncte dacă codul este modularizat,​ dar folosește funcții foarte lungi
 +     * am scăzut 20 puncte pentru warning-uri de compilare ​    
 +     * am scăzut 20 puncte dacă memoria nu a fost alocată dinamic
  
 ====== FAQ ====== ====== FAQ ======
programare/teme_2017/tema2_2017_cbd.1511128508.txt.gz · Last modified: 2017/11/19 23:55 by relu.dragan
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