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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-02-23T10:47:48+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20281&amp;mode</id>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-02-23T10:47:48+01:00</updated>
<published>2018-02-23T10:47:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204418#p204418</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204418#p204418"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204418#p204418"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />skoro dajesz funkcji specyfikator static to po jakiego grzyba wstawiasz ten nagłówek i to jeszcze ze static a na dodatek inline do pliku *.H<br /></div><br />Ależ skąd Pan wywnioskował, że wstawiam go do pliku *.h? Przecież ja nic o tym nie wspominałem, broń boże w żadnym razie tego nie robiłem. W pierwszym poście napisałem:<br /><div class="quotetitle">BarGai napisał(a):</div><div class="quotecontent"><br />Rozumiem, że celem takiego użycia jest swego rodzaju hermetyzacja. Funkcji takiej nie umieszczamy w pliku nagłówkowym(*.h), ponieważ nie udostępniamy jej zewnętrznym innym plikom(*.c). Użycie takiego przydomka dla funkcji jest zasadne tylko w pliku (*.c), w którym funkcje takie są wykorzystywane przez np. funkcje udostępniane przez plik nagłówkowy.<br /></div><br />Poniżej znajduje się fragment pliku d_lcd.c, jest to fragment biblioteki dla wyswietlacza LCD. W dołączonym pliku &quot;d_lcd.h&quot; nie ma żadnej deklaracji poniższych funkcji. W pliku &quot;d_lcd.h&quot; znajduja się tylko inne udostępniane na zewnątrz funkcje do wyświetlacza lcd. <br />[syntax=c]#include &lt;avr/io.h&gt;<br />    #include &lt;avr/delay.h&gt;<br />    #include &quot;d_lcd.h&quot;<br />     <br />    //ustawienie pinow jako wyjscia<br />    /*static*/ void d_lcd_dir_out(void);<br />    //ustawienie pinow jako wejscia<br />    static void d_lcd_dir_in(void);<br />    <br />    //tutaj mamy definicje tych funkcji[/syntax]<br /><br />W związku z tym, jeśli w pliku d_lcd.c(fragment powyzej) wymażemy przydomek static dla funkcji( da to nam w efekcie &quot;zwykłą&quot; funkcję np. void d_lcd_dir_out(void)) i w d_lcd.h nie będzie deklaracji tej funkcji to funkcja ta i tak nie będzie udostępniona poprzez dołączenie pliku d_lcd.h do innych plików bo nie ma w nim tak czy siak żadnej deklaracji funkcji. Stąd nie rozumiem użycia static w takim przypadku bo tak czy inaczej swego rodzaju hermetyzacja będzie niezależnie, czy funkcja będzie w pliku *.c ze static czy nie, bo i tak nie ma jej deklaracji w udostępnianym pliku. <br /><br />Przepraszam, ale czasem ciężko przedstawić to co ma czlowiek na mysli w piśmie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Rozumiem, że robię coś zle i ma to jakiś sens na pewno dlatego chcę to zrozumieć. Chyba po czasie po prostu to do mnie dojdzie i sam zrozumiem to o co mi chodzi. Wtedy ewentualnie napiszę jeśli nieumiejętnie przedstawiłem swój problem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 21 minutach ]</span></strong><br /><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Natomiast pewne jest, że jeśli zdefiniujesz jakąś funkcję z opcją static i nie wykorzystasz jej, to dostaniesz ostrzeżenie od kompilatora:<br />&quot;warning: 'temp_func' defined but not used [-Wunused-function]&quot;.<br /><br />Gdzie istotna jest tutaj opcja kompilatora &quot;-Wunused-function&quot;, która dba o optymalizację miejsca na kod programu.<br /><br />To wydaje się oczywiste, że kompilator dba o to by nie &quot;zaśmiecać&quot; pamięci programu funkcjami niepotrzebnymi, w ten sposób zaoszczędzimy miejsce w pamięci flash.<br />Jeśli usuniesz &quot;static&quot; to powyższego ostrzeżenia nie dostaniesz i niepotrzebną funkcję umieścisz w pamięci programu.<br />Ten rodzaj optymalizacji jest wg mnie bardzo pożądany.<br /></div><br /><br />TAK, TAK i jeszcze raz TAK !!! O to mi właśnie chodziło w moich rozważaniach, które może nieudolnie starałem się przedstawić. Teraz wydaje się być logicznym używanie przydomka static do funkcji. Dziękuję obu Panom za poświęcony czas, chęci i pomoc w rozwiązaniu problemu !!!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 23 lut 2018, o 10:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2018-02-23T10:22:17+01:00</updated>
<published>2018-02-23T10:22:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204416#p204416</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204416#p204416"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204416#p204416"><![CDATA[
<div class="quotetitle">BarGai napisał(a):</div><div class="quotecontent"><br />Teraz usuwam z niej słówko static. Tak jak napisałem w pierwszym poście, nie potrafię zauważyć różnicy<br /></div><br />Chyba wiem o co Koledze chodzi.<br />Brak różnic pewnie wynika z opcji kompilacji, niestety nie jestem na tyle biegły, żeby wskazać o które opcje chodzi.<br />Natomiast pewne jest, że jeśli zdefiniujesz jakąś funkcję z opcją static i nie wykorzystasz jej, to dostaniesz ostrzeżenie od kompilatora:<br />&quot;warning: 'temp_func' defined but not used [-Wunused-function]&quot;.<br /><br />Gdzie istotna jest tutaj opcja kompilatora &quot;-Wunused-function&quot;, która dba o optymalizację miejsca na kod programu.<br /><br />To wydaje się oczywiste, że kompilator dba o to by nie &quot;zaśmiecać&quot; pamięci programu funkcjami niepotrzebnymi, w ten sposób zaoszczędzimy miejsce w pamięci flash.<br />Jeśli usuniesz &quot;static&quot; to powyższego ostrzeżenia nie dostaniesz i niepotrzebną funkcję umieścisz w pamięci programu.<br />Ten rodzaj optymalizacji jest wg mnie bardzo pożądany.<br /><br />A teraz najciekawsze. Początkującym najczęściej się wydaje, że jeśli zrobią definicję funkcji np w pliku <strong>plik_temp.c</strong> to deklaracja funkcji musi być koniecznie w pliku <strong>plik_temp.h</strong>.<br />Nic bardziej mylnego, deklarację można zrobić równie dobrze w pliku main.c, czy jeszcze zupełnie innym, nagłówkowym czy też źródłowym.<br />Oczywiście miejsce deklaracji musi mieć uzasadnienie. Jeśli pojawi się w main.c to jedynym modułem, gdzie można użyć funkcji będzie main.o<br />Jeśli deklarację wrzucimy do jakiegoś innego pliku nagłówkowego .h to funkcji będzie można użyć wszędzie tam gdzie zostanie zainkludowana te plik nagłówkowy.<br /><br />Tu pewnie się mylę, ale wg mnie deklaracja funkcji jest głównie potrzebna linkerowi i mówi, że &quot;gdzieś&quot; w modułach znajduje się funkcja o tej konkretnej nazwie.<br /><br />Przedrostek static pozwala na tworzenie wielu funkcji o tych samych nazwach w wielu modułach. Wynika to wg mnie z bardzo dużej elastyczności języka C, ale czasami może wprowadzać w konsternację programistę, więc chyba raczej nie powinno się z tego korzystać.<br /><br />Jeśli pojawi się gdzieś deklaracja funkcji o tej samej nazwie, to ona nie będzie &quot;wskazywać&quot; na żadną funkcję w pamięci programu, bo wszystkie będą static, ale wystarczy, że tylko z jednej z nich usuniemy static to właśnie ta będzie mogła być widziana przez inne moduły.<br /><br />Jeśli tylko w modułach pojawią się co najmniej dwie te same nazwy funkcji, bez static to zaraz otrzymamy błąd:<br />&quot;multiple definition of &quot; i to wykryje <strong>linker</strong>.<br /><br />A jeszcze jedna ciekawa cecha przychodzi mi do głowy.<br />Jeśli w dowolnym module zdefiniujesz funkcję to wcale jej deklaracji nie musisz umieszczać w pliku nagłówkowym.<br />Wystarczy, że w dowolnym pliku źródłowym, przed wywołaniem tej funkcji, umieścisz jej deklarację.<br />Tych deklaracji możesz robić wiele, praktycznie w każdym pliku źródłowym, tam gdzie interesuje cię wywołanie tej funkcji.<br />Takie działanie jest oczywiste, w końcu &quot;include&quot; kopiuje całe pliki nagłówkowe i umieszcza je tam gdzie następuje wywołanie tej dyrektywy.<br /><br />Po prostu deklaracja to tak jakby &quot;wskaźnik&quot;, że ciało funkcji jest &quot;gdzieś&quot; dostępne, a poprawnym wskazaniem zajmuje się właśnie linker.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 23 lut 2018, o 10:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-02-23T00:32:31+01:00</updated>
<published>2018-02-23T00:32:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204404#p204404</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204404#p204404"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204404#p204404"><![CDATA[
ależ ty mieszasz chłopie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... aż strach<br /><br />skoro dajesz funkcji specyfikator static to po jakiego grzyba wstawiasz ten nagłówek i to jeszcze ze static a na dodatek inline do pliku *.H<br /><br />na prawdę nie czaję bazy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... groch z kapustą .... zaczynasz od static a później się okazuje że masz jeszcze inline a na końcu okaże się coś jeszcze innego<br /><br />Może najpierw postaraj się zrozumieć chociaż jeden specyfikator i jak działa - zamiast strzelać wszystkimi jakie tylko znasz i jakie ci ślina na język przyniesie <br /><br />nawet nie umiem pomóc bo nie wiem co ty tworzysz i w co brniesz <br /><br />a ileż można powtarzać to samo, że jak dajesz specyfikator static to nie umieszczasz nagłówka funkcji w pliku *.h ... czy to jest trudne do zapamiętania ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 23 lut 2018, o 00:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-02-22T23:23:47+01:00</updated>
<published>2018-02-22T23:23:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204402#p204402</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204402#p204402"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204402#p204402"><![CDATA[
Może zbyt daleko zabrnąłem w swoich rozważaniach. Może inaczej. Mam funkcję statyczna w pliku d_lcd.c.<br />[syntax=c]static inline uint8_t d_lcd_read_half_byte(void)[/syntax] Teraz usuwam z niej słówko static. Tak jak napisałem w pierwszym poście, nie potrafię zauważyć różnicy bo ta funkcja nie jest zadeklarowana w d_lcd.h. Napisał Pan, że kompilator spróbuje podstawić funkcję w takim przypadku i zglosi warning jednak w moim przypadku tego nie widzę. <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/delay.h&gt;<br />#include &quot;d_lcd.h&quot;<br /><br />//wyslanie polowy bajtu<br />static inline void d_lcd_send_half_byte(uint8_t byte);<br />//odczyt polowy bajtu<br />static inline uint8_t d_lcd_read_half_byte(void);<br />//ustawienie pinow jako wyjscia<br />static inline void d_lcd_dir_out(void);<br />//ustawienie pinow jako wejscia<br />static inline void d_lcd_dir_in(void);[/syntax]<br /><br />Poniżej tego fragmentu znajdują się definicje między innymi powyższych funkcji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 22 lut 2018, o 23:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-02-22T22:13:49+01:00</updated>
<published>2018-02-22T22:13:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204397#p204397</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204397#p204397"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204397#p204397"><![CDATA[
<div class="quotetitle">BarGai napisał(a):</div><div class="quotecontent"><br />No właśnie dlatego miałem obawy, czy dobrze zrozumiałem i na to wychodzi, że zle zrozumiałem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent">to on spróbuje podstawić funkcję o tej samej nazwie<br /></div><br />Czyli jaką funkcję o tej samej nazwie jeśli nie taką, która jest zdefiniowana w innym pliku *.c?</div><br />sory ale kompletnie nie wiem co ty kombinujesz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />no zrób że sobie prosty test - użyj funkcji _delay_ms() ale nie dodawaj pliku nagłówkowego, skompiluj program , zobacz jaki masz warning, weź translate.google.pl i przetłumcza sobie a poźniej zapytaj czego nie rozumiesz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 lut 2018, o 22:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-02-22T22:02:40+01:00</updated>
<published>2018-02-22T22:02:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204396#p204396</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204396#p204396"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204396#p204396"><![CDATA[
No właśnie dlatego miałem obawy, czy dobrze zrozumiałem i na to wychodzi, że zle zrozumiałem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />to on spróbuje podstawić funkcję o tej samej nazwie<br /></div><br />Czyli jaką funkcję o tej samej nazwie jeśli nie taką, która jest zdefiniowana w innym pliku *.c?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 22 lut 2018, o 22:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-02-22T21:53:14+01:00</updated>
<published>2018-02-22T21:53:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204393#p204393</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204393#p204393"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204393#p204393"><![CDATA[
oczekujesz cudów gdy nie ma deklaracji funkcji ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />poza tym static powoduje całkowicie inne podejście do optymalizacji i funkcje takie mogą być czasem potraktowane jako inline<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 lut 2018, o 21:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-02-22T21:04:00+01:00</updated>
<published>2018-02-22T21:04:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204386#p204386</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204386#p204386"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204386#p204386"><![CDATA[
Może na przykładzie, bo chyba rozumiem co chce mi Pan przekazać, ale mam jeszcze trochę wątpliwości. Trzy pliki: main.c, file1.c, file1.h, dwie funkcje fun1(), fun2(). Do main.c i file1.c dołączam plik nagłówkowy file1.h. W file1.c znajduje się deklaracja i definicja fun1() jako funkcji statycznej. W file1.c znajduje się definicja, a w file1.h deklaracja fun2() jako funkcji &quot;zwykłej&quot;. W main.c wywołujemy fun1() i fun2(). Rezultat: wywołanie fun1() zgłasza błąd(brak definicji fun1()), fun2() realizuje ciało funkcji. Teraz z file1.h usuwamy deklarację fun2() i dopisujemy o ile potrzebne deklarację w file1.c. Podobnie w main.c wywołujemy te dwie funkcje z tym, że teraz fun2() wywołuje się z warningiem, a fun1() analogicznie jak poprzednio. <br /><br />To jest to sprytne podstawienie przez kompilator funkcji mimo braku jej deklaracji w dołączonym pliku nagłowkowym ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 22 lut 2018, o 21:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-02-22T20:27:10+01:00</updated>
<published>2018-02-22T20:27:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204380#p204380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204380#p204380"/>
<title type="html"><![CDATA[Re: static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204380#p204380"><![CDATA[
<div class="quotetitle">BarGai napisał(a):</div><div class="quotecontent"><br />Funkcja taka jest i tak niewidoczna dla innych plików, ponieważ jej deklaracja nie znajduje się w pliku nagłówkowym? Wiem, że jakiś sens tego być musi więc czego nie wiem, albo gdzie robię błąd ?<br /></div><br />Widzisz pan kompilatory są sprytne i nawet jeśli nie będzie nagłówka w pliku *.h to on spróbuje podstawić funkcję o tej samej nazwie ... wprawdzie pokaże warning że nie wie czy dobrze robi ale spróbuje. Gdy zaś funkcja będzie miała specyfikator static to nie będzie próbował <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> — 22 lut 2018, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BarGai]]></name></author>
<updated>2018-02-22T20:23:38+01:00</updated>
<published>2018-02-22T20:23:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204379#p204379</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204379#p204379"/>
<title type="html"><![CDATA[static funkcje]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20281&amp;p=204379#p204379"><![CDATA[
Witam, <br />mam pytanie które mnie nurtuje od jakiegoś czasu i dotyczy użycia słówka static w związku z funkcjami. Rozumiem, że celem takiego użycia jest swego rodzaju hermetyzacja. Funkcji takiej nie umieszczamy w pliku nagłówkowym(*.h), ponieważ nie udostępniamy jej zewnętrznym innym plikom(*.c). Użycie takiego przydomka dla funkcji jest zasadne tylko w pliku (*.c), w którym funkcje takie są wykorzystywane przez np. funkcje udostępniane przez plik nagłówkowy. Jednak tutaj pojawia się moje pytanie:<br /><br />Skoro funkcji takiej nie deklarujemy w pliku nagłówkowym, to jaki jest sens użycia static do funkcji w pliku (*.c)? Funkcja taka jest i tak niewidoczna dla innych plików, ponieważ jej deklaracja nie znajduje się w pliku nagłówkowym? Wiem, że jakiś sens tego być musi więc czego nie wiem, albo gdzie robię błąd ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15482">BarGai</a> — 22 lut 2018, o 20:23</p><hr />
]]></content>
</entry>
</feed>