ATNEL tech-forum
https://forum.atnel.pl/

Pytanie o unie BB
https://forum.atnel.pl/topic18838.html
Strona 1 z 1

Autor:  procek87 [ 19 lip 2017, o 15:04 ]
Tytuł:  Pytanie o unie BB

hejka nie dociera do mnie i nie rozumiem trochę przykładu z rozdziału opisującego unie str 171 czy mógłby mi ktoś inaczej może kolejnym przykładem wytłumaczyć o co w uni chodzi , jak wygląda sprawa gdy w uni mamy same typy uint8_t jedno-bajtowe i ten symboliczny kocioł jest jedno-bajtowy a zmiennych uint8_t jest więcej.

Pozdrawiam początkujący procek87

Autor:  SobieslawJan [ 19 lip 2017, o 15:35 ]
Tytuł:  Pytanie o unie BB

Chodzi o to, że we wszystkich bajtach na tych samych pozycjach licząc od najmlodszego jest to samo co do ich wartosci.
Czyli jak w jedną zmienną sie cos wpisze, to z automatu pokrywa sie ze wszystkim innymi i kazdy z tych bajtow ma dokladnie tą sama wartosc.
Np jak jest zmienna 4 bajty i zmienna 2 bajty, to te 2 z dwubajtowej pokryją sie z 2 mlodszymi z 4 bajtowej.
Wartosci bedą odpowiadac ostatnio zapisanym w uni.

Więc unia to taka "kopiarka" bajtow

Tak ja to rozumiem:)
Ale nie wiem czy mam racje :D


Wysłane z iPhone za pomocą Tapatalk

Autor:  mirekk36 [ 19 lip 2017, o 16:19 ]
Tytuł:  Re: Pytanie o unie BB

procek87 napisał(a):
jak wygląda sprawa gdy w uni mamy same typy uint8_t jedno-bajtowe i ten symboliczny kocioł jest jedno-bajtowy a zmiennych uint8_t jest więcej.


A jak ma wyglądać ;) ... unia taka zajmie tylko jeden bajt zapisując coś do jednej zmiennej będziesz miał tę samą wartość w każdej innej zmiennej unii ...

Pomysł mocno chybiony ... kompletnie bezużyteczny ... ale mam nadzieję, że coś się rozjaśniło ;)

Unie mają zastosowanie właśnie wtedy gdy miesza się różne typy i wyciąga je na inny sposób ;) np

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dzięki czemu możesz sam sprawdzić, że w kolejnych wartościach tablicy masz:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

czyli w z1 masz 0x04, w z2 masz 0x03, w z3 masz 0x02 no i w z4 masz 0x01

Autor:  procek87 [ 19 lip 2017, o 18:51 ]
Tytuł:  Re: Pytanie o unie BB

mirekk36 napisał(a):
uint8_t z1 = LICZBA.tab[0];
uint8_t z2 = LICZBA.tab[0];
uint8_t z3 = LICZBA.tab[0];
uint8_t z4 = LICZBA.tab[0];

Mirku czemu odwołujesz do się wartości pod indeksem 0 i przyisujesz rożne wartości do typu uint8_t od z1-z4, o co w tym chodzi ?

dlaczego są tylko cztery elementy czemu jest pominięty jest zdefinowana zmienna a 32 bitowa?

dalej tego nie rozumiem :?

Autor:  Daro69 [ 19 lip 2017, o 19:47 ]
Tytuł:  Re: Pytanie o unie BB

witam,
To może ja spróbuję . :)
wyobraź sobie jakąś liczbę. 32'u ale zapisaną sekwencjami.
0b // binarnie
12345678
90123456
78901234
56789012

masz do niej całej dostęp jako uint32_t
lub jako cztery uint8_t. dostępne poprzez tablice.

uint8_t a,b;

a=tab8[0]; // 12345678 binarnie - pierwsze osiem bitów
b=tab8[1]; // 90123456 binarnie - drugie osiem bitów

można też dostać się do niej jako do dwóch uint16_t.
Tablica musiała by być uint16_t tab16[2];

uint16_t c;

c=tab16[0]; // 1234567890123456 binarnie - pierwsze 16 bitów.

możesz wpisując zmienna pierwszą jako uint8_t -
tab8[0] = 0;
wyzerować tylko pierwsze osiem bitów w słowie 32bitowym.
cała unia w jednym momencie może zawierać tylko tyle ile wynosi największa zmienna.
w tym wypadku uint32_t. :)
może pomogło. :)

