Wpis z mikrobloga

Mam problem odnośnie #programowanie #cpp
Załóżmy, że jest zdefiniowana np. następująca struktura:

struct struktura {
uint16_t x;
uint8_t y;
uint8_t z;
}
I chciałbym pobrać np. 2 bajt z tej struktury, w tym przypadku była by to bardziej znacząca część zmiennej x. Jak to zrobić?
W tej chwili robiłem to w ten sposób, że kopiowałem strukturę do tablicy charów. Jednak chcę uniknąć tej operacji, ze względu na długi czas wykonywania (na mikrokontrolerze) i chcę mieć bezpośredni dostęp do kolejnych bajtów.

memcpy(buffor, (void *)&s, sizeof(struktura));
Jakieś pomysły? :)
  • 14
@wykoszonytrawnik: imo lepiej castować na uint8_t* czy tam unsigned char*.

ale ja osobiście bałbym się castować całą strukturę i wyciągać pojedyncze bajty bojąc się, że kompilator może zrobić psikusa i celem jakiejś optymalizacji przestawi sobie kolejność zmiennych w strukturze, co innego castować samą składową x - tutaj wystarczy znać endianowość.
@YuiMizuno: Co właściwie miałaby robić druga linijka? Primo, ptr+2 wskaże na trzeci (a nie drugi) bajt struktury. Secundo, jeżeli potraktujesz go wskaźnikiem na int16_t, to wartość będzie zbudowana z dwóch bajtów, trzeciego i czwartego. Tertio, branie tych wartości ze znakiem nie ma najmniejszego sensu, szczególnie, że oryginały były unsigned. Wreszcie quarto, arytmetyka wskaźników trochę tu zaciemnia obraz.

@wykoszonytrawnik: Ja zrobiłbym tak:

uint8_t * byte_array = (uint8_t *) &s
uint8_t
@cochese: źle przeczytałem, myślałem, że chodzi o pobranie "2 bajtów", a nie "drugiego bajtu". Dlatego zrobiłem rzutowanie na char* i jego zwiększenie.
A czy ze znakiem czy bez to już kwestia co potem robi z tymi danymi.