Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 19:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
Autor Wiadomość
PostNapisane: 19 lip 2017, o 15:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 15:35 
Offline
Nowy

Dołączył(a): 18 cze 2017
Posty: 7
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 16:19 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 18:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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 :?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 19:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 20:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 20:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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 .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 20:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 20:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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 ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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ść.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:22 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lip 2017, o 21:52 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 06:19 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

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 ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 06:52 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1079
Pomógł: 73

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 08:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 09:14 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1079
Pomógł: 73

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 10:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 10:26 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1079
Pomógł: 73

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 10:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 12:54 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 lip 2017, o 15:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2017, o 17:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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 . ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2017, o 20:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO