<?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=4&amp;t=11665&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-11T19:11:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11665&amp;mode</id>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-05-11T19:11:12+01:00</updated>
<published>2015-05-11T19:11:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128882#p128882</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128882#p128882"/>
<title type="html"><![CDATA[Re: Promocja domyślna - pułapka czy brak wiedzy ?...]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128882#p128882"><![CDATA[
A no dokładnie jest tak jak mówisz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Trza pomacać i tyle...  <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 11 maja 2015, o 19:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-11T18:34:52+01:00</updated>
<published>2015-05-11T18:34:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128872#p128872</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128872#p128872"/>
<title type="html"><![CDATA[Re: Promocja domyślna - pułapka czy brak wiedzy ?...]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128872#p128872"><![CDATA[
Widzisz bo z tą promocją to jest tak:<br /><br />jak nie dotkniesz - jak nie przetestujesz - to najczęściej nie zrozumiesz.<br /><br />Jak już dotkniesz i przetestujesz, zobaczysz o co chodzi to później już problemów nie będzie i okaże się że temat jest w sumie prosty jak drut <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 maja 2015, o 18:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-05-11T18:31:58+01:00</updated>
<published>2015-05-11T18:31:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128870#p128870</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128870#p128870"/>
<title type="html"><![CDATA[Re: Promocja domyślna - pułapka czy brak wiedzy ?...]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128870#p128870"><![CDATA[
Hehe, Mirku, uwierz czytałem to ze 3 razy z myślą, że coś musiałem przeoczyć, a jednak nie wynikło z tego nic jasno. Wiele przykładów i innych źródeł przejrzałem i w większości przypadków przykłady były albo bardzo proste (zwykłe mnożenie jak u Ciebie), albo jednowyrażeniowe, które jednoznacznie nic nie pokazały. Po moich bojach wiem już dokładnie jak to stosować i stąd też mój post dla potomnych, w każdym razie zachęcam Cię do uzupełnienia blogu przynajmniej o ten jeden mój przykład, bo jeśli ja się na tym złapałem to zapewne i będą następni <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Nawiasem mówiąc żyłbym dalej w błogiej nieświadomości i z błędem w programie gdyby nie wrodzona ciekawość co by było gdyby... W praktyce w moim programie nawet wymnożone liczby podczas testów nigdy nie przyjmowały wartości więcej niż 16 bit chociaż rezerwę dałem bardzo dużą dla końcowego wyniku (bo parametry użytkownik ustawia sam i zakres mógłby być przekroczony) jednak zacząłem kombinować żeby sprawdzić ile jakaś tam opcja wytrzyma i jakież było moje zdziwienie gdy nie mogłem dobić do końca zakresu... Oddał bym klientowi urządzenie, a za parę dni telefon, że nie działa <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=1922">SylwekK</a> — 11 maja 2015, o 18:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-11T18:12:03+01:00</updated>
<published>2015-05-11T18:12:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128868#p128868</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128868#p128868"/>
<title type="html"><![CDATA[Re: Promocja domyślna - pułapka czy brak wiedzy ?...]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128868#p128868"><![CDATA[
Pisałem to już dość dawno:<br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/domyslna-promocja-do-typu-int.html" >http://atnel.pl/domyslna-promocja-do-typu-int.html</a><!-- m --><br /><br />niestety jakoś mało ludzi zagląda ... nie wiem czemu.<br /><br />prawidłowo powinno być tak<br /><br />[syntax=c]A = ( (uint32_t)xw * kA ) / 10UL;[/syntax]<br /><br />bo coś takiego:<br />[syntax=c]A = (uint32_t)(xw*kA)/10UL;[/syntax]<br />nie ma sensu i nie ma się co dziwić, że działa tak samo źle jak to pierwsze.....<br /><br />Wszystko przy założeniu że xw i kA są zmiennymi 16-bitowymi<br /><br />Zrozum promocja DZIAŁA ZAWSZE DOBRZE ale w ramach JEDNEGO WYRAŻENIA - trzeba o to zadbać samemu .... Jak masz coś takiego:<br /><br />[syntax=c]A = (uint32_t)(xw*kA)/10UL;[/syntax]<br /><br />to widać tam JEDNO wyrażenie takie oto:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">(xw*kA)</div><br /><br />i nie dziw się że będzie ono skopane pomimo że masz 10UL albo że masz przed wyrażeniem (uint32_t) .... bo to ostatnie rzutowanie (uint32_t) to tylko twoje pobożne życzenie żeby wynik tego skopanego działania był rzutowany na uint32_t a nie żeby działanie było realizowane w trybie 32-bitowym<br /><br />WYSTARCZY JEDNĄ ZMIENNĄ w ramach NAJMNIEJSZEGO wyrażenia rzutować na uint32_t i już będzie dobrze, to samo by ci wyszło gdybyś miał jedną z tych zmiennych typu uint32_t , wtedy nie musiałbyś rzutować......<br /><br />Reasumując jeśli masz:<br /><br />[syntax=c]uint16_t b;<br />int c;[/syntax]<br /><br />to możesz robić skomplikowane obliczenia w jednej linii ale musisz pamiętać o domyślnej promocji i w związku z tym rzutować co najmniej tak:<br /><br />[syntax=c]a = (b*c) / 10 + (b*c*c) / b - (b*c);   // KICHA wyjdzie<br /><br />a = ( (uint32_t)b*c) / 10UL + ( (uint32_t)b*c*c) / (uint32_t)b - ( (uint32_t)b*c);  // będzie GITES MAJONEZ[/syntax]<br /><br />mam nadzieję, że proste jak już się zrozumie co to są WYRAŻENIA w C<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 maja 2015, o 18:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-05-11T17:43:01+01:00</updated>
<published>2015-05-11T17:43:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128863#p128863</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128863#p128863"/>
<title type="html"><![CDATA[Promocja domyślna - pułapka czy brak wiedzy ?...]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11665&amp;p=128863#p128863"><![CDATA[
Czym jest promocja domyślna powinien wiedzieć w zasadzie każdy kto zaczyna zabawę z C i korzysta z liczb większych niż 16-o bitowe.<br />Straciłem ostatnio jakieś 3-4h na szukaniu błędu i o to wnioski, które być może komuś się przydadzą... a może po prostu znowu czegoś nie wiem  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Do rzeczy, miałem w programie taką o to linię:<br /><br />[syntax=c]A=(xw*kA)/10UL;[/syntax]<br /><br />Na pierwszy rzut wszystko ok. Wszystkie zmienne (A, xw, kA) to uint16_t, a wynik w &quot;A&quot; w założeniach programu nigdy nie przekracza 60000, więc za wszelkimi źródłami do jednego z wyrażeń w obliczeniach (a konkretnie do stałej w wyrażeniu) dodajemy &quot;UL&quot; jako promocja do 32bit i powinno hulać... a tu zonk  <img src="https://forum.atnel.pl/images/smilies/icon_e_surprised.gif" alt=":o" title="Zdziwiony" /> Po wymnożeniu tego co w nawiasie i przekroczeniu 16-u bitów przez 10 dzielone jest tylko 16 bitów, a przecież jest UL przy stałej... o co więc chodzi ?? Jedziemy dalej, następna poprawka już w nieco inny sposób jak podaje wszelka literatura:<br /><br />[syntax=c]A=(uint32_t)(xw*kA)/10;[/syntax]<br /><br />I co? Chciało by się powiedzieć g..o (niestety). Sytuacja z wynikiem dokładnie jak w pierwszym przykładzie. No dobra, to może na piechotę jakiś szybki test... dodałem zmienną 32bit:<br /><br />[syntax=c]uint32_t ppp;<br />ppp=(uint32_t)xw*kA;<br />A = ppp / 10UL;[/syntax]<br /><br />I mamy sukces !!! Dopiero taka konfiguracja pozwoliła wyrwać mi się z błędu (nawiasem mówiąc po wypiciu pół puszki piiii..eee...soku jabłkowego  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /> Podobno jego niewielka ilość rozjaśnia umysł  <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" /> <br />Minutę później miałem już taką działającą konfigurację:<br /><br />[syntax=c]A=((uint32_t)xw*kA)/10;[/syntax]<br /><br />Jak widać TYLKO działanie mnożenia jest uwzględnione do promocji(!). <br /><br />Stąd jasno wynika, że albo promocja nie dotyczy wszystkich działań w linii (jak podają wszelkie źródła, które w pośpiechu wertowałem), albo znowu czegoś nie wiem... W każdym razie moje doświadczenia pokazały, że należy uważać co się promuje. Prawdopodobnie &quot;dzielenie&quot; z założenia przez kompilator da wynik 16 bitowy stąd jest on &quot;mądrzejszy&quot; od programisty...<br />Zachęcam do przeprowadzenia testów i podzielenia się wnioskami.<br />Zapewniam, że z palca powyższego nie wyssałem, a kilku godzin, które przez to straciłem potraktuję jako naukę (bo nikt mi ich już nie odda <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ), aby nie wierzyć tak do końca we wszystko co się czyta <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 11 maja 2015, o 17:43</p><hr />
]]></content>
</entry>
</feed>