This shows you the differences between two versions of the page.
programare:teme_2017:tema2_2017_cbd [2017/11/20 11:12] relu.dragan [Înlănţuirea blocurilor] |
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 |
- | + | ||
- | ====== Actualizari ====== | + | |
- | 20.11 11.09 - Modificare enunt, indice de start | + | |
<note warning> | <note warning> | ||
Line 19: | 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 59: | 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 67: | 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 92: | 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 121: | 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 244: | 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 275: | 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 ====== |