Powrót

Mikroprocesorowa ośla łączka, część 26

Powstanie języka programowania C++ przyniosło dodatkowo bardzo przydatną cechę, jaką jest możliwość przeciążania funkcji. W części poświęconej pojęciu obiektu była okazja zapoznania się z tym zjawiskiem. Teraz zostanie to omówione bliżej.

Przeciążanie funkcji w C++ pozwala na utworzenie kilku o tej samej nazwie, jednak muszą się one różnić liczbą lub typem argumentów. Użycie przeciążonej funkcji oznacza, że kompilator dobiera odpowiednią na podstawie przekazanych danych, jakimi są parametry wywołania funkcji (będzie próbował dopasować aktualne użycie funkcji wraz z jej parametrami do znanych możliwych wariantów i taki wariant zostanie zastosowany do generacji kodu wynikowego programu). Takie rozwiązanie pozwala na poprawę czytelności kodu.

Algorytm konwersji liczb całkowitych

W tworzeniu programów dla mikrokontrolerów często występującym elementem jest zaprezentowanie liczb w formie czytelnej dla człowieka. Sam algorytm dla liczb całkowitych nie jest zbyt skomplikowany i polega na rozłożeniu liczby na poszczególne cyfry. Mając je wydzielone (w formie binarnej) wystarczy do każdej dodać stałą o wartości 30 hex by uzyskać je jako znaki ASCII (kody znaków cyfr w zestawie ASCII różnią się od wartości binarnej o wymienioną stałą). Wydzielenie poszczególnych cyfr z liczby polega na podzieleniu jej przez 10 oraz obliczeniu reszty z tego dzielenia. Reszta z dzielenia przez 10 daje wynik z zakresu 0…10 (wydziela pojedynczą cyfrę jako liczbę binarną). Wynik dzielenia przez 10 (w arytmetyce całkowitoliczbowej) daje liczbę do dalszego przetwarzania. Sam algorytm jest operacją iteracyjną i wymaga kilku iteracji. Uzyskane kolejne cyfry tworzą ciąg znaków w odwrotnej kolejności (pierwsza wyliczona cyfra jest najmniej znaczącą, skrajnie prawą w zapisie stosowanym przez ludzi).

Z operacją konwersji postaci binarnej na znakową wiąże się liczba znaków, na które ma być przekształcona dana wartość (z ewentualnym umieszczeniem znaków spacji przed liczbą, gdy liczba jest za mała). W wielu przypadkach ważne jest, by wynik konwersji miał stałą szerokość. Przykładem może być konwersja wyników odczytanych z przetwornika analogowo-cyfrowego i wysłanych via kanał szeregowy z podziałem na wiersze (przydatną cechą do przeglądania są kolumny liczb o stałej szerokości). W innych przypadkach pożądane jest, by wynik nie zawierał znaków spacji przed liczbą (wyświetlając przykładowo adres IP na wyświetlaczu powstał ciąg znaków bez spacji wewnątrz: 192.168.1.44 mamy tu konwersję na łańcuch o trzech, dwóch oraz jednym znaku). Z kolei przy budownie zegara zachodzi potrzeba wyświetlenia aktualnego czasu, przykładowo na wyświetlaczu LCD. Przetwarzając liczbę godzin na postać znakową oczekuje się, by wynik konwersji zawierał znak spacji (jeżeli liczba godzin jest jednocyfrowa). Ludzkie przyzwyczajenia jednak preferują, by liczba minut oraz sekund w takich przypadkach zawierała znak zera przed jednocyfrową liczbą minut czy sekund.

Algorytm konwersji liczb zmiennoprzecinkowych

Konwersja liczb całkowitych w porównaniu do zmiennoprzecinkowych jest operacją prostą. Dla liczb ułamkowych dochodzi kilka działań, które nie występują w konwersji liczb całkowitych. Pierwszym elementem jest zaokrąglanie liczby ułamkowej do liczby całkowitej. Samo zaokrąglenie dodatniej liczby ułamkowej do najbliższej liczby całkowitej wymaga dodania stałej o wartości 0,5 i ucięciu części ułamkowej – ideę pokazuje rysunek 1.

Rysunek 1

(…)

——– ciach! ——–

To jest tylko fragment artykułu, którego pełna wersja ukazała się w lipcowym numerze czasopisma Zrozumieć Elektronikę (ZE 7/2026). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 7/2026 znajduje się tutaj.

Andrzej Pawluczuk
apawluczuk@vp.pl

Uwaga! Wskazówki, jak nabyć pełne wersje dowolnych numerów ZE znajdują się na stronie:
https://piotr-gorecki.pl/n11.