Strona 1 z 1

[PC] [AVR] [PIC] Zrozumieć size_t...

: czwartek 24 gru 2015, 02:49
autor: Antystatyczny
Witam

Dziś na warsztat wziąłem typ size_t, który wypłynął mi podczas przeglądania informacji o module time.h.

Proszę mnie poprawić, jeśli się mylę:

Typ size_t jest używany do zwracania rozmiaru jakiegoś obiektu, jak np. tablicy czy struktury. Typ ten jest zależny od implementacji i dlatego w różnych architekturach jego pojemność może się różnić. Np. w AVR8 jego pojemność wynosi 16 bitów, w PC x86 32 bity, a w PC x64 64 bity. Na zmiennych tego typu możemy wykonywać operacje arytmetyczne.

Mam też pytanie: Jeśli jest to typ jak każdy inny, to czy można rzutować na ten typ i czy w ogóle trzeba rzutować na ten typ? Rzutowanie w drugą stronę również mnie zastanawia...

Dajmy na to mamy zmienną typu uint8_t i do niej chcemy przypisać wartość zwróconą przez funkcję. Funkcja ta zwraca jednak wartość typu size_t (ilość zapisanych bajtów w jakiejś tam tablicy). Próbuję więc wpisać wartość typu size_t do zmiennej typu uint8_t. Można tak? Trzeba? A może tak się nie robi?

Nie wykonywałem jeszcze prób kompilacji takich operacji, bo zastanawiam się, czy w ogóle korzystać z size_t w przypadku, gdy lwia część moich softów pisana jest na ośmiobitowe maszyny.

Pozdrawiam

Re: [PC] [AVR] [PIC] Zrozumieć size_t...

: piątek 25 gru 2015, 12:59
autor: mokrowski
Antystatyczny pisze:Typ size_t jest używany do zwracania rozmiaru jakiegoś obiektu, jak np. tablicy czy struktury. Typ ten jest zależny od implementacji i dlatego w różnych architekturach jego pojemność może się różnić. Np. w AVR8 jego pojemność wynosi 16 bitów, w PC x86 32 bity, a w PC x64 64 bity. Na zmiennych tego typu możemy wykonywać operacje arytmetyczne.

Tak. Nie mylisz się.
Antystatyczny pisze:Mam też pytanie: Jeśli jest to typ jak każdy inny, to czy można rzutować na ten typ i czy w ogóle trzeba rzutować na ten typ? Rzutowanie w drugą stronę również mnie zastanawia...

Znów masz rację z rzutowaniem. Rzutować można tak w jedną jak i w drugą stronę. Pamiętaj o rozróżnieniu pomiędzy: rzutowaniem (potencjalnie niebezpieczne bo rzutujesz z "większego typu" na "mniejszy" np. long int -> int), promocją (zmieniasz typ z "mniejszego typu" na "większy" np. uint8_t -> long unsigned int). W tym 2 przypadku żadnego niebezpieczeństwa nie ma.
Antystatyczny pisze:Dajmy na to mamy zmienną typu uint8_t i do niej chcemy przypisać wartość zwróconą przez funkcję. Funkcja ta zwraca jednak wartość typu size_t (ilość zapisanych bajtów w jakiejś tam tablicy). Próbuję więc wpisać wartość typu size_t do zmiennej typu uint8_t. Można tak? Trzeba? A może tak się nie robi?

Oczywiście że się robi. Czasem jedynie trzeba rzutować.
Antystatyczny pisze:Nie wykonywałem jeszcze prób kompilacji takich operacji, bo zastanawiam się, czy w ogóle korzystać z size_t w przypadku, gdy lwia część moich softów pisana jest na ośmiobitowe maszyny.

A to już jest pytanie o przenośność oprogramowania. Popatrz na biblioteki ARM'ów oraz AVR'ów. Pomimo że wszyscy wiedzą że (chyba) nie będziesz miał string'ów o długości większej niż 255 bajtów, zwracany jest w strlen(..) size_t. Takie optymalizacje jak zmniejszenie typu do np. uint8_t, zostawiał bym kompilatorowi. Lepiej być zgodny ze standardem bo tworzysz zmiany które mogą odbyć się czkawką. To nie jest najlepsze miejsce na optymalizację.

Re: [PC] [AVR] [PIC] Zrozumieć size_t...

: piątek 25 gru 2015, 13:07
autor: Antystatyczny
Dziękuję za rozwianie moich wątpliwości, śmiało zastosuję size_t. Będę miał jeszcze kilka pytań dotyczących modułu Time, ale to już w osobnym wątku, bo będą dotyczyły konwersji.

Pozdrawiam!