Differences

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

Link to this comparison view

programare:tutoriale:good_practices [2022/01/21 02:03]
radu.nichita created
programare:tutoriale:good_practices [2022/01/24 16:28] (current)
stefan.popa99 [Tips & tricks]
Line 27: Line 27:
     * [[#​când_fac_funcții|Când fac funcții?]]     * [[#​când_fac_funcții|Când fac funcții?]]
     * [[#​cum_aleg_numele_de_funcții|Cum aleg numele de funcții?]]     * [[#​cum_aleg_numele_de_funcții|Cum aleg numele de funcții?]]
-    * [[#câti_parametrii_ar_trebui_să_aibă_o_funcție|Câti ​parametrii ​ar trebui să aibă o funcție?]]+    * [[#câti_parametri_ar_trebui_să_aibă_o_funcție|Câti ​parametri ​ar trebui să aibă o funcție?]]
     * [[#​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?]]     * [[#​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?]]
-    * [[#​când_este_bine_să_trimit_variabile_parametrii_la_o_funcție_și_când_nu|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|Când este bine să trimit variabile ​parametri ​la o funcție și când nu?]]
   * [[#​tips__tricks|Tips & tricks]]   * [[#​tips__tricks|Tips & tricks]]
     * [[#​programare_defensivă|Programare defensivă]]     * [[#​programare_defensivă|Programare defensivă]]
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:​
programare/tutoriale/good_practices.1642723382.txt.gz · Last modified: 2022/01/21 02:03 by radu.nichita
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