------------------------ [ Dodano po: 4 minutach ]

oczywiście do unii dostajemy się za pomocą kropki po nazwie. ;)

------------------------ [ Dodano po: 10 minutach ]

a.. i oczywiście te wartości na początku to kolejne bity a nie ich waga. bo bit noże być albo 1 albo 0.

Autor:  mirekk36 [ 19 lip 2017, o 20:25 ]
Tytuł:  Re: Pytanie o unie BB

procek87 napisał(a):
Mirku czemu odwołujesz do się wartości pod indeksem 0


na szybko odpisywałem - oczywiście miały być kolejne indeksy 0,1,2,3

Autor:  procek87 [ 19 lip 2017, o 20:45 ]
Tytuł:  Re: Pytanie o unie BB

mirekk36 napisał(a):
na szybko odpisywałem - oczywiście miały być kolejne indeksy 0,1,2,3

no tak myślałem analizuje teraz to co napisaliście pewnie urodzi mi się w najblizszym czasie kolejne pytanie szczerzeto trochę mi się pomieszało .

Autor:  Daro69 [ 19 lip 2017, o 20:51 ]
Tytuł:  Re: Pytanie o unie BB

hmm...
jedna wielka zmienna, do której wycinków możemy się dostać za pomocą mniejszych składowych.
w tym przykładzie do 32u jak do 2 razy 16u lub jako cztery razy 8u.

Autor:  procek87 [ 19 lip 2017, o 20:59 ]
Tytuł:  Re: Pytanie o unie BB

Mirku mam pytanie do przykładu, który pokazałeś zdefiniowałeś w uni 4 elementową tablice uint8_t i zmienną uint32_t a;
dalej tłumaczysz odnosząc się do elementów tablicy ale nie opisałeś co z tą zmienną a ?

Autor:  Daro69 [ 19 lip 2017, o 21:05 ]
Tytuł:  Re: Pytanie o unie BB

zmienna a nadal tam jest jako 32_bit, składa się z tych czterech elementów ośmio bitowych.
zmieniając jeden z tych elementów tablicy zmienimy któreś osiem bitow tej dużej zmiennej.

------------------------ [ Dodano po: 2 minutach ]

jak by to określić, w unii możemy w rożny sposób traktować jej całą zawartość.

Autor:  procek87 [ 19 lip 2017, o 21:12 ]
Tytuł:  Re: Pytanie o unie BB

Daro69 wyżej zadałem to pytanie Mirkowi ale słabo zrozumiałem a co jeśli w uni najwiekszy typ jaki mam to uint8_t i char, wszystkie jako jednobajtowe no np .

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


co w takim przypadku wiem że to trochę nie logiczne ale jak wtedy odnieść się do którejkolwiek zmiennej w uni i jak unia będzie wyglądać jeśli obie zmienne jeszcze zainicjuje takimi samymi wartościami a,b=65;

Autor:  mirekk36 [ 19 lip 2017, o 21:22 ]
Tytuł:  Re: Pytanie o unie BB

liczba.a
liczba.b
liczba.c

w czym problem

wystarczy, że wpiszesz

liczba.b = 5;

i w każdej innej też będziesz miał pięć bo to ta sama jedna komórka (bajt) unii

Autor:  procek87 [ 19 lip 2017, o 21:31 ]
Tytuł:  Re: Pytanie o unie BB

czyli unia biniarnie będzie wyglądać tak 0x 0000 0000| 0000 0000| 0000 0000 trzy sekcje ale całość będzie mieścić się w 0x 0000 0000 ? jak?

Autor:  Daro69 [ 19 lip 2017, o 21:38 ]
Tytuł:  Re: Pytanie o unie BB

nie nie.. to nie tak.
Twoja unia będzie miała osiem bitów, dostępnych poprzez zamieszczone w klamrach typy.
czyli jeżeli wpiszesz.:
liczba. a = 97;
to w tym momencie nazwijmy ten dostęp "zmienną" liczba.b też uzyska 97.
a char liczba.c uzyska znak litery a. bo to wartość 97.

Autor:  procek87 [ 19 lip 2017, o 21:45 ]
Tytuł:  Re: Pytanie o unie BB

aha czyli gdy zainicjuje którąkolwiek a,b,c np. a=97 to ta wartość będzie pomimo że nie inicjowałem tymi wartościami dla b,c . Unia będzie miałą 1 bajt

