This shows you the differences between two versions of the page.
programare:tutoriale:good_practices [2022/01/24 16:27] stefan.popa99 [Tips & tricks] |
programare:tutoriale:good_practices [2022/01/24 16:28] (current) stefan.popa99 [Tips & tricks] |
||
---|---|---|---|
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: |