This shows you the differences between two versions of the page.
programare:tutoriale:good_practices [2022/01/24 16:19] stefan.popa99 [Cuprins] |
programare:tutoriale:good_practices [2022/01/24 16:28] (current) stefan.popa99 [Tips & tricks] |
||
---|---|---|---|
Line 248: | Line 248: | ||
</code> | </code> | ||
- | Compilarea se realizează prin rularea comenzii ''%%gcc%%'' împreună cu toate fișierele ''%%.c%%'' necesare (pentru compilare nu este nevoie să dăm ca parametrii și fișierele header): | + | Compilarea se realizează prin rularea comenzii ''%%gcc%%'' împreună cu toate fișierele ''%%.c%%'' necesare (pentru compilare nu este nevoie să dăm ca parametri și fișierele header): |
<code bash> | <code bash> | ||
Line 262: | Line 262: | ||
=== De ce? === | === De ce? === | ||
- | Dacă tot codul pentru o aplicație ar fi scris într-o singură funcție, el ar fi foarte de greu de extins în cazul în care s-ar implementa o funcționalitate nouă. Majoritatea aplicațiilor importante au câteva sute de mii de linii de cod, iar urmărirea modificări unei variabile de-a lungul programului ar presupune o perioadă lungă de timp. | + | Dacă tot codul pentru o aplicație ar fi scris într-o singură funcție, el ar fi foarte de greu de extins în cazul în care s-ar implementa o funcționalitate nouă. Majoritatea aplicațiilor importante au câteva sute de mii de linii de cod, iar urmărirea modificării unei variabile de-a lungul programului ar presupune o perioadă lungă de timp. |
=== Cum? === | === Cum? === | ||
Line 278: | Line 278: | ||
Numele funcțiilor ar trebui să definească cât mai bine scopul acesteia. | Numele funcțiilor ar trebui să definească cât mai bine scopul acesteia. | ||
- | == Câti parametrii ar trebui să aibă o funcție? == | + | == Câti parametri ar trebui să aibă o funcție? == |
- | Nu este recomadat ca o funcție să conțină un număr foarte mare de parametrii (majoritatea funcțiilor au cel mult 6-7 argumente). Dacă există prea mulți parametrii, este dificil să se înțeleagă scopul acelei porțiuni de cod. | + | Nu este recomadat ca o funcție să conțină un număr foarte mare de parametri (majoritatea funcțiilor au cel mult 6-7 argumente). Dacă există prea mulți parametri, este dificil să se înțeleagă scopul acelei porțiuni de cod. |
== Când ar trebui să am un parametru declarat const într-o funcție? == | == Când ar trebui să am un parametru declarat const într-o funcție? == | ||
- | Este de preferat ca toți parametrii care sunt nu sunt constanți într-o funcție să fie marcați ca și ''%%const%%''. Astfel, la încercarea eronată de modificare a acestora, se va genera o eroare de compilare. | + | Este de preferat ca toți parametri care nu sunt modificați într-o funcție să fie marcați ca și ''%%const%%''. Astfel, la încercarea eronată de modificare a acestora, se va genera o eroare de compilare. |
- | == Când este bine să trimit variabile parametrii la o funcție și când nu? == | + | == Când este bine să trimit variabile parametri la o funcție și când nu? == |
Limbajul ''%%C%%'' folosește transmiterea prin valoare și nu prin referință a parametrilor unei funcții. Astfel, la apelul unei funcții se face o copie **într-o altă zonă de memorie** a argumentelor. | Limbajul ''%%C%%'' folosește transmiterea prin valoare și nu prin referință a parametrilor unei funcții. Astfel, la apelul unei funcții se face o copie **într-o altă zonă de memorie** a argumentelor. | ||
Line 304: | Line 304: | ||
ar fi necesară copierea a 30 de bytes dacă se dorește pasarea unei structuri ''%%student_t%%'' ca parametru. O modalitate de a evita copierea, este pasarea unui pointer la această structură. (sizeof(''%%student_t *%%'') = 4). | ar fi necesară copierea a 30 de bytes dacă se dorește pasarea unei structuri ''%%student_t%%'' ca parametru. O modalitate de a evita copierea, este pasarea unui pointer la această structură. (sizeof(''%%student_t *%%'') = 4). | ||
- | Așadar, pentru structurile în limbajul ''%%C%%''se recomandă pasarea lor ca pointer. | + | Așadar, pentru structurile în limbajul ''%%C%%'' se recomandă pasarea lor ca pointer. |
==== Tips & tricks ==== | ==== Tips & tricks ==== | ||
Line 353: | Line 353: | ||
{ | { | ||
if (file_name == NULL) { | if (file_name == NULL) { | ||
- | return FILE_SUCCESS; | + | return FILE_NULL_FILENAME; |
} | } | ||
Line 474: | Line 474: | ||
* un mecanism de interschimbare a două valori de orice tip; | * un mecanism de interschimbare a două valori de orice tip; | ||
- | Pentru a interschimba două valori de orice tip, ar trebui să ne gândim ce înseamnă a interschimba un element ''%%v[i]%%'' cu un alt element ''%%v[j]%%''? Cum v este de tipul ''%%void*%%'', nu este permis să folosim ''%%v[i]%%'',deoarece printr-un pointer ''%%void*%%'' nu știm ce elemente avem. Însă, cunoaștem dimensiunea unui ''%%singur%%'' element din vector - ''%%elem_size%%'', putem determina adresa de început al celui de-al i-lea element din vector, care va fi la ''%%v + i * elem_size%%'' . Pentru a interschimba valorile, vom copia cu funcția ''%%memcpy%%'' un număr de''%%elem_size%%'' bytes de la adresa determinată pentru elementul ''%%i%%'' într-un buffer temporar (similar cu ''%%temp = v[i];%%''), apoi copiem de la adresa corespunzătoare lui ''%%j%%'' la cea a lui ''%%i%%'' (similar cu ''%%v[i] = v[j];%%'', apoi din bufferul temporar la adresa corespunzătoare lui j (similar cu ''%%v[j] = tmp;%%''). | + | Pentru a interschimba două valori de orice tip, ar trebui să ne gândim ce înseamnă a interschimba un element ''%%v[i]%%'' cu un alt element ''%%v[j]%%''? Cum v este de tipul ''%%void*%%'', nu este permis să folosim ''%%v[i]%%'',deoarece printr-un pointer ''%%void*%%'' nu știm ce elemente avem. Însă, cunoaștem dimensiunea unui ''%%singur%%'' element din vector - ''%%elem_size%%'', putem determina adresa de început al celui de-al i-lea element din vector, care va fi la ''%%v + i * elem_size%%'' . Pentru a interschimba valorile, vom copia cu funcția ''%%memcpy%%'' un număr de ''%%elem_size%%'' bytes de la adresa determinată pentru elementul ''%%i%%'' într-un buffer temporar (similar cu ''%%temp = v[i];%%''), apoi copiem de la adresa corespunzătoare lui ''%%j%%'' la cea a lui ''%%i%%'' (similar cu ''%%v[i] = v[j];%%'', apoi din bufferul temporar la adresa corespunzătoare lui j (similar cu ''%%v[j] = tmp;%%''). |
O posibilă implementare a funcției este următoarea: | O posibilă implementare a funcției este următoarea: |