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
[PC] [AVR] [PIC] Zrozumieć size_t...
- Antystatyczny
- Geek

- Posty: 1177
- Rejestracja: czwartek 03 wrz 2015, 22:02
[PC] [AVR] [PIC] Zrozumieć size_t...
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.
- mokrowski
- User

- Posty: 190
- Rejestracja: czwartek 08 paź 2015, 20:50
- Lokalizacja: Tam gdzie Centymetro
Re: [PC] [AVR] [PIC] Zrozumieć size_t...
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ę.
,,Myślenie nie jest łatwe, ale można się do niego przyzwyczaić" - Alan Alexander Milne: Kubuś Puchatek
- Antystatyczny
- Geek

- Posty: 1177
- Rejestracja: czwartek 03 wrz 2015, 22:02
Re: [PC] [AVR] [PIC] Zrozumieć size_t...
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!
Pozdrawiam!
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.
Wróć do „Pisanie programów w C”
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości