Wpis z mikrobloga

@kebab-case: Ja tak robię, ale głównie po to, żeby w debugerze łatwiej było eksplorować przychodzące ramki :)

Pomału przechodzę na std::variable, ale w embedded nie bardzo jest na to miejsce, zwłaszcza gdy trzeba ten obszar pamięci potem wysłać.
@Razi91: To napisz tu koledze jak to robisz :) Ja bym po prostu kazał strukturze wskazywać pod adres gdzie była unia i to by było najprostsze skonwertowanie gdzie struktura by spróbowała zinterpretowac pamięc spod unii na swoje składowe. A tobie może chodzi o jakieś mapowanie?
*std::variant, nie variable!

@kebab-case: Mam ramkę ogólną, a potem poszczególne przypadki w zależności od „funkcji”. Nic nie konwertuję, po prostu pakuję struktury jako pola w unii. Problem dopiero się pojawia przy dynamicznych strukturach.

Przede wszystkim trzeba zrozumieć różnicę pomiędzy strukturą, a unią, że w unii wszystko jest w tym samym obszarze pamięci (każde pole zaczyna się w pamięci w tym samym miejscu)
Ja bym po prostu kazał strukturze wskazywać pod adres gdzie była unia i to by było najprostsze skonwertowanie gdzie struktura by spróbowała zinterpretowac pamięc spod unii na swoje składowe.


@kebab-case: Hmm, jak rozumiem unia i struktura musiałyby wtedy mieć identyczne pola o identycznych typach (kolejność chyba też ma znaczenie bo padding?), bo w przeciwnym wypadku to by się chyba wysrało? Ale nadal kurde bym się chyba bał ryzykować i wolałbym jawnie
@Khaine: Nie. Jak masz w unii int i float, to zapisując cokolwiek do tego float rozwalisz to co jest int. Oba pola współdzielą tą samą pamięć. W podanym przykładzie (dla x86) taka unia będzie zajmowała 4 bajty, a struktura 8 bajtów.
@Razi91: No właśnie, pamiętam o tym, że unia współdzieli obszar pamięci, dlatego to pytanie które zadał op jest trochę niefortunne. Bo odpowiedź to, ze w sumie można ale nie zawsze to ma sens.
@Razi91: No to wychodzi na to, że tak jak myślałem - zesra się. Unia ma 4 bajty które przedstawiają inta bądź float, zależnie od tego co tam siedzi. Natomiast struktura ma 4+4, tutaj już jawnie rozdzielone od siebie. Pytanie brzmi - czy jak spróbujemy zrzutować pamięć unii na strukturę to stanie się:

1. Na podstawie różnicy w kodowaniu pomiędzy float a int komputer będzie w stanie powiedzieć która wartość idzie gdzie
@Khaine: Jak przypisujesz wskaźnik, to przejdzie, ale kompilator wywali ostrzeżenie.[-Wincompatible-pointer-types]. Wartość pierwszej będzie „poprawna” (w sensie po prostu użyje tej pamięci), a drugi to śmieć z ryzykiem SegFaulta.

Co do rzutowania, to C++ nie pozwoli dopóki nie napiszemy funkcji rzutującej (chyba że znowu używamy wskaźników, ale wtedy sytuacja analogiczna do C), a jak już napiszemy taką funkcję, to zachowa się to tak, jak to zaprogramujemy.
Jak przypisujesz wskaźnik, to przejdzie, ale kompilator wywali ostrzeżenie.[-Wincompatible-pointer-types]. Wartość pierwszej będzie „poprawna” (w sensie po prostu użyje tej pamięci), a drugi to śmieć z ryzykiem SegFaulta.


@Razi91: No czyli stanie się opcja 2. SegFault na Linuxie = Access Violation na Windzie. Co do tej poprawnej interpretacji nie jestem pewien, bo float i int mają chyba inne kodowanie, więc IMO tam będą bzdury. Tzn. mogą być bzdury z 50% szansą zależnie
@Khaine: No zostanie użyte dokładnie to, co będzie w pamięci. Float zinterpretowany jako int nie ma prawie w ogóle sensu (choć warto znać heksadecymalne reprezentacje 0, -0, 1, -1)