This shows you the differences between two versions of the page.
programare:tutoriale:good_practices [2022/01/24 16:20] stefan.popa99 [Modularizare cod] |
programare:tutoriale:good_practices [2022/01/24 16:28] (current) stefan.popa99 [Tips & tricks] |
||
---|---|---|---|
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 284: | Line 284: | ||
== 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 parametri 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 parametri la o funcție și când nu? == | == Când este bine să trimit variabile parametri la o funcție și când nu? == | ||
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: |