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

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1177
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 24 gru 2015, 02:49

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
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
mokrowski
User
User
Posty: 190
Rejestracja: czwartek 08 paź 2015, 20:50
Lokalizacja: Tam gdzie Centymetro

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

Postautor: mokrowski » piątek 25 gru 2015, 12:59

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

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1177
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » piątek 25 gru 2015, 13:07

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!
"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 4 gości