<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=58&amp;t=24089&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2022-01-06T11:02:07+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=24089&amp;mode</id>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2022-01-06T11:02:07+01:00</updated>
<published>2022-01-06T11:02:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234706#p234706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234706#p234706"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234706#p234706"><![CDATA[
To co tu robisz ze wskaźnikiem ma swoją nazwę: strict aliasing violation. Efekt tych dziań jest nieokreślony (undefined behaviour). Dalej - arytmetyka wskaźników ma sens tylko w ramach jednej tablicy. NIE ma sensu  w przypadku niezależnych zmiennych.  Kolejne UB. <br />Także, rozdział o wskaźnikach do powtórki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 6 sty 2022, o 11:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nowy_stary]]></name></author>
<updated>2022-01-05T20:18:19+01:00</updated>
<published>2022-01-05T20:18:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234702#p234702</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234702#p234702"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234702#p234702"><![CDATA[
Dzięki zatrybiłem. Wystarczyło na początku napisać jawne...  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Tak od kompilatora.<br />Jeszcze raz dzięki. Może ta dyskusja komuś też pomoże.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18726">nowy_stary</a> — 5 sty 2022, o 20:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2022-01-05T20:05:04+01:00</updated>
<published>2022-01-05T20:05:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234700#p234700</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234700#p234700"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234700#p234700"><![CDATA[
<div class="quotetitle">nowy_stary napisał(a):</div><div class="quotecontent"><br />eraz tylko próbuję dociec czy używanie typu wskaźnika innego niż typ zmiennej, której wskaźnik dotyczy jest właściwe. Chyba nie bo eclipsik się buntuje wysyłając warning.<br /></div><br />a co ma eclipsik który jest tylko zwykłym edytorem tekstu do kodu źródłowego w C ? NIC<br /><br />Warninga to masz od kompilatora i trzeba się go pozbyć robiąc jawne rzutowanie i o tym też było i jest w Bluebooku<br /><br />u ciebie musi być<br /><br />[syntax=c]uint32_t x;<br /><br />uint8_t * WSK_PORTB = (uint8_t*)&amp;x;[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">nowy_stary napisał(a):</div><div class="quotecontent"><br />Chyba, że jest inny sposób na obejście<br /></div><br />A po co obchodzić coś co się załatwia właśnie w ten sposób<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />po to są właśnie wskaźniki<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 sty 2022, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nowy_stary]]></name></author>
<updated>2022-01-05T19:44:24+01:00</updated>
<published>2022-01-05T19:44:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234697#p234697</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234697#p234697"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234697#p234697"><![CDATA[
Dokładnie tak. Wiem to od początku. Rozumiem rozkład bajtów itd. Dlatego zmieniłem typ wskaźnika żeby poruszać się co bajt, a nie tyle bajtów co wynika z typu wskaźnika zmiennej 4 bajtowej. Teraz tylko próbuję dociec czy używanie typu wskaźnika innego niż typ zmiennej, której wskaźnik dotyczy jest właściwe. Chyba nie bo eclipsik się buntuje wysyłając warning. Ale kurcze efekt jest prawidłowy po kompilacji. Chyba, że jest inny sposób na obejście tego, żeby używając wskaźnik zmiennej 4 bajtowej poruszać się w pamięci o jeden bajt. O to mi głównie chodzi.<br />Przecież nie dodam do wskaźnika zmiennej 4 bajtowej 0,25 żeby znaleźć się na najmłodszym bajcie zmiennej  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18726">nowy_stary</a> — 5 sty 2022, o 19:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2022-01-05T19:20:54+01:00</updated>
<published>2022-01-05T19:20:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234695#p234695</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234695#p234695"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234695#p234695"><![CDATA[
<div class="quotetitle">nowy_stary napisał(a):</div><div class="quotecontent"><br />OK, to pomyłka przy przepisywaniu. Miało być :<br /></div><br />to i tak źle - przecież jeśli wskaźnik jest typu uint32_t to wsk+1 przesunie ci się fizycznie o 4 bajty rozumiesz ? o rozmiar typu - a typ uint32_t to 4 bajty<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 sty 2022, o 19:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nowy_stary]]></name></author>
<updated>2022-01-05T18:55:25+01:00</updated>
<published>2022-01-05T18:55:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234694#p234694</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234694#p234694"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234694#p234694"><![CDATA[
Dzięki za szybką reakcję.<br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />W pierwszym przypadku gdy twój wskaźnik ma typ uint32_t robisz masakrę bo pominąłeś to jak działa arytmetyka wskaźników. Operacja WSK_PORT+3 powoduje przesunięcie i odczyt o fizycznie 12 bajtów dalej.<br /></div><br />OK, to pomyłka przy przepisywaniu. Miało być :<br />[syntax=c]PORTD = *(WSK_PORTB+1);[/syntax]<br /><br />ale i tak nie działa dobrze. A ja chciałem wymusić przesuniecie się na ostatni bajt zmiennej uint32_t zmieniając typ wskaźnika. Taki mój pomysł. Warning podczas kompilacji oczywiście się pojawia dlatego powstał wątek, bo działa dobrze, ale jest warning.<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />albo może działasz w kocim Atmel Studio<br /></div><br /><br />Nie żadne Atmel Studio - 100% Mirku Twoja szkoła i sprzęt.<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Napisz tą drugą wersję kodu poprawnie i pokaż - ale tak, żeby żaden warning podczas kompilacji się nie pojawiał. Bo oczywiście druga wersja kodu powinna działać poprawnie - tu arytmetyka WSK_PORTB+3 zadziała zgodnie z twoim założeniem - na PORTD powinna być podana wartość czwartego bajtu zmiennej x<br /></div><br /><br />Dobrze, ale rozumiem, że mam przyzwolenie na to, żeby stosować typ uint8 dla wskaźnika dla zmiennej uint32.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18726">nowy_stary</a> — 5 sty 2022, o 18:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2022-01-05T18:01:11+01:00</updated>
<published>2022-01-05T18:01:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234690#p234690</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234690#p234690"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234690#p234690"><![CDATA[
<div class="quotetitle">nowy_stary napisał(a):</div><div class="quotecontent"><br />PORTD = *(WSK_PORTB+3);<br /></div><br />W pierwszym przypadku gdy twój wskaźnik ma typ uint32_t robisz masakrę bo pominąłeś to jak działa arytmetyka wskaźników. Operacja WSK_PORT+3 powoduje przesunięcie i odczyt o fizycznie 12 bajtów dalej. Zajrzyj proszę do Bluebooka do wskaźników są fajne przykłady jak działa arytmetyka wskaźników.<br /><br />W drugim przypadku gdy już twój *WSK_PORTB jest typu uint8_t powinno być dobrze - ale widać że kod piszesz niedbale - bo na pewno zgłaszają ci się warningi - chociażby podczas operacji przypisania <br /><br />[syntax=c]WSK_PORTB = &amp;x;[/syntax]<br /><br />albo może działasz w kocim Atmel Studio w którym masz wyłączone warningi - oczywiście to nie jest powodem błędu o którym piszesz może on leżeć gdzie indziej ale dobrze byłoby zobaczyć PORZĄDNY kod testowy i dowiedzieć się na czym to testujesz - bo skoro wysyłasz sobie wartość na PORTD to jak to odczytujesz - masz podłączone 8 diod LED ? Nie prościej albo wysyłać sobie wartość liczbową na UART albo podłączyć byle wyświetlacz LCD i wyświetlać sobie zamiast takie karkołomne testy robić<br /><br />Napisz tą drugą wersję kodu poprawnie i pokaż - ale tak, żeby żaden warning podczas kompilacji się nie pojawiał. Bo oczywiście druga wersja kodu powinna działać poprawnie - tu arytmetyka WSK_PORTB+3 zadziała zgodnie z twoim założeniem - na PORTD powinna być podana wartość czwartego bajtu zmiennej x<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 sty 2022, o 18:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mario2015]]></name></author>
<updated>2022-01-05T17:40:20+01:00</updated>
<published>2022-01-05T17:40:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234687#p234687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234687#p234687"/>
<title type="html"><![CDATA[Re: Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234687#p234687"><![CDATA[
Poczytaj o przesunięciach bitowych i obejrzyj przy okazji te poradniki zaczynając od tego:<br /><a href="https://www.youtube.com/watch?v=V83w0pu7MVo&amp;t=2s"  class="postlink">https://www.youtube.com/watch?v=V83w0pu7MVo&amp;t=2s</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8867">mario2015</a> — 5 sty 2022, o 17:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nowy_stary]]></name></author>
<updated>2022-01-05T16:21:18+01:00</updated>
<published>2022-01-05T16:21:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234684#p234684</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234684#p234684"/>
<title type="html"><![CDATA[Deklaracje wskaźników]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24089&amp;p=234684#p234684"><![CDATA[
Chcę powitać wszystkich. Cześć.<br />Odświeżę trochę wątek wskaźników, ale w innej kwestii. Wskaźniki, piękna rzecz, ale... Mam problem z deklaracją wskaźników. Mówi się, że deklaracja (typ) wskaźnika powinna być taka sama jak deklaracja (typ) zmiennej, której adres wskazuje (mimo, że w avr 8 bit zawsze wskaźnik będzie dwubajtowy - wynika to z adresacji) to dla:<br />[syntax=c]unit32_t x;         //zmienna deklarowana jako 4 bajty<br />unit32_t *wskaznik_zmiennej_x;//wskaźnik zmiennej x - taki sam typ jak zmienna x[/syntax]<br /><br />Chyba do tej pory dobrze myślę.<br /><br />I teraz. Rozumiem to, że typ wskaźnika musi być taki jak typ zmiennej, ponieważ przy operacji odwrotnej czyli zapisu do komórki pod adres wskaznik_zmiennej_x jakiejś nowej wartości np. xx typ jej  musi być zgodny z typem zmiennej x (w moim przykładzie 4 bajtowej) z której pobraliśmy adres żeby &quot;zmienna się tam zmieściła&quot;.<br /><br />Ale wymyśliłem sobie, że na port PORTB chcę wysłać najmłodszy bajt zmiennej unit32_t czyli x, a na port PORTD najstarszy bajt zmiennej x. I tutaj okazuje się, ze dla deklaracji wskaźnika dla zmiennej x jako unit32_t mam z tym problem, a dla deklaracji wskaźnika jako unit8_t dla tej zmiennej unit32_t wszystko działa dobrze. Ale najprościej będzie chyba pokazać część programu.<br /><br />Dla wersji uint32_t *WSK_PORTB;<br />----------------------------------------------------------<br /><br />[syntax=c]uint32_t x = 0;//deklaracja i definicja zmiennej x<br />uint32_t *WSK_PORTB;//deklaracja wskaźnika zgodnie z typem zmiennej x<br /><br />potem w:<br /><br />int main(void)<br />.<br />.<br />while(1)<br />.<br />.<br />WSK_PORTB = &amp;x;<br /><br />x = 0xaaff7733;<br /><br />//teraz chcę do PORDB wysłać najmłodszy bajt zmiennej x oraz do PORTD wysłać najstarszy bajt zmiennej x<br /><br />PORTB = *WSK_PORTB;<br />PORTD = *(WSK_PORTB+3);<br />.<br />.<br />.[/syntax]<br /><br />-----------------------------------------------------------<br />Na POTRB wysłana prawidłowa wartość, na PORTD jakaś przypadkowa wartość.<br /><br />Teraz dla wersji uint8_t *WSK_PORTB;<br />------------------------------------------------------------<br />[syntax=c]uint32_t x = 0;//deklaracja i definicja zmiennej x<br />uint8_t *WSK_PORTB;//deklaracja wskaźnika niezgodnie z typem zmiennej x<br /><br />potem w:<br /><br />int main(void)<br />.<br />.<br />while(1)<br />.<br />.<br />WSK_PORTB = &amp;x;<br /><br />x = 0xaaff7733;<br /><br />//teraz chcę do PORDB wysłać najmłodszy bajt zmiennej x oraz do PORTD wysłać najstarszy bajt zmiennej x<br /><br />PORTB = *WSK_PORTB;<br />PORTD = *(WSK_PORTB+3);[/syntax]<br />---------------------------------------------------------<br />Na POTRB wysłana prawidłowa wartość i na PORTD też przypadkowa wartość.<br /><br />Czy można tak jak powyżej deklarować wskaźnik o typie innym niż zmienna, której dotyczy. Na razie ta część programu działa dobrze, ale może w jakiejś sytuacji coś pójdzie nie tak.<br />Z góry dziękuję za sugestie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18726">nowy_stary</a> — 5 sty 2022, o 16:21</p><hr />
]]></content>
</entry>
</feed>