Autor:  mirekk36 [ 19 lip 2017, o 21:52 ]
Tytuł:  Re: Pytanie o unie BB

procek87 napisał(a):
Unia będzie miałą 1 bajt


DOKŁADNIE tak - tak jak w książce napisałem, tyle ile zajmuje jej największy element, a że ty wpakowałeś trzy takie same to jest to samo

zrozum - to JEDEN bajt w pamięci RAM .... i każde odwołanie przez dowolną nazwę powoduje odwołanie się do tego samego bajtu w pamięci

Autor:  Tom277 [ 20 lip 2017, o 06:19 ]
Tytuł:  Re: Pytanie o unie BB

Daro69 napisał(a):
nie nie.. to nie tak.
Twoja unia będzie miała osiem bitów, dostępnych poprzez zamieszczone w klamrach typy.
czyli jeżeli wpiszesz.:
liczba. a = 97;
to w tym momencie nazwijmy ten dostęp "zmienną" liczba.b też uzyska 97.
a char liczba.c uzyska znak litery a. bo to wartość 97.


To w takim razie, po co jest unia? Skoro a=97 i cała reszta przybiera te same wartości?

mirekk36 napisał(a):
Pomysł mocno chybiony ... kompletnie bezużyteczny ... ale mam nadzieję, że coś się rozjaśniło ;)

po co w ogóle stosować unię, kiedy ma to sens i co mi daje/ułatwia stosowanie uni?

Przyznam, że nie mogę zrozumieć rozdziału o uni i strukturach. Pola bitowe jakoś do mnie trafiły ale sens stosowania uni ?

Autor:  Jarecki [ 20 lip 2017, o 06:52 ]
Tytuł:  Re: Pytanie o unie BB

Jedno bajtowa unia to taki sobie przykład....

Zróbmy unie, która będzie służyła do łatwego odczytywania i zapisywania parametrów diody LED RGB.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Unia przyjmie rozmiar taki, jak największy element w niej występujący czyli 4 bajty, więc tablica z parametrami też ma 4 bajty, żeby było łatwo "wyciągać" składowe.

Teraz przypisze parametry dla diody. Będą to:

jasność - 9;

R = 22

G = 33

B = 44

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Teraz gdzieś w programie potrzebuję odczytać tylko wartość koloru G, to zrobię to tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jakie z tego korzyści? Nie muszę stosować maskowania, przesunięć bitowych czy rzutowania....

Mirek w swojej książce podał tez dobry przykład o kasowaniu kilku profili alarmowych w zegarku za pomocą unii

Autor:  procek87 [ 20 lip 2017, o 08:45 ]
Tytuł:  Re: Pytanie o unie BB

no dobrze a co z uint32_t rozmiar ; w Unii ona znika? bo jest zdefiniowana największym typem 4 bajtowym?

Autor:  Jarecki [ 20 lip 2017, o 09:14 ]
Tytuł:  Re: Pytanie o unie BB

procek87 napisał(a):
no dobrze a co z uint32_t rozmiar ; w Unii ona znika? bo jest zdefiniowana największym typem 4 bajtowym?


uint32_t niejako definiuje rozmiar unii

Autor:  procek87 [ 20 lip 2017, o 10:20 ]
Tytuł:  Re: Pytanie o unie BB

aha czyli tworząc Unię trzeba zdefiniować zawsze zmienna która określa rozmiar uni ,a która nie jest inicjowanie żadna stałą? dobrze rozumiem?

Autor:  Jarecki [ 20 lip 2017, o 10:26 ]
Tytuł:  Re: Pytanie o unie BB

procek87 napisał(a):
aha czyli tworząc Unię trzeba zdefiniować zawsze zmienna która określa rozmiar uni ,a która nie jest inicjowanie żadna stałą? dobrze rozumiem?


nie, nie....unia zawsze przyjmie rozmiar taki, jak najwiekszy element, który sie w niej znajduje.... wpisałem zmienna rozmiar uint32_t tylko po to zeby unia miała 4 bajty

------------------------ [ Dodano po: 11 minutach ]

Poczytaj :)
http://edu.pjwstk.edu.pl/wyklady/pro/sc ... ode82.html

Autor:  procek87 [ 20 lip 2017, o 10:53 ]
Tytuł:  Re: Pytanie o unie BB

