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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-07-28T19:08:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15880&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-07-28T19:08:04+01:00</updated>
<published>2016-07-28T19:08:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164966#p164966</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164966#p164966"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164966#p164966"><![CDATA[
<div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />A jaka jest zaleta wyciągania danych ze struktury w zewnętrznej funkcji, bo nie dostrzegam<br /></div>Nie wiem do czego używasz funkcji <em>write_registers()</em> (do tej funkcji przekazywałeś elementy struktury w swoim przykładzie), więc trudno mi się w tej kwestii wypowiadać. Jeśli jest Ci tak wygodniej, to możesz rozbić strukturę we funkcji <em>regs_set()</em> i przekazać do funkcji <em>write_registers()</em> jej poszczególne składniki (tak, jak to miałeś zrobione):<br />[syntax=c]static void regs_set(void)<br />{<br />    uint8_t reg;<br />    uint16_t val;<br /><br />    for (uint8_t i = 0; i &lt; ( sizeof(init_vals)/sizeof(init_vals&#91;0&#93;) ); i++ )<br />    {<br />        reg = init_vals&#91;i&#93;.reg;<br />        val = init_vals&#91;i&#93;.val;<br />        write_register(reg, val);<br />    }<br />}[/syntax]<br />Wielkiej różnicy nie będzie, gdzie to będziesz rozbijał, gdzieś i tak musisz.<br /><br />Zrobiłem tak, bo według mnie jest czytelniejsze przekazanie do funkcji wskaźnika na strukturę, niż poszczególnych elementów. Być może jest i szybsze (nie sprawdzałem), bo przekazujesz 2 bajty (wskaźnik) zamiast 3 bajtów (rozmiar struktury). W tym przypadku to nie ma większego znaczenia, ale zastanów się, co by było, gdyby struktura zawierała więcej elementów (może nawet jakąś tablicę) i chciałbyś je wszystkie osobno przekazywać do funkcji <em>write_register()</em>... Odpowiedz sobie sam <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=14165">andrews</a> — 28 lip 2016, o 19:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-07-28T17:17:56+01:00</updated>
<published>2016-07-28T17:17:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164950#p164950</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164950#p164950"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164950#p164950"><![CDATA[
Ja bym proponował coś takiego:<br />[syntax=c]typedef struct<br />{<br />    uint8_t reg;<br />    uint16_t val;<br />} regval_t;<br /><br />// deklaracja tablicy we flash<br />static const __flash regval_t init_vals&#91;&#93; =<br />{<br />    {CTRL1, 0x12B0},<br />    {CTRL2, 0x0007},<br />    {CTRL3, 0x008C}<br />};<br /><br />// funkcja regs_set()<br />static void regs_set(void)<br />{<br />    for (uint8_t i = 0; i &lt; (sizeof(init_vals)/sizeof(init_vals&#91;0&#93;)); i++)<br />    {<br />        write_register(&amp;init_vals&#91;i&#93;);<br />    }<br />}<br /><br />// dostęp do elementów struktury we funkcji write_register() wygląda tak<br />static void write_register(const __flash regval_t *regv)<br />{<br />    uint8_t r = regv-&gt;reg;<br />    uint16_t v = regv-&gt;val;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 28 lip 2016, o 17:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-07-28T14:40:49+01:00</updated>
<published>2016-07-28T14:40:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164934#p164934</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164934#p164934"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164934#p164934"><![CDATA[
<div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />A jak podmieniłem swoją funkcję na tą elegancką<br /></div><br />Jaką tam zaraz elegancką ... ot jakaś tam wersja<br /><br />a jak już używasz debugera to załóż pułapkę i sprawdź czy ci do write_register(reg, val); są przekazywane poprawne wartości<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />tylko czy ty nie powinieneś zrobić tam<br /><br />[syntax=c]sizeof(init_vals)/sizeof(regval_t)[/syntax]<br /><br />?? w pętli for (albo nawet na razie wstaw ręcznie ilość elementów dla testu)<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />sorki, że jak tak z doskoku bez dokładnego sprawdzenia i na szybko odpowiadam ale po prostu odrywam się co chwilę od innego już nużącego mnie zajęcia ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 lip 2016, o 14:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-07-28T13:37:30+01:00</updated>
<published>2016-07-28T13:37:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164925#p164925</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164925#p164925"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164925#p164925"><![CDATA[
a próbowałeś tak?<br /><br />[syntax=c]static void regs_set(void)<br />{<br />    for (uint8_t i = 0; i &lt; sizeof(init_vals); i++ )<br />    {<br />        uint8_t reg = pgm_read_byte( &amp;init_vals&#91;i&#93;.reg) );<br />        uint16_t val = pgm_read_word( &amp;init_vals&#91;i&#93;.val) );<br /> <br />        write_register(reg, val);<br />    }<br />}[/syntax]<br /><br />bo jakoś tak troszkę zakręcone było to co robisz - tak mi się wydaje no ale jak działa to działa <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> — 28 lip 2016, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-07-28T12:45:08+01:00</updated>
<published>2016-07-28T12:45:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164918#p164918</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164918#p164918"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164918#p164918"><![CDATA[
<div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />Właśnie sizeof(pixel_t) da w wyniku 2.<br /></div>Taki szczegół dla ścisłości, sizeof(pixel_t<strong>*</strong>) da w wyniku 2, podobnie jak sizeof(node). Z kolei sizeof(<strong>*</strong>node) będzie równoznaczne z sizeof(pixel_t).<br /><br /><div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />Czy jest sposób aby to jakoś wyłuskać bez przekazywania funkcji &quot;na chama&quot; tej informacji?<br /></div>Obawam się, że nie ma. Funkcja <strong>void draw_polygon(pixel_t *node)</strong> na etapie kompilacji nie wie nawet, że <strong>node</strong> to wskaźnik do tablicy (jak już chyba sam zauważyłeś, sizeof(*node) zwraca wartość rozmiaru tylko jednego jej elementu).<br /><br />Jak Cię nuży pisanie: &quot;<em>polygon1, sizeof(polygon1)/sizeof(pixel_t)</em>&quot; bo za długie, zawsze możesz sobie stworzyć makro preprocesora, które będzie robić to za Ciebie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 28 lip 2016, o 12:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-07-28T12:38:03+01:00</updated>
<published>2016-07-28T12:38:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164917#p164917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164917#p164917"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164917#p164917"><![CDATA[
<div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />Właśnie sizeof(pixel_t) da w wyniku 2.<br /></div><br />Nigdy w życiu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak podasz nazwę typu do sizeof() to dostaniesz rozmiar struktury w bajtach ... AAAAAAAAAA sorry dopiero teraz zobaczyłem że chodzi jeszcze o tablicę struktur <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to przepraszam ... wtedy pozostaje ręczne przekazanie rozmiaru jako dodatkowy argument funkcji. A wyżej kolega andrews pokazał nawet jak to zrealizować również z sizeof. <br /><br />jeśli masz oczywiście własną konwencję nazw to ok - nie było mojej uwagi <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> — 28 lip 2016, o 12:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-07-28T12:16:13+01:00</updated>
<published>2016-07-28T12:16:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164914#p164914</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164914#p164914"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164914#p164914"><![CDATA[
<strong>sizeof()</strong> to operator rozmiaru. Obliczenie rozmiaru dokonywane jest na etapie kompilacji, więc nie da się określić rozmiaru na podstawie wskaźnika przekazywanego do funkcji, który przecież może wskazywać na obiekty o różnym rozmiarze, więc na etapie kompilacji nie da się ustalić rozmiaru tablicy przekazanej do funkcji.<br /><br />Jeśli tablica ma zawsze ten sam rozmiar można zadeklarować funkcję tak:[syntax=c]void draw_polygon(pixel_t node&#91;3&#93;) {}[/syntax]a jeśli rozmiar wskazywanej tablicy będzie zmienny, można użyć dodatkowego parametru z rozmiarem:[syntax=c]void draw_polygon(pixel_t *node, size_t size) {} // gdzie size będzie oznaczać ilość struktur w tablicy<br />// i później wywoływać funkcję poprzez<br />draw_polygon( polygon1, sizeof(polygon1)/sizeof(pixel_t) );[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 28 lip 2016, o 12:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-07-28T11:58:07+01:00</updated>
<published>2016-07-28T11:58:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164913#p164913</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164913#p164913"/>
<title type="html"><![CDATA[Re: Rozmiar tablicy struktur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15880&amp;p=164913#p164913"><![CDATA[
<div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />Co robię źle?<br /></div><br />Robisz źle to, że przecież sam zobacz, upraszczam twój kod:<br /><br />[syntax=c]void draw_polygon(pixel_t *node) {<br /><br />    volatile uint8_t x=sizeof(*node);[/syntax]<br /><br />Przecież ty nie sprawdzasz tu operatorem sizeof rozmiaru struktury tylko ? no jak myślisz ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> rozmiar panie kochany wskaźnika i pewnie się dziwisz dlaczego wychodzi ci 2. Dwa bo wskaźniki są dwubajtowe .... sizeof nie obliczy rozmiaru struktury na podstawie wskaźnika więc albo przekaż rozmiar ręcznie albo użyj sizeof( pixel_t )<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Przy okazji zastanów się na przyszłość dla lepszej przejrzystości kodu nad nadawaniem porządnych nazw typów gdy definiujesz strukturę, bo teraz to można powiedzieć, że jest bajzelek w kodzie ... Ja bym dał nazwę typu <br /><br />[syntax=c]TPIXEL a nie pixel_t[/syntax]<br /><br />później gdy definiuje się zmienną albo podaje jako argument to ładnie widać<br /><br />[syntax=c]TPIXEL polygon1;[/syntax]<br /><br />nieprawdaż ? <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> — 28 lip 2016, o 11:58</p><hr />
]]></content>
</entry>
</feed>