a co jeśli ta zmienna zaincjujesz wartością to jak będzie wtedy wyglądać unia wraz z czterema wartościami plus zmienna 4 bajtowa do której np. włoże liczbę 15 jak będzie wyglądać jej wzór binarny 0x01020304..?

kolejne pytanie jeśli dwie zmienne zainicjuje tymi samymi wartościami np .65 w obu zmiennych to ta pierwsza nie za marze tej drugiej?

Autor:  mirekk36 [ 20 lip 2017, o 12:54 ]
Tytuł:  Re: Pytanie o unie BB

procek87 napisał(a):
kolejne pytanie jeśli dwie zmienne zainicjuje tymi samymi wartościami np .65 w obu zmiennych to ta pierwsza nie za marze tej drugiej?


czy ty nie rozumiesz, że to TE SAME BAJTY w pamięci ? i tylko umownie język C (kompilator) daje możliwość posługiwania się różnymi nazwami ?

No panie kochany ..... jeśli masz dwie zmienne (nazwy) w unii tego samego typu

to przecież ZAPIS do zmiennej A jakiejś wartości - zapisuje to do pamięci RAM

i jak odczytasz drugą zmienną B - to dostaniesz tą samą wartość

Jak chcesz się dowiedzieć do czego są unie to pooglądaj moje poradniki na YT

Autor:  procek87 [ 20 lip 2017, o 15:19 ]
Tytuł:  Re: Pytanie o unie BB

Mirku możesz podsunąć link do tego filmiku podejrzewam że chodzi o te "struktury" zgadza się?
https://www.youtube.com/watch?v=2p00J3omM7o
https://www.youtube.com/watch?v=I-Y6ChUye7w
https://www.youtube.com/watch?v=MOgXcDJ29B0
https://www.youtube.com/watch?v=V83w0pu7MVo

Autor:  procek87 [ 6 sie 2017, o 17:57 ]
Tytuł:  Re: Pytanie o unie BB

Mirku ciężko mi tą wzmiankę w tylu poradnikach odszukać tyle poradników napłodziłeś ;) ostatnio i bardzo dobrze ,jednak mam problem ze znalezieniem tego jak objaśniasz w jednym z nich po co jaki jest sens stosowania Unii ,przykład, który może przybliży to czego nie potrafię zrozumieć:

Kod:
union{
uint8_t a;
uint8_t b;

}liczba;

liczba.a=5;
liczba.b=10

PORTC= liczba.a;



Skoro zapisałem do liczba.a=5 i chce by piątka była ładowana wyświetlona na PORTC to jaki jest sens skoro unia to wartość tej liczby na dole , która będzie miała zamazaną wartość 10, bo poprzednia zostaje z tych 3 zostaje wartość jednej i jak mam wydobyć wartość tej konkretnej skoro wszytskie mają to samo, dla mnie to sprzecznosć.

Co innego jeśli sobie zdefiniuje wewnątrz tablice widzę że w postach wyżej , są takie przykłady i to się inazcej ukłąda z tego co dostrzegam od strony praktycznej,

przepraszam jestem początkujący dlatego takie to może banalne ale może ktoś z tego skorzysta . ;)

Autor:  Daro69 [ 6 sie 2017, o 20:33 ]
Tytuł:  Re: Pytanie o unie BB

witam,
procek87 napisał(a):
Kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Skoro zapisałem do liczba.a=5 i chce by piątka była ładowana wyświetlona na PORTC to jaki jest sens skoro unia to wartość tej liczby na dole , która będzie miała zamazaną wartość 10, bo poprzednia zostaje z tych 3 zostaje wartość jednej i jak mam wydobyć wartość tej konkretnej skoro wszytskie mają to samo, dla mnie to sprzecznosć.

Wygląda na to że już rozumiesz jak działa unia, jak się w niej odnaleźć. :)
Tak właśnie jest, wpisując ( liczba.b = 10; ) nadpisujemy "liczba.a - teraz tu też będzie 10.
jaki w tym sens ?
Dla dwóch zmiennych o identycznych typach , umieszczonych w jednej , unii żadnego. :)
Ale zerknij na sensowne wykorzystanie unii,
nałożenie tablicy na strukturę zawierającą czas : sek, min, godz, dzień, ....
w tym np. poradniczku. ;)
http://mirekk36.blogspot.com/2013/11/rt ... ek-na.html
pozdrawiam.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/